Jeśli w bazie danych są już informacje, to nadszedł czas na wytłumaczenie, jak pobierać dane z bazy i wykonywać ich modyfikacje w bazie. Niniejszy rozdział rozpoczyna się od omówienia prostego wyrażenia SELECT i sposobu pobierania określonych kolumn. Następnie na podstawie tego wyrażenia zostaną omówione techniki manipulacji danymi i ich konwersji. 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.
Ten rozdział jest dość długi, ale bardzo istotny. SQL jest fundamentalnym językiem, który jest używany prawie we wszystkich systemach zarządzania relacyjnymi bazami danych. Inaczej mówiąc, przedstawione 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 za pomocą SQL Server Query Analyzera w SQL Server Enterprise Managerze lub poza nim, jak również za pomocą narzędzia wiersza poleceń osql. Można również używać innych narzędzi, łącznie z programem MSQuery i narzędziem SQL Server English Query. Dostępne są także narzędzia innych producentów. Przykłady w tej książce będą się odwoływać do 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) oznacza kolumny, z których mają być pobrane dane. Warunek FROM określa tablice, z których mają być pobierane kolumny. Warunek WHERE ogranicza liczbę 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]) ]
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, trzeba oddzielić każdą z nich przecinkiem (,).Nie należy umieszczać przecinka po ostatniej kolumnie:
SELECT column_name [, column_name...]
FROM table_name
Następujące zapytanie powoduje pobranie imion, nazwisk i identyfikatorów 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 ta, która została określona w poleceniu CREATE TABLE. Jeżeli pobiera się kolumny z tablicy, kolejność column_list nie musi być taka sama, jak 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 kolumny wyświetlane są w innej kolejności:
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 stosować 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 Servera 2000 lub składni American National Standards Institute Structured Query Language (ANSI SQL).
W SQL Serverze można stworzyć aliasy kolumn na dwa sposoby. W pierwszym korzysta się ze składni SQL Servera 2000:
SELECT column_heading = column_name
W tym przykładzie używa się 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 go ująć w pojedynczy cudzysłów lub nawiasy kwadratowe, oznaczające identyfikator SQL Servera. W następującym przykładzie korzysta się ze spacji i nawiasów kwadratowych:
SELECT lname AS 'Last Name', fname AS [First Name]
W kolejnym przykładzie użyte jest słowo kluczowe SQL:
SELECT 'count' = Count(*)
FROM
Koniec wskazówki
employee
Można poprawić wcześniejsze zapytanie i użyć następującego polecenia 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 powoduje zwrócenie takich samych informacji, jak poprzednie zapytanie:
SELECT emp_id EmployeeID, lname LastName, fname FirstName FROM employee
Obydwa zapytania powodują zwrócenie takich samych wyników:
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, który jest włączony do column_list i wyświetlany jako dodatkowa kolumna w wynikach zapytania. W zbiorze wynikowym etykieta jest umieszczana w kolumnie obok wartości, jakie zostały pobrane z bazy.
Składnia zawierająca wartości literału jest następująca:
SELECT 'literal' [, 'literal'...]
Poniższe zapytanie powoduje zwrócenie imienia, nazwiska i kolumny, która zawiera ciąg literałów: Employee ID oraz identyfikatora ID 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, w których wyświetlane są obliczone dane, nowe wartości ciągów znaków, skonwertowane daty i wiele innych. Można manipulować wynikami zapytań za pomocą operatorów arytmetycznych, funkcji matematycznych, znakowych, 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 do 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
...
lukaszwalda