TSQLSelect_00

Podstawowa składnia SELECT

 

Artykuł ten jest częścią serii Od 0 do TSQL którą znajdziesz tutaj.

Witamy w pierwszym epizodzie naszego kursu Od 0 do TSQL! Jak to mówią pierwsze koty za płoty, dlatego też zaczynamy!

Dzisiejszym tematem jakim się zajmiemy jest podstawowa klauzula wchodząca w skład języka TSQL, a mianowicie SELECT. Klauzula ta ściślej rzecz ujmując jest częścią tzw. Data Manipulation Language SQL czyli części języka odpowiedzialnej za pobieranie danych z bazy danych. Po przejrzeniu dokumentacji dostarczonej przez firmę Microsoft dostępnej tutaj https://msdn.microsoft.com/en-us/library/ms189499.aspx możemy dojść do wniosku, że struktura ta jest bardzo skomplikowana i zawiera ogromną ilość słów kluczowych – czy to prawda? Jak najbardziej! Dlatego samemu pobieraniu danych z wykorzystaniem SELECT poświęcimy dużą część niniejszego kursu, ponieważ stanowi ona gruntowną część, bez której zrozumienie opisywanej technologii byłoby niemożliwe.

Aby rozpocząć pracę z językiem TSQL musimy uruchomić SQL Server Management Studio (SSMS), a następnie wybrać opcję New Query(ewentualnie użyć skrótu klawiaturowego CTRL+N).  Program wyświetli nam okno logowania takie ja na poniższym zrzucie ekranowym.

ObjectExplorerLogin

W sekcji Server name powinniśmy podać adres serwera – w przypadku gdy serwer znajduje się na naszym komputerze możemy wpisać localhost lub po prostu znak kropki “.“. W zależności od ustawień serwera możemy zalogować się używając naszego użytkownika systemowego lub podać Login i hasło.

W rezultacie tych działań powinniśmy otrzymać puste okno pozwalające wpisywać komendy języka TSQL. Aby nasze zapytanie odwoływało się do właściwej bazy danych z listy rozwijanej musimy wybrać bazę Northwind tak jak zostało to przedstawione na poniższym zrzucie ekranowym.

ChangeDatabaseInSSMS

Aby przełączyć aktywną bazę danych można również użyć samego języka TSQL, a właściwie klauzuli USE zgodnie z poniższym wzorcem.

USE database_name
GO

gdzie jak sama nazwa wskazuje powinniśmy wstawić nazwę bazy danych do której chcemy się podłączyć. Podłączmy się zatem do bazy Northwind.

USE Northwind
GO

W powyższym zapytaniu możemy również dostrzec inne słowo kluczowe – GO.  Słowo to jest przeznaczone do oddzielania poszczególnych batchy czyli grup komend, które chcemy wykonywać w jednym zestawie. Ważne jest to, żeby zapamiętać, że słowo GO nie jest elementem języka TSQL, a ustawieniem narzędzia klienckiego (w tym wypadku Management Studio), które można w każdym  momencie zmienić.

Jak już jesteśmy podłączeni do właściwej bazy danych możemy wykonać nasze pierwsze zapytanie. Zanim jednak to zrobimy przyjrzyjmy się jego składni:

SELECT 
	fields
FROM
	table_name

Gdzie fields  zastępujemy nazwą pola (pól), które chcemy wyświetlić, a table_name nazwą tabeli w której pożądane pola się znajdują. W tym momencie może się pojawić pytanie skąd wiem jakie tabele i jakie pola mamy do dyspozycji? Dowiedzieć się tego możemy na kilka sposobów na ten moment nauczymy się jednego z nich – z wykorzystaniem graficznego interfejsu użytkownika Management Studio. Wiele rzeczy związanych z naszą bazą danych możemy podejrzeć z wykorzystaniem okna Object Explorer. Okno to powinno się być włączone i znajdować się w lewej części ekranu. Jeżeli jest inaczej to okno to możemy włączyć wybierając z głównego menu View -> Object Explorer.

ObjectExplorerJak widać na załączonym zrzucie ekranowym możemy również kliknąć F8 aby pożądane okno się pojawiło. Gdy okno eksploratora obiektów jest dostępne poprosi nas ono o zalogowanie się do serwera (ze względu na fakt, iż SSMS wykorzystuje osobne połączenie dla Object Explorera i dla okna zapytań) – zróbmy to zgodnie ze sposobem podłączenia się do serwera przekazanego powyżej.  Gdy okno Object Explorer jest już dostępne możemy rozwinąć węzeł serwera do którego się podłączyliśmy następnie Databases i znajdujemy bazę danych Northwind. W ramach tej bazy możemy rozwinąć węzeł Tables aby podejrzeć jakie tabele są dostępne w ramach tej bazy danych. Oczywiście możemy zejść jeszcze niżej (rozwijając zakładkę Columns) aby podejrzeć jakie atrybuty mamy do dyspozycji w ramach określonej tabeli, tak jak zostało to przedstawione na poniższym zrzucie.

AvailableColumnsInTableW tym momencie wiemy jakie tabele i pola mamy do dyspozycji. Napiszmy w oknie zapytania następującą komendę:

SELECT 
	FirstName,
	LastName
FROM
	Employees

Nazwę pól i tabeli możemy wpisać ręcznie lub też używając metody przeciągnij upuść. Aby otrzymać rezultat poniższego zapytania należy kliknąć przycisk Execute dostępny z paska lub nacisnąć F5. Zapytanie zostanie przesłane do silnika bazy danych i po chwili rezultat powinien ukazać się w dolnej części ekranu tak jak poniżej na zakładce Results.

ResultDo dyspozycji mamy również zakładkę Messages z komunikatami związanymi z otrzymanym rezultatem.

MessagesOkno to jest użyteczne w przypadku gdy popełnimy błąd w naszym zapytaniu. Mechanizm sprawdzający poprawność składniową naszego zapytania zwraca komunikaty błędu właśnie poprzez zakładkę Messages – dla przykładu wykonajmy poniższe zapytanie.

SELECT 
	FirstNa,
	LastName
FROM
	Employees

Jak widać popełniliśmy literówkę i zamiast FirstName wpisaliśmy FirstNa – po wykonaniu tego zapytania nie otrzymamy już zakładki Results, a jedynie błąd w Messages:

Error_exampleKomunikat błędu wskaże nam gdzie znajduje się jaki błąd. Oczywiście w przypadku tak prostego zapytania błędy są proste w interpretacji – w późniejszym okresie będzie można odnotować fakt, iż komunikaty błędów niekoniecznie są łatwe w interpretacji. Co ciekawe błąd taki oczywiście możemy skopiować z okna messages (podobnie jak cały rezultat) dodatkowo w razie potrzeby możemy również używać tego okna jak notatnika i zapisywać własne notatki.

W tym momencie potrafimy napisać proste zapytanie wybierające kolumny z określonej tabeli. Można zdawać sobie sprawę, że w realnych systemach produkcyjnych tabele mogą zawierać dużo więcej atrybutów – czy musimy każdy atrybut wpisywać “z ręki” albo pojedynczo przeciągać? Odpowiedź oczywiście brzmi “nie”. Istnieje specjalny symbol gwiazdki “*”, który oznacza nic innego jak wszystkie atrybuty. Wykonajmy np. poniższe zapytanie:

SELECT 
	*
FROM
	Employees

jako rezultat zgodnie z oczekiwaniami otrzymaliśmy wszystkie kolumny z tabeli Employees.

SQLResult

Alternatywą dla użycia gwiazdki jest przeciągnięcie z Object Explorera folderu Columns w danej tabeli – dzięki temu SSMS wstawi do zapytania nazwy wszystkich kolumn. Należy jednak zdawać sobie sprawę, że nasze zapytania powinny zawsze zwracać tylko tyle kolumn ile naprawdę potrzebujemy, dzięki temu SQL Server będzie mógł pobrać dane w wydajniejszy sposób. Jeżeli potrzebujemy wszystkich kolumn to nie używajmy gwiazdki, a wypiszmy jawnie wszystkie kolumny.

W takim razie znamy już parę faktów związanych z pobieraniem danych, co jednak jeżeli chcemy aby w naszym rezultacie kolumny nazywały się inaczej niż w tabeli? Dla przykładu w naszym pierwszym zapytaniu mamy imię i nazwisko i chcemy zamiast pól FirstName i LastName nazwać je odpowiednio Name i Surname? Nic bardziej prostszego – mamy do dyspozycji aliasy. Aby podstawić alias pod nazwę kolumny wystarczy po jej zdefiniowaniu użyć słowa kluczowego AS i podać alias taki jak chcemy – dokładnie tak jak zostało to przedstawione poniżej.

SELECT 
	FirstName AS Name,
	LastName AS Surname
FROM
	Employees

W rezultacie otrzymamy wynik taki jakiego się spodziewaliśmy:

ResultAlternatywnie nie musimy w ogóle używać słowa kluczowego AS tylko wpisać alias (jak zostało przedstawione niżej – jednak polecamy zawsze stosować pełną składnie, która jest bardziej przejrzysta i bardzo pomaga w późniejszym odczytywaniu kodu.

SELECT 
	FirstName Name,
	LastName Surname
FROM
	Employees

Warto pamiętać żeby nie używać jako nazw kolumn, obiektów czy aliasów słów kluczowych języka TSQL – może to powodować liczne problemy. Skąd będziemy wiedzieć czy dane słowo jest kluczowe dla TSQL? Między innymi po tym, że SSMS będzie podkreślało dane słowo kolorem tak jak inne słowa klucze. Jeżeli jednak musimy użyć tego słowa lub np. nasz alias posiada w sobie spację to możemy użyć kwadratowych nawiasów tak jak poniżej.

SELECT 
	FirstName [Name With Space],
	LastName [KEY is keyword]
FROM
	Employees

Jeżeli chcemy być purystami w pisaniu zapytań możemy również używać kwadratowych nawiasów w stosunku do każdego obiektu czy też atrybutu używanego w naszym zapytaniu.

Ostatnim zagadnieniem jakie poruszymy w ramach niniejszego epizodu jest wyświetlanie tylko unikalnych rekordów. Dla przykładu chcemy wyświetlić stanowiska jakie zajmują nasi pracownicy posłuży temu poniższe zapytanie.

SELECT 
	Title
FROM
	Employees

Jednak w rezultacie otrzymujemy wpisy dla każdego pojedynczego pracownika, a co za tym idzie również duplikaty.

ResultJeżeli chcemy otrzymać tylko unikalny zestaw pól wystarczy, że zaraz po słowie SELECT napiszemy słowo kluczowe DISTINCT.

SELECT DISTINCT
	Title
FROM
	Employees

w rezultacie otrzymamy pożądany wynik

ResultMoże tutaj pojawić się pokusa żeby używać tego słowa kluczowego w każdym zapytaniu, jednak nie jest to najlepszy pomysł. Powinniśmy używać DISTINCT tylko wtedy gdy tego potrzebujemy ze względu na fakt, iż jest to kolejna operacja dla silnika do wykonania co może spowolnić nasze zapytania. Ponadto niejednokrotnie informacja o tym, że coś jest takie samo, czy tez zduplikowane niekoniecznie jest złe, jest wręcz pożądane o czym jeszcze na pewno w ramach niniejszego kursu uda się napisać.

Słowem kluczowym DISTINCT zakończymy niniejszy epizod, a jednocześnie zrobimy krótki wstęp do kolejnego artykułu traktującego o filtrowaniu danych – ZAPRASZAM.

Spis dostępnych artykułów w ramach sesji znajdziesz tutaj.

3 Comments

  1. Warto jeszcze wspomnieć o możliwości zasięgnięcia informacji na temat danego obiektu bazodanowego przy wykorzystaniu procedury sp_help. Można to zrobić dość wygodnie: najpierw w kodzie T-SQL należy zaznaczyć nazwę danego obiektu, a następnie nacisnąć kombinację klawiszy ALT + F1 (domyślny skrót w SSMS).

  2. Piotr – dzięki za wskazówkę! Podsunąłeś pomysł na przygotowanie artykułu o optymalizacji pracy z SSMS:)

  3. Fajnie że od razu przy omawianiu klauzuli DISTINCT uprzedziłeś aby jej nie nadużywać ze względu na spadek wydajności zapytania. O tym zwykle nie pisze się w kursach dla osób początkujących, pozostawiając te sprawy dla tutoriali zaawansowanych (optymalizacja zapytań). Podobnie z sortowaniem wyników zwróconych przez zapytanie. Rzadko znajduję wzmiankę aby nie sortować takich wyników gdy nie jest to konieczne. Zatem warto zrobić tak jak tu, że “przemycić” krótką wiadomość o elementarnej optymalizacji danego zapytania. Nie przytłoczy to czytelnika nadmiarem wiadomości, a przynajmniej na bieżąco będzie go uczyć dobrych praktyk przy pisaniu kodu SQL.

Leave a Reply