r10-06.doc

(400 KB) Pobierz
SQL Server 2000

Rozdział 10.
Pobieranie danych za pomocą wyrażenia SELECT

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).

Proste polecenia SELECT

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

FROM employee

 

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

 

(43 row(s) affected)

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

FROM employee

 

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

 

(43 row(s) affected)

Zmiana nagłówków kolumn

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

FROM table_name

W tym przykładzie używa się składni standardu ANSI:

SELECT column_name 'column_heading'

FROM table_name

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]

FROM employee

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

FROM employee

Można również zmienić wcześniejsze zapytanie, używając ANSI SQL:

 

SELECT emp_id AS EmployeeID, lname AS LastName, fname AS FirstName

FROM employee

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

--------------- ------------ -----------

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

 

(43 row(s) affected)

 

Używanie literałów

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

FROM employee

 

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

(43 row(s) affected)

Manipulacja danymi

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.

Operatory arytmetyczne

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

Tak

Tak

Tak

Tak

decimal

Tak

Tak

Tak

Tak

Nie

float

Tak

Tak

Tak

Tak

...

Zgłoś jeśli naruszono regulamin