Relacyjne bazy danych Podstawy SQL
Język SQL SQL (Structured Query Language) język umożliwiający dostęp i przetwarzanie danych w bazie danych na poziomie obiektów modelu relacyjnego tj. tabel i perspektyw. Po co się uczyć? SQL umożliwia odczyt informacji z każdej relacyjnej bazy danych zrozumienie mechanizmów rządzących graficznymi interfejsami użytkownika możliwość tworzenia złożonych zapytań wiedza przydatna na wielu platformach sprzętowych
Funkcje realizowane przez SQL definicja struktury bazy danych odczyt danych modyfikacja danych kontrola dostępu współużytkowanie danych integralność danych Można używać go jako: element aplikacji i narzędzi programowych interakcyjny język zapytań język komunikacji pomiędzy różnymi SZRBD
Składnia SQL - SELECT SELECT FROM WHERE GROUP BY nazwa kolumny nazwa tabeli warunek wyszukiwania nazwa kolumny
Składnia SQL - SELECT SELECT nazwa kolumny FROM nazwa tabeli Przykłady: SELECT nazwisko FROM TSedziowie; SELECT nazwa, id FROM TKluby; SELECT gol1, gol2, gol3, gol4 FROM TMecze; SELECT * FROM TKluby;
SELECT eliminowanie duplikatów SELECT DISTINCT nazwa kolumny FROM nazwa tabeli Przykłady: SELECT DISTINCT kolejka FROM TMecze;
Sortowanie rekordów SELECT nazwa kolumny FROM nazwa tabeli ORDER BY Przykłady: nazwa kolumny ASC DESC SELECT imie, nazwisko FROM TSedziowie ORDER BY nazwisko, imie ASC; SELECT imie, nazwisko FROM TSedziowie ORDER BY nazwisko, imie DESC; SELECT imie, nazwisko FROM TSedziowie ORDER BY nazwisko ASC, imie DESC; SELECT DISTINCT kolejka FROM TMecze ORDER BY kolejka DESC;
Proste wyrażenia Można używać operatorów do wykonywania działań na polach, np. +, -, *, /, Przykłady: SELECT domin-odmin FROM tsklady;
Nadawanie nazw wyrażenie SELECT AS nazwa kolumny - nowa Przykłady: SELECT domin-odmin AS CzasGryPiłkarza FROM tsklady; SELECT m.id, k1.nazwa, k2.nazwa FROM TMecze ASm, TKluby ASk1, TKLuby ASk2;
Filtrowanie danych SELECT DISTINCT wyrażenie AS alias FROM nazwa tabeli WHERE warunek wyszukiwania Przykłady: SELECT* FROM tkartkigole WHERE rodzaj = "K"; SELECT imie, nazwisko FROM TPilkarze WHERE klubid = 3;; SELECTnazwa FROMTKluby WHEREid = 999 SELECTp.imie, p.nazwisko, k.nazwa FROMTPilkarze as p, TKluby as kwherep.klubid = k.id ANDk.id = 4ORDERBY p.nazwisko;
Filtrowanie danych warunki wyszukiwania Podstawowe warunki: porównanie (operatory: =, <>, <, >, <=, >=) zakres (BETWEEN AND ) występowanie (IN) wzór (LIKE) * - zastępuje dowolny ciąg znaków? - zastępuje pojedynczy znak puste wartości (IS NULL) istnienie (EXISTS)
Filtrowanie danych warunki wyszukiwania Przykłady: SELECT * FROM tsedziowie WHERE miasto <> "Warszawa"; SELECT* FROM tmecze WHERE kiedy BETWEEN #2003-08-16# AND #2003-09-13#; SELECT* FROMtmecze WHEREkolejkaIN("2", "3", "5") ; SELECT* FROM tsedziowie WHERE miasto IS NULL; SELECT imie, nazwisko FROM tsedziowie WHERE nazwisko LIKE "G*";
Filtrowanie danych łączenie predykatów Warunki złożone buduje się przy pomocy operatorów logicznych AND, OR, NOT Przykłady: SELECTp.imie, p.nazwisko, k.nazwa FROMTPilkarze as p, TKluby as kwherep.klubid = k.id ANDk.id = 4ORDERBY p.nazwisko; SELECTid FROMTMecze WHEREgospodarz = 5 ORprzeciwnik = 5;
Proste funkcje agregujące wyrażenie SELECT AS alias COUNT (*) COUNT SUM AVG MIN MAX FROM nazwa tabeli WHERE warunek wyszukiwania
Proste funkcje agregujące Przykłady: SELECT SUM(widownia) FROM Tmecze; SELECT SUM(gol1) + SUM(gol2) FROM TMecze; SELECT COUNT(*) FROM TPilkarze, TKluby; SELECT COUNT(*) FROM tkartkigole WHERE rodzaj = "S"; SELECTCOUNT(*)as ilegolifromtkartkigolewhererodzaj = "N"ORrodzaj = "K"ORrodzaj = "S";
Zapytania wielotabelowe Ważne: należy podać wszystkie nazwy tablic w klazuzuli FROM w celu uniknięcia niejednoznaczności należy stosować nazwy kwalifikowane pól (poprzedzone nazwą tabeli lub alias) we frazie WHERE należy umieścić warunek wiążący zbiory Nazwa kwalifikowana: np. GoleKartki.rodzaj, TKluby.nazwa Alias tablicy umieszcza się we frazie FROM np. FROMTMecze ASm, TKluby ASk1, TKLuby ASk2
Zapytania wielotabelowe - przykłady Zapytanie SELECT imie, nazwisko, nazwa FROM TPilkarze, TKluby zwraca wszystkie możliwe kombinacje rekordów tabel TPilkarze, TKluby w ilości: SELECT COUNT(*) FROM TPilkarze, TKluby czyli iloczyn: SELECT COUNT(*) FROM TPilkarze SELECT COUNT(*) FROM TKluby
Zapytania wielotabelowe - przykłady SELECT COUNT(*) as liczbapilkarzy FROM TPilkarze AS p, TKluby ASkWHEREp.klubid = k.id ANDk.id = 4 SELECTp.imie, p.nazwisko, k.nazwa FROMTPilkarze ASp, TKluby ASkWHEREp.klubid = k.id ANDp.id = 179 SELECTk1.nazwa, k2.nazwa, m.idfromtkluby ASk1, TKluby ASk2, TMecze ASmWHEREm.id = 5 ANDk1.id = m.gospodarz AND k2.id = m.przeciwnik
Klauzula JOIN SELECT nazwa kolumny FROM nazwa tabeli JOIN nazwa tabeli ON warunek wyszukiwania Klazula JOINpozwala łączyć ze sobą kilka tabel wykorzystując do tego klucze główne i obce. Dotyczy tylko tych wierszy, które mają swoje odpowiedniki w tabeli komplementarnej.
Klauzula INNER JOIN - przykłady SELECT COUNT(*) as liczbapilkarzy FROM TPilkarze AS p INNER JOINTKluby ASkONp.klubid = k.id ANDk.id = 4; SELECT p.imie, p.nazwisko, k.nazwa FROM TPilkarze AS p INNER JOINTKluby ASkONp.klubid = k.id ANDp.id = 179; SELECT imie, nazwisko, nazwa FROM TPilkarze INNER JOIN TKluby ONTPilkarze.klubid = TKluby.id ANDTPilkarze.id = 179
Klauzula GROUP BY SELECT nazwa kolumny FROM nazwa tabeli WHERE warunek wyszukiwania GROUP BY nazwa kolumny Przykłady: liczba goli i kartek zdobytych przez każdego z piłkarzy SELECT pilkarzid, COUNT(*) AS ile FROM tkartkigole GROUP BYpilkarzidORDER BYile DESC liczba goli zdobyta przez każdego z piłkarzy SELECT pilkarzid, COUNT(*) AS ile FROM tkartkigole WHERE (rodzaj = "N" ORrodzaj = "K")GROUPBYpilkarzidORDER BY ile DESC
Klauzula GROUP BY -c.d. Co z nazwiskami piłkarzy, jak je uzyskać? SELECT p.imie, p.nazwisko, pilkarzid, COUNT(*) ASile FROM tkartkigole, TPilkarze AS p WHERE (rodzaj = "N" ORrodzaj = "K") AND p.id = pilkarzid GROUP BY pilkarzid ORDER BY ile DESC;
Klauzula GROUP BY c. d. Jak uzyskać listę strzelców z danego klubu? SELECT p.imie, p.nazwisko, kl.nazwa, COUNT(*) AS ile FROM tkartkigole ASgol, TPilkarze ASp, TKluby ASkl WHERE gol.rodzaj = "N" AND p.id = gol.pilkarzid AND kl.id = gol.klubid AND kl.id = 2 GROUP BY gol.pilkarzid ORDER BY ile DESC;
Ograniczenie liczby rekordów - LIMIT Klauzula LIMIT ogranicza liczbę jednocześnie wyświetlanych rekordów SELECT* FROM"tmecze" LIMIT 15 zwraca 15 pierwszych rekordów SELECT* FROM"tsklady" LIMIT 105, 15 zwraca 15 kolejnych rekordów pomijając pierwsze 105
Instrukcje modyfikacji tablic INSERT pozwala dopisywać nowe wiersze do tablicy UPDATE - pozwala modyfikować istniejące dane DELETE pozwala usunąć wiersze z tablicy
Instrukcja INSERT INSERT INTO nazwa tabeli, ew. nazwy kolumn VALUES wartości Przykłady: INSERTINTOtKartkiGole VALUES( "1", "1","266","7", "28","K"); INSERTINTOTPilkarze VALUES( "114","Piotr", "Soczewka","2"); INSERTINTOTPilkarze(id, imie, nazwisko)values( "350","Grzegorz","Kowalski");
Instrukcja UPDATE UPDATE nazwa tabeli WHERE SET wartości warunek wyszukiwania SET podaje nazwy kolumn i przypisane im nowe wartości WHERE określa, które rekordy mają być modyfikowane Przykłady: UPDATETPilkarze SETnazwisko = "Gruszka" WHEREid = 114; UPDATETPilkarze SETimie = "Jan", nazwisko = "Gruszka" WHERE id = 114;
Instrukcja DELETE DELETE FROM nazwa tabeli WHERE warunek wyszukiwania Przykłady: DELETE FROM TPilkarze WHERE id = 350; DELETEFROMTPilkarze WHEREklubid IN(SELECTid FROM tkluby WHERE nazwa LIKE"*Warszawa*");
Tworzenie tabel CREATE TABLE nazwa tabeli WHERE nazwa kolumny=typ Przykłady: CREATE TABLE TPilkarze ( id int(11) NOT NULL auto_increment, imie varchar(75) NOT NULL, nazwisko varchar(75) NOT NULL, klubid int(11), PRIMARY KEY (id), UNIQUE id_2 (id), KEY id (id, imie, nazwisko, klubid) );
Usuwanie tabel DROP TABLE nazwa tabeli Przykłady: DROP TABLE TPilkarze; DROP TABLE TMecze; DROP TABLE tkartkigole;
Klauzula UNION Klauzula UNION służy do łączenia rezultatów dwóch lub więcej instrukcji SELECT w jedną tablicę Łączone instrukcje SELECT muszą spełniać określone warunki: muszą zawierać tę samą liczbe kolumn odpowiednie kolumny ze wszystkich instrukcji SELECT muszą mieć zgodne typy klauzula ORDER BY może wystąpić tylko w ostatniej instrukcji SELECT
Klauzula UNION SELECT* FROM tkartkigole WHERE rodzaj = "N" UNION SELECT* FROM tkartkigole WHERE rodzaj = "S";