Kiedy w bazie danych są już informacje, nadszedł czas na wytłumaczenie jak pobierać dane z bazy i wykonywać ich modyfikacje w bazie. Niniejszy rozdział rozpoczyna się omówieniem prostego wyrażenia i sposobu pobierania określonych kolumn. Następnie na podstawie prostego wyrażenia SELECT zostaną omówione techniki manipulacji danymi i konwersji danych. Kolejnym zagadnieniem będzie wybieranie informacji z określonych wierszy w tablicy i eliminowanie podwójnych danych. Rozdział kończy się nauką stosowania zaawansowanych zapytań tj. zapytań zagnieżdżonych, łączeń i korelacji danych.
Niniejszy rozdział jest dość długi ale bardzo istotny. SQL jest fundamentalnym językiem używanym prawie we wszystkich systemach zarządzania relacyjnymi bazami danych. Inaczej mówiąc, omówione tutaj wyrażenia mogą być stosowane z niewielkimi modyfikacjami w dowolnej bazie. Na początek omówienie prostego polecenia SELECT.
SQL Server obsługuje zarówno standard ANSI’92 jak i własny Microsoft SQL Server 2000, który w tej książce nazywany jest Transact-SQL (T-SQL).
W celu pobrania informacji z bazy danych można tworzyć zapytania przy pomocy SQL Server Query Analyzer w SQL Server Enterprise Managerze lub poza nim, jak również przy pomocy narzędzia wiersza poleceń osql. Można również używać innych narzędzi, włączając w to program MSQuery i narzędzie SQL Server English Query. Dostępne są również narzędzia innych producentów. W tej książce przykłady będą oparte na aplikacji SQL Server Query Analyzer.
Polecenie SELECT ma trzy podstawowe składniki: SELECT, FROM i WHERE. Podstawowa składnia wygląda następująco:
SELECT column_list
FROM table_list
WHERE search_criteria
Pierwszy wiersz (SELECT) określa kolumny, z których mają być pobrane dane. Warunek FROM określa tablice, z których mają być pobierane kolumny. Warunek WHERE ogranicza ilość wierszy zwracanych przez zapytanie.
Pełna składnia polecenia SELECT przedstawia się następująco:
SELECT [ALL|DISTINCT] [ TOP n [PERCENT] [ WITH TIES]]
select_list
[ INTO new_table ]
[ FROM table_sources]
[ WHERE search_condition]
[ GROUP BY [ALL] group_by_expression [,...n]
[ WITH { CUBE | ROLLUP } ]]
[ HAVING search_condition ]
[ ORDER BY { column_name [ASC | DESC ] } [,...n] ]
[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n] [ BY expression [,...n] ]
[ FOR BROWSE ] [ OPTION (query_hint [,...n]) ]
Zapytanie SELECT * FROM table_name jest najbardziej podstawowym zapytaniem. Używanie symbolu (*) powoduje pobranie wszystkich kolumn z tablicy. W SQL Serverze, * jest zamieniana na listę wszystkich kolumn tablicy.
W bazie danych pubs można uruchomić następujące zapytanie aby wybrać wszystkie kolumny i wiersze z tablicy employee:
SELECT *
FROM employee
emp_id fname minit lname job_id job_lvl
--------- -------------------- ----- ------------------------------
PMA42628M Paolo M Accorti
PSA89086M Pedro S Afonso
VPA30890F Victoria P Ashworth
H-B39728F Helen Bennett
L-B31947F Lesley Brown
F-C16315M Francisco Chang
[...] [...]
GHT50241M Gary H Thomas
DBT39435M Daniel B Tonini
(43 row(s) affected)
Aby wybrać określone kolumny, należy oddzielić każdą kolumnę przecinkiem (,). Jednak, nie należy umieszczać przecinka po ostatniej kolumnie:
SELECT column_name [, column_name...]
FROM table_name
Następujące zapytanie pobiera imiona, nazwiska i identyfikatory pracowników (ID) dla każdego pracownika z tablicy employee:
SELECT fname, lname, emp_id
fname lname emp_id
------------- -------------- ---------
Paolo Accorti PMA42628M
Pedro Afonso PSA89086M
Victoria Ashworth VPA30890F
Helen Bennett H-B39728F
Lesley Brown L-B31947F
Francisco Chang F-C16315M
[...] [...] [...]
Gary Thomas GHT50241M
Daniel Tonini DBT39435M
Kiedy zostaje uruchomione zapytanie SELECT *, kolejność kolumn jest taka sama jak ich kolejność jaka została określona w poleceniu CREATE TABLE. Jeżeli pobiera się kolumny z tablicy, kolejność column_list nie musi być taka sama jak kolejność kolumn w tablicy. Można zmienić kolejność kolumn w wynikach zapytania poprzez inne podanie kolumn w parametrze column_list.
Można zmienić kolejność wyświetlanych kolumn z poprzedniego zapytania. Zwracana jest ta sama informacja, ale wyświetlana jest w innej kolejności kolumn:
SELECT emp_id, lname, fname
emp_id lname fname
------------- -------------- -----------
PMA42628M Accorti Paolo
PSA89086M Afonso Pedro
VPA30890F Ashworth Victoria
H-B39728F Bennett Helen
L-B31947F Brown Lesley
F-C16315M Chang Francisco
GHT50241M Thomas Gary
DBT39435M Tonini Daniel
W wyświetlanych wynikach nagłówki kolumn są nazwami, które zostały użyte w column_list. Aby nie używać nie zawsze zrozumiałych nazw, takich jak lname, fname, można nadać kolumnom bardziej czytelne nagłówki (FirstName i LastName) poprzez wprowadzenie aliasów nagłówków kolumn. Można skorzystać ze składni SQL Server 2000 lub składni American National Standards Institute Structured Query Language (ANSI SQL).
Można stworzyć aliasy kolumn w SQL Serverze na dwa sposoby. Pierwszy sposób skorzysta ze składni SQL Server 2000:
SELECT column_heading = column_name
Ten przykład używa składni standardu ANSI:
SELECT column_name 'column_heading'
Jeżeli
Początek wskazówki
używany alias zawiera spacje lub jest słowem kluczowym SQL Servera, należy ująć alias w pojedynczy cudzysłów lub nawiasy kwadratowe oznaczające identyfikator SQL Servera. Następujący przykład korzysta ze spacji i nawiasów kwadratowych:
SELECT lname AS 'Last Name', fname AS [First Name]
Następujący przykład używa słowa kluczowego SQL:
SELECT 'count' = Count(*)
FROM
Koniec wskazówki
employee
Można poprawić wcześniejsze zapytanie używając następującego polecenie SQL Servera 2000:
SELECT EmployeeID = emp_id, LastName = lname, FirstName = fname
Można również zmienić wcześniejsze zapytanie używając ANSI SQL:
SELECT emp_id AS EmployeeID, lname AS LastName, fname AS FirstName
Słowo kluczowe AS nie jest wymagane. Przykładowo, następujące wyrażenie zwraca takie same informacje jak poprzednie zapytanie:
SELECT emp_id EmployeeID, lname LastName, fname FirstName FROM employee
Obydwa zapytania zwracają takie same wyniki:
EmployeeID LastName FirstName
--------------- ------------ -----------
Aby wyniki były bardziej czytelne można używać literałów. Literał (stała znakowa)jest ciągiem znaków ujętym w pojedynczy lub podwójny cudzysłów, włączonym do column_list i wyświetlanym jako dodatkowa kolumna w wynikach zapytania. W zbiorze wynikowym, etykieta jest umieszczana w kolumnie obok wartości pobranych z bazy.
Składnia zawierająca wartości literału jest następująca:
SELECT 'literal' [, 'literal'...]
Następujące zapytanie zwraca imię, nazwisko i kolumnę zawierającą ciąg literałów: Employee ID, oraz identyfikator ID dla wszystkich pracowników z tablicy employee:
SELECT fname, lname, 'EmployeeID:', emp_id
FirstName LastName emp_id
-------------------- ------------------------- ---------
Paolo Accorti EmployeeID: PMA42628M
Pedro Afonso EmployeeID: PSA89086M
Victoria Ashworth EmployeeID: VPA30890F
Helen Bennett EmployeeID: H-B39728F
Lesley Brown EmployeeID: L-B31947F
Francisco Chang EmployeeID: F-C16315M
Gary Thomas EmployeeID: GHT50241M
Daniel Tonini EmployeeID: DBT39435M
Można manipulować danymi w wynikach zapytania aby wyprodukować nowe kolumny, które wyświetlają obliczone dane, nowe wartości ciągów znaków, skonwertowane daty i wiele innych. Można manipulować wynikami zapytań przy pomocy operatorów arytmetycznych, funkcji matematycznych, funkcji znakowych, funkcji daty i czasu oraz funkcji systemowych. Można również skorzystać z funkcji CONVERT aby przekształcić dane jednego typu w inny w celu łatwiejszej manipulacji.
Można używać operatorów arytmetycznych dla następujących typów danych: bigint, int, smallint, tinyint, numeric, decimal, float, real, money i smallmoney. Tabela 10.1. pokazuje operatory arytmetyczne i typy danych jakie mogą być z nimi używane.
Tabela 10.1. Typy danych i operatory arytmetyczne
Typ danych
Dodawanie
+
Odejmowanie
-
Dzielenie
/
Mnożenie
*
Modulo
%
bigint
Tak
decimal
Nie
float
Infesto