SQL - Structured Query Language strukturalny język zapytań
SQL - Structured Query Language - strukturalny język zapytań Światowy standard przeznaczony do definiowania, operowania i sterowania danymi w relacyjnych bazach danych Powstał w firmie IBM pod koniec lat 70-tych Występuje w produktach większości firm produkujących oprogramowanie do zarządzania bazami danych SQL używany jest jako standardowe narzędzie umożliwiające dostęp do danych w różnych środowiskach, z różnym sprzętem komputerowym i różnymi systemami operacyjnymi Język SQL jest niewrażliwy na rejestr czcionki, czyli wielkie i małe litery nie są rozróżniane
Podstawowa składnia SELECT SELECT Lista kolumn FROM Źródło Listy [ WHERE Warunek wybierający] [ GROUP BY Warunek grupowania] [ HAVING Szczegóły grupowania] [ ORDER BY Wyrażenie] [ASC DESC] Polecenie SELECT wyświetla dane zgromadzone w jednej lub większej liczbie tabel znajdujących się w bazie danych.
Schemat bazy danych Sklep
Źródło listy W przypadku odwołania do: pojedynczej tabeli podajemy nazwę tabeli; więcej niż jednej tabeli używa się poniższą składnię: FROM <tabela 1> <operator_zlaczenia> <tabela 2> ON <warunek zlaczenia> <operator_zlaczenia> <tabela 3> ON <warunek zlaczenia>
Instrukcje złączenia tabel Związki logiczne między tabelami są reprezentowane przez odpowiadające sobie wartości kluczy podstawowych i obcych. Aby połączyć dane z dwóch lub więcej tabel można użyć jednej z metod: 1. Wykorzystanie klauzuli WHERE SELECT kolumny FROM tabela1, tabela2 WHERE tabela1.klucz_podstawowy = tabela2.klucz_obcy 2. Wykorzystanie operatora JOIN. SELECT kolumny FROM tabela1 JOIN tabela2 ON tabela1.klucz_podstawowy = tabela2.klucz_obcy
OPERATORY ZŁĄCZENIA Występują trzy wersje klauzuli JOIN: Połączenia tabel realizujemy za pomocą operatorów złączenia: JOIN (INNER JOIN)- wewnętrzne, wybiera rekordy z obu tabel gdzie pola łączące odpowiadają sobie wartościami LEFT OUTER JOIN zewnętrzne lewostronne, wybiera wszystkie rekordy z tabeli nadrzędnej i tylko te z podrzędnej gdzie pola łączące odpowiadają sobie wartościami RIGHT OUTER JOIN - zewnętrzne prawostronne, wybiera wszystkie rekordy z tabeli podrzędnej i tylko te z nadrzędnej gdzie pola łączące odpowiadają sobie wartościami
Instrukcje złączenia tabel - przykłady 1. Wykorzystanie klauzuli WHERE SELECT Zamowienia.idzamowienia, Klienci.Nazwafirmy, Klienci.Miasto FROM Zamowienia, Klienci WHERE Zamowienia.IDklienta = Klienci.IDklienta 2. Wykorzystanie operatora JOIN* SELECT Zamowienia.idzamowienia, Klienci.Nazwafirmy,Klienci.Miasto FROM Zamowienia INNER JOIN Klienci ON Zamowienia.IDklienta = Klienci.Idklienta 3. Łączenie kilku tabel, tu należy użyć nawiasów: SELECT NazwaFirmy, Idzamówienia, NazwaProduktu, kraj, ilość FROM Pozycje_Zamówień INNER JOIN (Towary INNER JOIN Dostawcy ON Towary.iddostawcy = Dostawcy.Iddostawcy) ON Pozycje_Zamówień.IDtowaru=Towary.Idprodukt WHERE dostawcy.kraj = USA AND NazwaProduktu = Cukier *Różnica między 1 i 2 WHERE nie pozwala na edycję wybranych danych.
Instrukcje złączenia tabel - przykłady SELECT PRACOWNICY.NAZWISKO, PRACOWNICY.IMIĘ, DANE_OSOBOWE.DATA_UR, ODDZIAŁY.[Nr Oddz] FROM ODDZIAŁY INNER JOIN (PRACOWNICY INNER JOIN DANE_OSOBOWE ON PRACOWNICY.ID_prac = DANE_OSOBOWE.ID_PRAC) ON ODDZIAŁY.[Nr Oddz] = PRACOWNICY.NR_ODDZ) ;
Polecenie SELECT klauzula WHERE W warunkach: można stosować kryteria wyboru: operatory porównania:{ = <>!= > >= < <= } nazwisko = Kowalski, wiek < 25, Data = 11-JUL-1996, Data > 1996-07-11 operatory logiczne: NOT AND i OR Przedziały: BETWEEN i NOT BETWEEN WHERE wiek BETWEEN 30 and 40 Listy: słowo kluczowe IN i NOT IN WHERE litera IN ( A, B, C ), WHERE liczba IN (10, 20, 30)
Klauzula WHERE wyrażania: IS NULL, IS NOT NULL W warunkach można stosować: do porównywania wartości pustych (NULL) należy stosować składnię IS NULL oraz IS NOT NULL do porównywania łańcuchów można stosować operator LIKE akceptujący wzorce napisów, w których: znak _ zastępuje dowolny znak, % zastępuje dowolny ciąg znaków [ ] wiele pojedynczych znaków z listy np.: WHERE nazwisko LIKE [C-P]abacki zwróci np. Cabacki, Fabacki [^] wiele pojedynczych znaków nie z listy, WHERE nazwisko LIKE [^C-P]arsen
Operator LIKE Działa na kolumnach zawierających wartości łańcuchowe. Operator LIKE sprawdza czy wartość tekstowa odpowiada podanemu wzorcowi, jak zaczynający sie od tekstu, kończący się na tekście, lub zawierający tekst Tworząc wzorce stosuje się znaki wieloznaczne: % - zastępuje sekwencję dowolnych znaków o długości n _ - odpowiada jednemu znakowi w przeszukiwanym tekście W Akcesie: * - zastępuje sekwencję dowolnych znaków o długości? odpowiada jednemu znakowi
Klauzula WHERE Operatory LEFT, RIGHT; słowo DISTINCT W warunkach: można stosować: Operatory LEFT, RIGHT Przykłady: WHERE (LEFT(nazwisko,1)= K ) WHERE (RIGHT(RTRIM(IMIE),1)= A ) Co oznacza: pierwszy znak od prawej to A ; (z pominięciem spacji funkcja RTRIM) W celu wyeliminowania powtórzeń można użyć słowa kluczowego DISTINCT, np. w wyniku polecenia: SELECT DISTINCT Miasto, Kraj FROM Dostawcy zostanie zwrócona lista miast bez powtórzeń.
Sortowanie wyników klauzula ORDER BY Sortowanie wyników: może odbywać się za pomocą klauzuli ORDER BY według jednej lub kilku kolumn, których nazwy oddzielane są przecinkiem. ASC rosnąco (domyślnie), DESC - malejąco SELECT DISTINCT Miasto, Kraj FROM Dostawcy ORDER BY miasto DESC SELECT Nazwafirmy, Miasto, Kraj FROM Dostawcy ORDER BY Kraj, Miasto
Usuwanie niepotrzebnych spacji Funkcja TRIM (nazwa_kolumny) służy do odrzucenia spacji znajdujących się przed i za łańcuchem Sformułowanie zapytania jak poniżej, z zastosowaniem funkcji TRIM (nazwa kolumny) usuwa ten problem Przykład polecenia: SELECT Imię, Nazwisko, Pensja, Miasto FROM NAZWISKA WHERE TRIM(Nazwisko) BETWEEN 'D' AND 'N ;
Funkcje agregujące Funkcje agregujące realizują obliczenia na zbiorze rekordów: COUNT - liczy ilość wierszy SUM - sumuje zawartość podanej kolumny lub wyrażenia AVG - liczy średnia arytmetyczna dla kolumny lub wyrażenia MIN - liczy wartość minimalną dla kolumny lub wyrażenia MAX - liczy wartość maksymalną dla kolumny lub wyrażenia Przykład 1: Obliczenie liczby zamówień po 1 lutym 2000: SELECT COUNT(*) AS [Ilość zamówień] FROM Zamówienia WHERE DataZamówienia > #1-02-2000# Przykład 2: Obliczenie całkowitego przychodu ze sprzedaży, wynik w formacie waluta: SELECT SUM(Ccur(Ilość*Cena)) AS [Całkowity przychód] FROM [Szczegóły zamówienia ]
zapytania grupujące klauzula GROUP BY Klauzula GROUP BY pozwala tworzyć grupy rekordów. Klauzula umożliwia grupowanie wyników względem zawartości wybranej kolumny Jeżeli użyjemy w zapytaniu jednocześnie funkcji agregującej dla innej kolumny, to funkcja ta dokona obliczeń dla kategorii określonych w klauzuli GROUP BY kolumna, względem której dokonujemy grupowania powinna, znajdować się w części deklaracyjnej wyrażenia SELECT Klauzula GROUP BY dziala ze wszystkimi funkcjami agregującymi. Przy pomocy klauzuli GROUP BY można tworzyć grupy i podgrupy, w zależności od tego czy wybrana jest więcej niż jedna kolumna. Przykład: SELECT Miasto, Stanowisko FROM NAZWISKA GROUP BY Miasto, Stanowisko ORDER BY Stanowisko;
Filtrowanie wyników zapytań z użyciem HAVING Język SQL dostarcza jeszcze jedna metodę filtrowania wyników zapytania w polaczeniu z klauzula GROUP BY Klauzula WHERE filtruje wyniki zapytania zanim są one grupowane, natomiast klauzula HAVING filtruje wyniki po wykonaniu grupowania Wyrażenia zawarte w tej klauzuli wykonywane są na całych grupach, a nie na pojedynczych rekordach Postać polecenia wybierającego te miasta, dla których suma wypłat jest wyższa od 3 000 zł SELECT Miasto, SUM(Pensja) AS SUMA FROM NAZWISKA GROUP BY Miasto Wynik zapytania HAVING SUM(Pensja) > 3000 ORDER BY SUM(Pensja) DESC;
Filtrowanie wyników zapytań z użyciem HAVING Funkcje agregujące są użyte w dwóch miejscach, w klauzuli SELECT oraz HAVING W HAVING musi się znajdować takie samo wyrażenie jak na liście klauzuli SELECT Nazwy kolumn, które nie pojawiają się na liście klauzuli SELECT, nie mogą być w ogóle użyte w klauzuli GROUP BY Klauzula HAVING pojawia się przed ORDER BY ale za GROUP BY W obrębie klauzuli HAVING, można używać złożonych wyrażeń Jedyne ograniczenie polega na tym, ze wszystkie wyrażenia w części HAVING musza mieć swój odpowiednik na liście klauzuli SELECT HAVING i WHERE mogą być stosowane w jednym zapytaniu
ZAPYTANIA GRUPUJĄCE Rozszerzona składnia SELECT SELECT [DISTINCT] [TOP n [PERCENT] ] Lista kolumn FROM Źródło Listy [ WHERE Warunek wybierający] [ GROUP BY Warunek grupowania] [ HAVING Szczegóły grupowania] [ ORDER BY Wyrażenie [ASC DESC]]
KWERENDA KRZYŻOWA TRANSFORM Count(Studenci_uczelnia.ID_albumu) AS LICZBA_STUDENTOW SELECT Kierunki.kierunek FROM Kierunki INNER JOIN Studenci_uczelnia ON Kierunki.KOD_kierunku = Studenci_uczelnia.KOD_kierunku GROUP BY Kierunki.kierunek PIVOT Studenci_uczelnia.Rok_studiow;