R10-05.DOC

(359 KB) Pobierz
SQL Server 2000

Rozdział 10.
Pobieranie danych przy pomocy wyrażenia SELECT

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

Proste polecenia SELECT

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

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

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

FROM table_name

Ten przykład używa 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 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]

FROM employee

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

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

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

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, 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

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

Operatory arytmetyczne

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

Tak

Tak

Tak

Tak

decimal

Tak

Tak

Tak

Tak

Nie

float

Tak

Tak

Tak

Tak

Nie

...
Zgłoś jeśli naruszono regulamin