Podstawy języka SQL -

Podobne dokumenty
SQL - Structured Query Language. strukturalny język zapytań

3. Podzapytania, łączenie tabel i zapytań

Systemy GIS Tworzenie zapytań w bazach danych

Język SQL. Rozdział 2. Proste zapytania

NORTHWIND. Anonco.pl. ćwiczenia praktyczne. KiK s Tutorials. NORTHWIND dwiczenia praktyczne. ANONCO.PL/SQL SQLSERVERDLAOPORNYCH.WORDPRESS.

Przestrzenne bazy danych Podstawy języka SQL

SQL (ang. Structured Query Language)

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Autor: Joanna Karwowska

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Wykład 6. SQL praca z tabelami 3

Laboratorium Bazy danych SQL 2

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Autor: Joanna Karwowska

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

Podstawowe zapytania SELECT (na jednej tabeli)

8.9. Język SQL Kwerenda wybierająca w języku SQL

PODZAPYTANIE (SUBSELECT)

Microsoft SQL Server Podstawy T-SQL

Paweł Rajba

Relacyjne bazy danych. Podstawy SQL

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Podstawy języka SQL cz. 2

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

Autor: Joanna Karwowska

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Wprowadzenie do języka SQL

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

Wstęp Wprowadzenie do BD Podstawy SQL. Bazy Danych i Systemy informacyjne Wykład 1. Piotr Syga

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Współczesne systemy baz danych

Współczesne systemy baz danych

Grupowanie i funkcje agregacji. Grupowanie z użyciem rollup

Bazy danych 2. Wykład 4 Structured Query Language (SQL)

Zadania z SQLa (MS SQL Server)

Relacyjne bazy danych. Podstawy SQL

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Podstawy języka SQL Co to jest SQL? Możliwości SQL SQL*Plus

Wykład 5. SQL praca z tabelami 2

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

Projekt jest finansowany ze środków Unii Europejskiej, Europejskiego Funduszu Społecznego i budŝetu państwa. Studia Podyplomowe dla Nauczycieli

Wprowadzenie do baz danych

Grupowanie i funkcje agregacji

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

SIECI KOMPUTEROWE I BAZY DANYCH

Marek Rakowski Podstawy zdania SELECT Strona 1 z 12

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Indeksowanie w bazach danych

Podzapytania. SELECT atrybut_1, atrybut_2,... FROM relacja WHERE atrybut_n operator (SELECT atrybut_1, FROM relacja WHERE warunek

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Tworzenie zapytań do Microsoft SQL Server

Technologie baz danych

Kwerendy (zapytania) wybierające

Bazy danych - wykład wstępny

Ćwiczenie zapytań języka bazy danych PostgreSQL

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Aliasy Select p.first_name, p.salary, j.job_title from employees p, jobs j where p.job_id=j.job_id;

Łączenie wyników zapytań w SQL

Wykład 8. SQL praca z tabelami 5

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

SQL praca z tabelami 4. Wykład 7

SQL Structured Query Language

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Grupowanie i funkcje agregujące

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Złączenie CROSS JOIN jest to tzw. złączenie krzyżowe, którego ogólna postać wygląda następująco:

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

10. Wybierz nazwy produktów oraz inf. o stanie magazynu dla produktów dostarczanych przez firmę.tokyo Traders.

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

Bazy danych SQL Server 2005

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

E.14 Bazy Danych cz. 13 SQL Grupowanie danych i funkcje grupujące

Marek Rakowski Zdanie SELECT wybieranie danych z wielu tabel Strona 1 z 6

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy danych wykład trzeci. Konrad Zdanowski

ACESS- zadania z wykorzystaniem poleceń SQL

Wykład 4. SQL praca z tabelami 1

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Język SQL podstawy zapytań

Bazy danych Access KWERENDY

Specyfika języka SQL powoduje, że łatwiej jest najpierw wytłumaczyć, jak korzystać z funkcji grupujących, a dopiero później jak grupować dane.

Plan. Łączenie danych z wielu tabel złączenia JOIN suma zbiorów - UNION Użycie aliasów dla nazw tabel

Bazy danych 7. SQL podstawy

Bazy Danych. SQL Podstawy języka II: zapytania. Krzysztof Regulski WIMiIP, KISiM, B5, pok. 408

Transkrypt:

Podstawy języka SQL - Wstęp do DML - Instrukcja Select Składnia SELECT [predykat] { * tabela.* [tabela.]pole1 [AS alias1] [, [tabela.]pole2 [AS alias2] [,...]] [LIMIT ( n ALL )] [OFFSET n]} FROM tabela/e [,...] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] Klauzula SELECT Określenie pól w zapytaniu predykat: ALL (wartość domyślna) oznacza, że zwrócone zostaną wszystkie wybrane wiersze, DISTINCT oznacza, że z wyniku zostaną usunięte duplikaty wybranych wierszy, TOP (SQL Server) oznacza, że zwrócona zostanie tylko określona liczba wierszy, PERCENT pozwala na względne określenie liczby zwracanych wierszy. Jeżeli użyto znacznika PERCENT, wartość n musi należeć do zakresu <0,100>, WITH TIES oznacza, że zostaną zwrócone wszystkie wiersze, których wartość kolumny wymienionej w klauzuli ORDER BY będzie równa najmniejszej wartości wiersza wyniku. Jeżeli na przykład wybieramy 5 towarów o najwyższej marży, a w tabeli znajduje się 7 towarów o tej samej, najwyższej marży, zapytanie zwróci 7, a nie 5 wierszy, LIMIT (PostgreSOL) jest odpowiednikiem klauzuli TOP, OFFSET określa, ile wierszy zostanie pominiętych, zanim zwrócony zostanie pierwszy wiersz wyniku. * Wskazuje, iż wybrane mają być wszystkie pola z podanej tabeli lub tabel. tabela Nazwa tabeli zawierającej pola, które składają się na rekordy będące rezultatem instrukcji. pole1, pole2 Nazwy pól zawierających dane, które mają być pobrane. Jeśli podano kilka pól, są one pobierane w kolejności podanej na liście. alias1, alias2 Nazwy, które zostaną użyte jako nagłówki kolumn w miejsce nazw kolumn z tabeli. Tabela/e Nazwa tabeli lub tabel zawierających pobierane dane.

Słowo kluczowe AS przy definiowaniu aliasu w większości implementacji serwera można pominąć. Klauzula FROM Określa, z których obiektów będą pobierane dane źródłowe W klauzuli FROM możemy odwołać się do dowolnej liczby obiektów tabel, widoków, funkcji tabelarycznych czy wyników podzapytań. Z reguły łączy się obiekty na podstawie wartości wspólnego atrybutu, na przykład wartości pary klucz podstawowy klucz obcy. W takim przypadku musimy użyć jednoznacznego identyfikatora obiektu (kolumny). Ponieważ nazwy kolumn zawierających klucz podstawowy i obcy najczęściej są takie same, musimy poprzedzać nazwy kolumn nazwami tabel. Jeżeli dodatkowo stosujemy konwencję,w myśl której poprzedzamy nazwy obiektów nazwą ich właściciela, zapytanie wybierające dane z kilku obiektów staje się mało czytelne. Rozwiązaniem tego problemu są aliasy. Składnia: [FROM {< zlgczona_tabela >} [,...n]] < zlgczona_tabela > ::= < tabela > < typ_zlgczenia > < tabela > OR < warunek > USING (kolumna,...n) < tabela > CROSS JOIN < tabela > < zlgczona_tabela > < typ_zlgczenia > ::= [INNER {{LEFT RIGNT FULL} [OUTER]}] [< dyrektywa >] JOIN przez posortowanie wierszy, wyeliminowanie duplikatów oraz wykorzystanie aliasów i literałów: gdzie: CROSS JOIN określa, że wynik będzie obliczony jako iloczyn kartezjański złączonych tabel, Minimalną liczbę warunków użytych do łączenia tabel można wyliczyć ze wzoru: minimalna liczba warunków = liczba złączonych tabel 1. INNER JOIN określa, że wynik będzie obliczony jako złączenie naturalnie złączonych tabel. Wynikiem złączenia naturalnego są tylko te wiersze, dla których w użytych do powiązania kolumnach zapisane były te same wartości, LEFT OUTER JOIN określa, że wynik będzie zawierał wszystkie wiersze z lewej tabeli, a z prawej tabeli wyłącznie te wiersze, dla których w użytych do powiązania kolumnach zapisane były te same wartości, RIGHT OUTER JOIN określa, że wynik będzie zawierał wszystkie wiersze z prawej tabeli, a z lewej tabeli wyłącznie te wiersze, dla których w użytych do powiązania kolumnach zapisane były te same wartości. Złączenie prawostronne jest rzadko stosowane przez osoby

przyzwy czajone do czytania od strony lewej do prawej, FULL OUTER JOIN określa, że wynik będzie zawierał wszystkie wiersze z obu złączonych tabel, Operacja INNER JOIN może być użyta w dowolnej klauzuli FROM. Jest to najczęściej występujący typ sprzężenia. Sprzężenia wewnętrzne łączą rekordy z dwóch tabel, jeśli w polu wspólnym dla obu tabel znajdują się odpowiadające sobie wartości. SELECT pola FROM tabela_1 INNER JOIN tabela_2 ON tabela_1.pole_1 op_por tabela_2.pole_1 AND ON tabela_1.pole_2 op_por tabela_2.pole_2) OR ON tabela_1.pole_3 op_por tabela_2.pole_3)]; SELECT pola FROM tabela_1 INNER JOIN (tabela_2 INNER JOIN [( ] tabela_3 [INNER JOIN [( ] tabela_x [INNER JOIN...)] ON tabela_3.pole_3 op_por tabela_x.pole_x)] ON tabela_2. pole_2 op_por tabela_3.pole_3) ON tabela_1. pole_1 op_por tabela_2.pole_2; Operacje LEFT JOIN i RIGHT JOIN mogą być zagnieżdżone wewnątrz operacji INNER JOIN, lecz operacja INNER JOIN nie może być zagnieżdżona wewnątrz operacji LEFT JOIN lub RIGHT JOIN. FROM tabela_1 [ LEFT RIGHT ] JOIN tabela_2 ON tabela_1.pole_1 op_por tabela_2.pole_2 Operacja LEFT JOIN służy do tworzenia sprzężenia rozszerzonego lewego. Sprzężenia rozszerzone lewe włączają wszystkie rekordy z pierwszej (lewej) z dwóch tabel, nawet jeśli w rekordach z drugiej (prawej) tabeli nie istnieją odpowiadające im wartości. Operacja RIGHT JOIN służy do tworzenia sprzężenia rozszerzonego prawego. Sprzężenia rozszerzone prawe włączają wszystkie rekordy z drugiej (prawej) z dwóch tabel, nawet jeśli w rekordach pierwszej (lewej) tabeli nie istnieją odpowiadające im wartości. SELECT Typy_zatrudnienia.Typ_zatrudnienia, PRACOWNICY.IMIĘ, PRACOWNICY.NAZWISKO, PRACOWNICY.[KOD DZIAŁU] FROM Typy_zatrudnienia INNER JOIN PRACOWNICY ON Typy_zatrudnienia.min_liczba_godzin <=PRACOWNICY.[CZAS PRACY] AND Typy_zatrudnienia.max_liczba_godzin >= PRACOWNICY.[CZAS PRACY] Klauzula WHERE Określa, które wiersze zostaną zwrócone przez zapytanie. Składnia:

[WHERE < warunekwybierania > < złqczenie_starego_typu >] < złqczenie_starego_typu > nazwajkolumny (* = = *) nazwa_kolumny < warunekwybierania > ::= ( [NOT] < predykat > (< warunekwybierania >)) [(AND OR) [NOT] (< predykat > (< warunek_ wybierania >))] [,..."] < predykat > : := ( wyrażenie ( = < >! = > > =! > < < =! <) wyrażenie wyrażenie_znakowe [NOT] LIKE wyrażenie_znakowe } [ESCAPE 'wzorzec'] j wyrażenie [NOT] BETWEEN wyrażenie AND wyrażenie [ wyrażenie IS [NOT] NULL wyrażenie [NOT] IN (podzapytanie wyrażenie.. (ALL SOHE [ ANY) [podzapytanie) EXISTS [podzapytanie) gdzie: złqczenie_starego_ typu jest niestandardowym określeniem warunków złączenia tabel. Symbol * = odpowiada złączeniu lewostronnemu, symbol =* prawostronnemu, predykat jest wyrażeniem o wartości 1 (prawda), 0 (fałsz) lub UNKNOWN, Język SQL nie nakłada żadnych ograniczeń na liczbę argumentów wyszukiwania wymienionych w klauzuli WHERE. W zależności od rodzaju kryteriów i typu wyszukiwanych danych możemy skorzystać z: 1. Operatorów porównania jeżeli chcemy sprawdzić, czy wartość zapisana w tabeli odpowiada wartości warunku wyszukiwania. Aby na przykład wybrać nazwiska i nazwy miast pracowników ze Stanów Zjednoczonych urodzonych przed 1 sierpnia 1955 roku, napiszemy: SELECT lastname, city FROM employees WHERE country = 'USA' AND BirthDate <'8/l/55'; 2. Operatora LIKE jeżeli chcemy sprawdzić zgodność tekstu z podanym wzorcem. Operator LIKE może zostać użyty dla danych tekstowych, binarnych oraz daty i czasu. Operator LIKE dopuszcza stosowanie następujących sym- boli wieloznacznych: a) % odpowiada dowolnemu ciągowi znaków o dłu- gości równej 0 lub większej, b) odpowiada dowolnemu pojedynczemu znakowi, c)[ ] odpowiada pojedynczemu znakowi z określonego zbioru lub zakresu, d)[ A ] odpowiada pojedynczemu znakowi nienależą-cemu do określonego zbioru lub zakresu.

Na przykład aby wyświetlić nazwy firm zawierające w swej nazwie słowo Restaurant, których nazwiska przedstawicieli zaczynają się na literę M, napiszemy: SELECT companyname FROM customers WHERE companyname LIKE '"irestaurantv AND ContactHame LIKE 3. Operatorów logicznych jeżeli chcemy połączyć kilka warunków wyszukiwania. Na przykład aby wyświetlić informacje o tych towarach, których nazwy nie zaczynają się na literę T lub R lub zostały dostarczone przez dostawcę o identyfikatorze równym 21 i jednocześnie kosztowały mniej niż 15 $, napiszemy: SELECT productname, supplierid, unitprice FROM products WHERE [productname NOT LIKE 'ff AND productname NOT LIKE 'RH') OR [supplierid = 21 AND unitprice < 15.00); 4. Operatora BETWEEN... AND jeżeli chcemy sprawdzić, czy wartość zapisana w tabeli należy (lub nie) do określonego przedziału zamkniętego. Na przykład aby wyświetlić nazwy towarów, których cena nie należy do przedziału <5,55>, napiszemy: SELECT productname FROM products WHERE unitprice NOT BETWEEN 5 AND 55; 5. Operatora IN jeżeli chcemy sprawdzić, czy wartość zapisana w tabeli należy do określonego zbioru. Na przykład aby wyświetlić nazwy firm ze Stanów lub Włoch, napiszemy: SELECT companyname, country FROM suppliers WHERE country IN ['USA', 'Haly'); 6. Operatora is NULL jeżeli chcemy sprawdzić, czy wartość zapisana w tabeli jest wartością nieokreśloną. Na przykład aby wyświetlić nazwy i numery telefonów tych firm, dla których nie znamy numeru faksu, napiszemy: SELECT companyname, phone FROM suppliers WHERE fax IS NULL; TYPY DANYCH BIGINT reprezentuje liczby całkowite z zakresu od -263 (-9 223 372 036 854 775 808) do 2S3-1 (9223 372036854775807). INT reprezentuje liczby całkowite z zakresu od -231 (-2147 483 648) do 231-1 (2 1 47 483 647). SMALLINT reprezentuje liczby całkowite z zakresu od -215 (-32768) do 215-1 (32767). DECIMAL reprezentuje liczby o określonej skali i precyzji z zakre su od -1038 + 1 do 1038 -

1. Typ NUMERIC jest synonimem typu DECIMAL. FLOAT reprezentuje liczby o zmiennej precyzji z zakresu od 1,79E + 308do1,79E + 308. REAL reprezentuje liczby o zmiennej precyzji z zakresu od -3,40E + 38 do 3,40E + 38. Typy zmiennoprzecinkowe charakteryzują się tym, że wartości tak zapisanych danych przechowywane są z pewną skończoną dokładnością. CHAR reprezentuje ciąg znaków o określonej długości. NCHAR (SQL Server) reprezentuje ciąg znaków o określonej długości zapisanej w postaci Unicode. VARCHAR reprezentuje ciąg znaków o zmiennej długości. NVARCHAR (SQL Server) reprezentuje ciąg znaków o zmiennej długości zapisanej w postaci Unicode. TEXT reprezentuje ciąg znaków o określonej, nie większej niż 231-1 (2147 483 647), długości. W serwerze SQL dane znako we o długości przekraczającej 8 KB powinny być reprezentowa ne za pomocą typów VARCHAR (MAX)lub NVARCHAR(MAX). DATE reprezentuje datę z dokładnością do jednego dnia. TIME reprezentuje czas i pozwala określić jego dokładność maksymalna wynosi 100 nanosekund. TIMESTAMP reprezentuje datę i czas. CHAR reprezentuje ciąg znaków o określonej długości. VARCHAR reprezentuje ciąg znaków o zmiennej długości. TEXT reprezentuje ciąg znaków o określonej, nie większej niż 231-1 (2147 483 647), długości. BOOL (PostgreSQL) reprezentuje prawdę lub fałsz. Każdy system zarządzania bazami danych obsługuje specjalną wartość NULL, która reprezentuje dane brakujące lub o nie-określonej wartości. Wartość NULL jest wartością specjalną, różną od wszystkich innych wartości, w tym od e i pustego ciągu znaków Wskazówki 1. Wszelkie operacje z wartością NULL (np. łączenie ciągu znaków lub mnożenie liczb) zwracają NULL. 2. Jedynym dopuszczalnym operatorem porównania z tą war-tością jest operator is [NOT] NULL chociaż nie wiemy, jaką wartość reprezentuje NULL, to możemy sprawdzić, czy dana wartość jest nieokreślona.

3. Wartość UNKNOWN będąca wynikiem porównań wartości NULL jest w różny sposób interpretowana w poszczególnych klauzulach języka SQL Do konwersji typów służy operator :: (funkcja CAST AS) FUNKCJE WBUDOWANE I OPERATORY https://www.postgresql.org/docs/current/static/functions.html - konkatenacja tekstów Klauzula GROUP BY Określa grupy wierszy, dla których będą obliczane wyniki funkcji grupujących wymienionych w poleceniu SELECT. Na liście argumentów klauzuli GROP BY muszą znaleźć się wszystkie wyrażenia niebędące wynikiem funkcji grupującej wymienione w poleceniu SELECT. 1. Serwer baz danych zwróci jeden wiersz dla każdej grupy wartości. 2. Kolumny wymienione w klauzuli GROUP BY muszą być wymienione w poleceniu SELECT. 3. Maksymalna liczba kolumn ograniczona jest typem poszczególnych danych zwróconych przez funkcje grupujące. AVG, SUM, MIN, MAX Klauzula HAVING Określa warunki wyszukiwania dla grup lub funkcji grupujących. Za pomocą klauzuli określa się warunki, które muszą być spełnione przez grupy wymienione w klauzuli GROUP BY FORMATOWANIE WYNIKÓW Wynik zapytania może być sformatowany zgodnie z wymaganiami użytkownika: Za pomocą słowa kluczowego DISTINCT możemy wyeliminować duplikaty. Za pomocą aliasów możemy zmienić nazwy kolumn. Za pomocą literałów możemy dodać do wyniku dowolne wyrażenia.

Za pomocą klauzuli ORDER BY możemy posortować wiersze wyniku. Składnia klauzuli ORDER BY (PostgreSCjL): [ ORDER BY wyrażenie,... ] [ LIMIT ( numer ALL ) ] [ OFFSET numer ] Składnia klauzuli ORDER BY (SQL Server): ORDER BY wyrażenie [ COLLATE porządek sortowania ] [ ASC DESC ] [,.-.n] [OFFSET numer \ wyrażenie określające liczbę wierszy) { ROW ROWS ) [ FETCH ( FIRST NEXT ) ( numer \ wyrażenie określające liczbę wierszy ) { ROW ROWS ) ONLY gdzie: wyrażenie określa kolumnę, według której będą sortowane dane, ASC (wartość domyślna) określa, że dane będą sortowane w porządku rosnącym (od wartości najmniejszej do największej), DESC określa, że dane będą sortowane w porządku malejącym. Przykład: SELECT OrderW, CustomerW, EmployeeW, OrderDate FROM Orders ORDER BY OrderDate DESC; Kolejny przykład pokazuje, jak uporządkować wynik zapytania przez posortowanie wierszy, wyeliminowanie duplikatów oraz wykorzystanie aliasów i literałów: SELECT DISTINCT nazwa kraju: ', Country AS 'Kraj' FROM suppliers ORDER BY country; Ostatni przykład pokazuje, w jaki sposób możemy odczytać uporządkowane malejąco według wieku dane najstarszych klientów SELECT FirstName, Age FROM CustomersHistory ORDER BY Age DESC Najprostsza instrukcja Select SELECT * ;

Instrukcja Select trochę bardziej skomplikowana SELECT IMIĘ, NAZWISKO ; Instrukcja Select z prostym kryterium SELECT DISTINCTROW PRACOWNICY.NAZWISKO, PRACOWNICY.IMIĘ, PRACOWNICY.[KOD DZIAŁU], PRACOWNICY.STAWKA WHERE ((PRACOWNICY.STAWKA>7 And PRACOWNICY.STAWKA<9)) ORDER BY PRACOWNICY.NAZWISKO; Instrukcja Select z kryterium zgodności pierwszej litery SELECT DISTINCTROW PRACOWNICY.NAZWISKO, PRACOWNICY.IMIĘ, PRACOWNICY.[KOD DZIAŁU], PRACOWNICY.STAWKA WHERE (((PRACOWNICY.NAZWISKO) Like "A*" Or (PRACOWNICY.NAZWISKO) Like "W*" Or (PRACOWNICY.NAZWISKO) Like "Z*")) ORDER BY PRACOWNICY.NAZWISKO; Instrukcja Select z polami obliczeniowymi SELECT DISTINCTROW PRACOWNICY.NAZWISKO, PRACOWNICY.IMIĘ, PRACOWNICY.[KOD DZIAŁU], [CZAS PRACY]*[STAWKA] AS [STAWKA TYGODNIOWA], [STAWKA]*0.05 AS PREMIA ORDER BY PRACOWNICY.NAZWISKO; Instrukcja Select z dwóch połączonych tabel SELECT DISTINCTROW PRACOWNICY.NAZWISKO, PRACOWNICY.IMIĘ, ADRESY.ULICA, ADRESY.MIASTO, ADRESY.KOD FROM ADRESY INNER JOIN PRACOWNICY ON ADRESY.IDENTYFIKATOR = PRACOWNICY.IDENTYFIKATOR ORDER BY PRACOWNICY.NAZWISKO; Select i funkcja agregująca (COUNT,SUM,AVG,MIN,MAX) SELECT COUNT(NrPracownika) AS Licznik FROM Pracownicy; Select i grupowanie

SELECT DISTINCTROW PRACOWNICY.[KOD DZIAŁU], Sum([CZAS PRACY]*[STAWKA]) AS [STAWKA TYGODNIOWA] GROUP BY PRACOWNICY.[KOD DZIAŁU] ORDER BY PRACOWNICY.[KOD DZIAŁU]; Podkwerendy Podkwerendy (Podzapytania) : porównanie [ANY ALL SOME] (instrukcja_sql) wyrażenie [NOT] IN (instrukcja_sql) [NOT] EXISTS (instrukcja_sql) Jako źródło danych (tabela jako podzapytanie) Jako wyrażenie obliczane tak jak inne pola kwerendy Podzapytaniem nazywamy instrukcję SELECT umieszczoną w ramach innej instrukcji języka SQL (instrukcji SELECT,INSERT,UPDATE,DELETE). Podzapytania z reguły mogą być zastąpione złączeniami lub wyrażeniami. Najczęstszymi powodami tworzenia podzapytań są: 1. Chęć uproszczenia zapytania przez podzielenie go na kilka prostszych zapytań. 2. Wykorzystanie wyniku jednego zapytania jako danych źródłowych dla innego zapytania. Wskazówki 1. Podzapytanie musi być zapisane w nawiasie. 2. Wynik podzapytania nie może zawierać danych typów LOB, BLOB, CLOB 3. Serwery pozwalają na zagnieżdżanie zapytań do określonego poziomu w przypadku skomplikowanych lub zwracających duże liczby danych podzapytań maksymalny poziom zagnieżdżenia może obejmować kilka, a nawet kilkanaście podzapytań. Podzapytania niepowiązane Podzapytania niepowiązane w pierwszej kolejności wykonują zagnieżdżoną instrukcję, a zwrócone przez nią dane przekazują do zapytania zewnętrznego i wykonują je. W tego typu podzapytaniach zapytanie wewnętrzne wykonywane jest tylko raz. Podzapytania jako źródła danych Wynik podzapytania może być zbiorem danych źródłowych dla innego zapytania. W takim przypadku podzapytanie znajduje się w klauzuli zapytania nadrzędnego.

Podzapytania jako wyrażenia Wynik podzapytania może być potraktowany jako lista wartości wyrażenia, pod warunkiem że podzapytanie zwróciło wartość skalarną. Podzapytania powiązane W tego typu podzapytaniach zapytanie wewnętrzne wykonywane jest dla każdego wiersza wyniku zapytania zewnętrznego, dlatego wyniki obu zapytań mogą być ze sobą porównywane. Podzapytanie powiązane jest przykładem dynamicznego złączenia wyniku zapytania z każdym kolejnym wierszem wyniku zapytania zewnętrznego. Serwery baz danych wykonują podzapytania powiązane według następującego schematu: 1. Zapytanie zewnętrzne zwraca wiersz kandydujący. 2. Podzapytanie jest wykonywane, a jego wynik zostaje przekazany do zapytania zewnętrznego. 3. Zapytanie zewnętrzne zwraca kolejny wiersz i cały proces powtarza się tyle razy, ile wierszy zwróciło zewnętrzne zapytanie. Przykład (odczytujemy informacje o wszystkich produktach należących do tej samej kategorii co produkt o podanej nazwie a więc nie podajemy nazwy kategorii): Wskazówki 1. Podzapytania powiązane, choć są funkcjonalnym odpowiednikiem złączenia tabel, z reguły są wykonywane dłużej i wymagają przetworzenia większej ilości danych.

2. Jeżeli jest to możliwe, należy zastąpić podzapytanie powiązane klauzulą HAVING poprawia to czytelność i wydajność zapytania. Podzapytania z operatorem EXISTS Za pomocą operatorów EXISTS i NOT EXISTS możemy ograniczyć wynik zapytania zewnętrznego do wierszy zwróconych (lub nie, w wypadku operatora ) przez podzapytanie powiązane. Operator EXISTS jest dwuwartościowy zwraca wartość logiczną 1 : (prawda), jeżeli w wyniku podzapytania pojawia się określony wiersz, i 0; (fałsz), jeżeli wynik podzapytania nie zawiera określonego wiersza. Przykład (odczytujemy informacje o tych autorach, którzy mają to samo imię i nazwisko, a więc dane, które prawdo-podobnie przez pomyłkę zostały kilkakrotnie wprowadzone do bazy): Wskazówka Podzapytania z operatorem EXISTS lub NOT EXISTS nie zwracają żadnych danych, a jedynie prawdę lub fałsz. CTE CTE (ang. Common Table Expressions) to zdefiniowane w standardzie SQL3 nazwane wyrażenia tabelaryczne. CTE, tak jak tabele pochodne, są wynikami zapytań wewnętrznych, jednak: 1. Nazwę CTE definiuje się za pomocą słowa kluczowego WITH 2. Do raz zdefiniowanego CTE można się wielokrotnie odwoływać za pomocą jego nazwy. 3. Jeżeli podzapytanie zawiera kilka CTE, w później zdefiniowanych CTE można odwołać się do tych, które zostały zdefiniowane wcześniej. 4. Zdefiniowane w tym samym podzapytaniu CTE mogą być ze sobą powiązane, tworząc rekurencyjne CTE. Proste CTE Proste CTE nie tylko poprawiają czytelność zapytań, lecz także pozwalają przezwyciężyć niektóre ograniczenia serwerów bazodanowych. Na przykład jeżeli serwer nie pozwala używać funkcji NTILE w klauzuli WHERE, możemy przenieść funkcję rankingu do CTE i w zapytaniu zewnętrznym odwołać się do aliasu zdefiniowanego dla niej w CTE.

Rekurencyjne CTE Łącząc ze sobą wyniki dwóch CTE, uzyskamy możliwość wykonywania rekurencyjnych zapytań bez użycia tabel tymczasowych, pętli czy kursorów. Rekurencyjne CTE składa się z dwóch zapytań wewnętrznych połączonych operatorem UNION ALL (zatem oba zapytania muszą zwrócić tę samą liczbę kolumn, a odpowiadające sobie kolumny muszą być tego samego typu): 1. Pierwsze zapytanie reprezentuje warunek brzegowy rekurencji (ang. Anchor Member) i jest wykonywane tylko raz. 2. Drugie zapytanie jest wykonywane dopóty, dopóki zwraca jakieś wiersze (ang. Recursive Member). Wiersze zwrócone przez drugie zapytanie trafiają do wyniku CTE. Standardowym zastosowaniem rekurencyjnych CTE jest odczytywanie hierarchicznych danych, na przykład informacji o strukturze pracowników (pracownik X może być podwładnym pracownika Y i jednocześnie przełożonym pracownika Z). IN SELECT IDENTYFIKATOR, NAZWISKO, IMIĘ, [KOD DZIAŁU] WHERE [KOD DZIAŁU] IN ("AD","MK") SELECT IDENTYFIKATOR, NAZWISKO, IMIĘ, [KOD DZIAŁU] WHERE [KOD DZIAŁU] NOT IN ("WK","ZW")

Podkwerenda w warunku IN SELECT IDENTYFIKATOR, NAZWISKO, IMIĘ, [KOD DZIAŁU] WHERE PRACOWNICY.[KOD DZIAŁU] IN (SELECT [KOD DZIAŁU] FROM [KODY I NAZWY DZIAŁÓW] WHERE ZAMIEJSCOWY=TRUE) ANY/ALL SELECT IDENTYFIKATOR, IMIĘ, NAZWISKO, STAWKA WHERE (((PRACOWNICY.STAWKA)>ANY (SELECT CENA_BUTELKI FROM SKLEP))) ORDER BY PRACOWNICY.IDENTYFIKATOR DESC; SELECT IDENTYFIKATOR, IMIĘ, NAZWISKO, STAWKA WHERE (((PRACOWNICY.STAWKA)>ALL (SELECT CENA_BUTELKI FROM SKLEP))) ORDER BY PRACOWNICY.IDENTYFIKATOR DESC; EXISTS SELECT IDENTYFIKATOR,IMIĘ,NAZWISKO WHERE EXISTS (SELECT * FROM NAGRODY WHERE ID=PRACOWNICY.IDENTYFIKATOR) Podkwerenda jako pole SELECT IDENTYFIKATOR, NAZWISKO, IMIĘ, [KOD DZIAŁU], (SELECT COUNT(*) FROM DNI_WOLNE WHERE IDENTYFIKATOR=PRACOWNICY.IDENTYFIKATOR) AS DNI Klauzula HAVING SELECT [KOD DZIAŁU], AVG(PRACOWNICY.WYNAGRODZENIE) AS SREDNIEWYNAGRODZENIE GROUP BY PRACOWNICY.[KOD DZIAŁU] HAVING (((AVG(PRACOWNICY.WYNAGRODZENIE))>1000)); Podkwerenda + HAVING SELECT MIASTO, IDENTYFIKATOR FROM ADRESY WHERE (MIASTO In (SELECT MIASTO FROM ADRESY AS ADRESYALIAS GROUP BY MIASTO HAVING Count(*)>=5 ))