5. Język J SQL Przegląd Instrukcja wyboru (SELECT) Instrukcje modyfikacji danych Inne instrukcje for each {x=1; SQL select for each {x=1; SQL for each update {x=1; SQL update #1 K.Goczyła
SQL (Structured( Query Language) SEQUEL (1974) - opracowany w IBM Research Laboratory w San Jose. Następnie jego nazwę zmieniono na SQL (często wymawiane jako sequel ). Pierwsze zastosowanie - SYSTEM R, następnie w systemach DB2, SQL/DS, QMF na komputerach IBM/370 (mainframe). Standardy: SQL-86: ANSI X3.135-1986 Database Language SQL SQL-89: ANSI X3.168-1989 Database Language - Embedded SQL ANSI X3.135-1989 Database Language - SQL with Integrity Enhancement SQL-92: ISO/IEC 9075:1992 Database Language SQL SQL-99: ISO/IEC 9075:1999 Information Technology - Database Languages - SQL SQL interakcyjny - instrukcje wprowadzane interakcyjnie, wyniki natychmiast prezentowane użytkownikowi w sposób ustalony przez DBMS (SQL nie zawiera żadnych instrukcji we/wy ani formatujących). zanurzony - instrukcje są zamieszczone w programie napisanym w innym języku (3GL lub 4GL); wyniki mogą być przekazane do zmiennych programu. #2 K.Goczyła
Składniki SQL SQL = Data Definition Language (DDL) + Data Manipulation Language (DML) + Data Control Language (DCL) Podstawowe instrukcje ("core SQL"`): DDL DML DCL CREATE TABLE CREATE VIEW CREATE INDEX ALTER TABLE DROP TABLE DROP VIEW DROP INDEX SELECT INSERT UPDATE DELETE GRANT REVOKE Standardy SQL-92 i SQL-99 obejmują ponadto szereg innych instrukcji, które rozszerzają funkcje DBMS np. o definiowanie ograniczeń, reguł, funkcji, wyzwalaczy itd. Szczegóły na temat konkretnej implementacji SQL - w dokumentacji DBMS. #3 K.Goczyła
Tworzenie tablic CREATE TABLE <nazwa tablicy> (<nazwa kolumny> <typ danych> [opcje] [, <nazwa kolumny > <typ danych> [opcje]... ] [, UNIQUE (<nazwa kolumny>, [<nazwa kolumny>])]...); Cel: Utworzenie w bazie danych nowej tablicy. Trzeba określić: - nazwę tablicy (niepowtarzalna w bazie danych), - nazwy kolumn (niepowtarzalne w tablicy), - typ danych każdej kolumny. Typy danych: (SQL-89) INTEGER, SMALLINT - liczba całkowita (zakres zależy od DBMS). DECIMAL[(m [, n ])], NUMERIC[(m [, n ])] - stałoprzecinkowa liczba rzeczywista o m cyfrach znaczących i n cyfrach po przecinku. FLOAT[(m)] - zmiennoprzecinkowa liczba rzeczywista o m cyfrach. REAL to samo co DECIMAL. DOUBLE PRECISION to samo co FLOAT. CHARACTER(n) - łańcuch znaków o długości do n znaków (separator: lub ). DATE - data (zwykle w formacie: mm/dd/yyyy). LOGICAL - wartości logiczne: yes/no, true/false. #4 K.Goczyła
Tworzenie tablic (cd.) Inne typy danych: (SQL-92) VARCHAR, DATETIME, MONEY, TEXT, IMAGE, BLOB, CLOB,... (szczegóły - w dokumentacji DBMS) Opcje (przykładowe): NOT NULL [ UNIQUE ] - w kolumnie musi być wartość, jeśli UNIQUE - to unikatowa. UNIQUE (<kolumna> [,<kolumna>]...) wartość w kolumnie (kolumnach) musi być unikatowa. Każda kolumna musi być zdefiniowana z opcją NOT NULL. [NOT] CASE-SENSITIVE określa, czy przy porównywaniu wartości w kolumnie znakowej ma być brana pod uwagę wielkość liter. COLUMN-LABEL łańcuch etykieta (nagłówek) kolumny przy wyświetlaniu tabelarycznym LABEL łańcuch etykieta kolumny przy wyświetlaniu swobodnym FORMAT łańcuch format wyświetlania wartości kolumny. DEFAULT wartość-początkowa domyślna wartość kolumny. AUTOINCREMENT - powoduje automatyczne nadawanie wartości kolumny przez system podczas wstawiania nowego wiersza. PRIMARY KEY - określa kolumnę jako klucz główny. REFERENCES [nazwa tablicy] - określa kolumnę jako klucz obcy. Szczegółowy wykaz opcji - w opisie instrukcji CREATE TABLE konkretnego DBMS. #5 K.Goczyła
Tworzenie tablic - przykład Instrukcje tworzące tablice bazy danych School1: CREATE TABLE Teachers (Tno CHAR(3) NOT NULL UNIQUE, Tname CHAR(12), Title CHAR(6), City CHAR(8), SupNo CHAR(3)); CREATE TABLE Students (Sno CHAR(3) NOT NULL UNIQUE, Sname CHAR(12), Sdate DATE, City CHAR(8)); CREATE TABLE TS (Tno CHAR(3) NOT NULL, Sno CHAR(3) NOT NULL, hours INT, UNIQUE (Tno, Sno)); #6 K.Goczyła
Tworzenie tablic - przykład (cd.) Z zastosowaniem opcji definiujących klucze główne i klucze obce: CREATE TABLE Teachers (Tno CHAR(3) PRIMARY KEY, Tname CHAR(12), Title CHAR(6), City CHAR(8), SupNo CHAR(3) REFERENCES Teachers); CREATE TABLE Students (Sno CHAR(3) PRIMARY KEY, Sname CHAR(12), Sdate DATE, City CHAR(8)); CREATE TABLE TS (Tno CHAR(3) REFERENCES Teachers, Sno CHAR(3) REFERENCES Students, Hours INT, PRIMARY KEY (Tno, Sno)); #7 K.Goczyła
Zmiana schematu tablicy ALTER TABLE <nazwa tablicy> { ADD COLUMN <kolumna> <typ danych> [opcje] DROP COLUMN <kolumna> ALTER COLUMN <kolumna> [opcje] } Cel: Dodanie nowej kolumny do istniejącej tablicy. Nowa kolumna przyjmuje wartości puste (NULL). Usunięcie kolumny z istniejącej tablicy. Zmiana opcji istniejącej kolumny (ale nie typu danych!). Przykłady: ALTER TABLE Students ADD COLUMN PhoneNo Char(13); ALTER TABLE Teachers DROP COLUMN City; ALTER TABLE Teachers ALTER COLUMN Tname LABEL "Name of Teacher ; Uwaga: Nie można zmienić niektórych opcji, np. NOT NULL, UNIQUE, PRIMARY KEY,... #8 K.Goczyła
Wstawianie danych do tablicy INSERT INTO <nazwa tablicy> [( <lista kolumn> )] VALUES (<lista wartości>) Cel: Wstawienie do tablicy nowego wiersza na podstawie listy podanych wartości. Jeśli nie ma <listy kolumn>, wówczas należy podać wszystkie wartości, w kolejności kolumn tablicy wynikającej z jej schematu. Przykłady: INSERT INTO Teachers VALUES ( T6, Taylor, Prof., New York, T1 ); INSERT INTO Teachers ( TNo, TName, City ) VALUES ( T7, James, Paris ); #9 K.Goczyła
SELECT - przegląd SELECT [DISTINCT] <lista kolumn/wyrażeń> FROM <lista tablic> [ WHERE <warunek> ] [ GROUP BY <lista kolumn> ] [ HAVING <warunek> ] [ UNION <instrukcja SELECT> ] [ ORDER BY <lista kolumn/numerów> ] SELECT - określa, które kolumny z tablic podanych we frazie FROM mają zostać włączone do wyniku (projekcja). Dodatkowo, mogą zostać włączone wyrażenia. DISTINCT - powoduje wyeliminowanie duplikatów (wierszy powtarzających się). FROM -określa tablice, na jakich działa instrukcja SELECT. Jeśli jest kilka tablic, dokonywany jest produkt kartezjański tych tablic. WHERE - określa warunki wyboru wierszy z tablic wymienionych we frazie FROM (selekcja). GROUP BY - powoduje wiązanie wierszy wynikowych w grupy o jednakowych wartościach we wskazanych kolumnach, a następnie redukowanie tych grup do pojedynczych wierszy. HAVING - określa warunki wyboru dla wierszy powstałych w wyniku działania frazy GROUP BY. UNION - oblicza sumę wyników dwóch instrukcji SELECT, eliminując duplikaty (unia). ORDER BY - porządkuje wiersze wynikowe rosnąco lub malejąco według wartości wskazanych kolumn/wyrażeń. #10 K.Goczyła
SELECT - zapytania proste SELECT [DISTINCT] <lista kolumn/wyrażeń> FROM <nazwa tablicy> [ WHERE <warunek> ] Zapytanie proste przeprowadza kombinację projekcji i selekcji (jeśli występuje fraza WHERE) w stosunku do jednej tablicy. Uwaga: <lista kolumn> może przybrać formę * (co oznacza wybór wszystkich kolumn). Przykłady: 1. Pokaż identyfikatory i nazwiska wszystkich nauczycieli. SELECT TNo, TName FROM Teachers; 2. Pokaż nazwy wszystkich miast, skąd pochodzą studenci. SELECT DISTINCT City FROM Students; Uwaga: Bez słowa DISTINCT nazwy miast mogłyby się powtarzać. #11 K.Goczyła
SELECT - zapytania proste (cd.) 3. Pokaż informacje o zajęciach, które trwały ponad 95 godzin. SELECT * FROM TS WHERE Hours > 95; 4. Pokaż identyfikatory i nazwiska nauczycieli, którzy pochodzą z Londynu. SELECT TNo, TName FROM Teachers WHERE City = London ; 5. Pokaż identyfikatory, tytuły i nazwiska nauczycieli, którzy mają szefa. SELECT TNo, Title, TName FROM Teachers WHERE SupNo IS NOT NULL; #12 K.Goczyła
SELECT - zapytania proste (cd.) 6. Dla każdego studenta nauczyciela T3 pokaż średnią liczbę godzin zajęć na tydzień. Wynik: SELECT Sno, Hours/15, godz. na tydzień FROM TS WHERE Tno = T3 ; SNO EXP1 EXP2 S1 2.13 godz. na tydzień S2 2.40 godz. na tydzień S3 4.00 godz. na tydzień S5 4.80 godz. na tydzień #13 K.Goczyła
Wyrażenia Operatory języka SQL występujące w wyrażeniach we frazie SELECT, WHERE i in.: Operatory arytmetyczne: Operatory logiczne: Operatory porównania: Operatory specjalne: ** ^ - potęgowanie * / - mnożenie, dzielenie + - - dodawanie, odejmowanie NOT AND OR = > < >= <= <> Operatory porównania z wartością pustą: IN BETWEEN LIKE MATCHES IS NULL IS NOT NULL #14 K.Goczyła
Wyrażenia (cd.) Funkcje agregujące: COUNT() - zwraca liczbę wierszy wybranych w zapytaniu AVG() SUM() MIN() MAX() - oblicza średnią arytmetyczną w kolumnie numerycznej - sumuje wartości kolumn numerycznych - znajduje wartość minimalną w kolumnie znakowej, numerycznej lub daty - znajduje wartość maksymalną w kolumnie znakowej, numerycznej lub daty Funkcje zależne od DBMS operujące na datach/godzinach, łańcuchach znakowych, polach tekstowych, wielkich obiektach binarnych,... #15 K.Goczyła
Operatory specjalne IN Sprawdza, czy wartość w kolumnie jest równa jednej z wartości określonej na liście wartości lub będących wynikiem instrukcji SELECT. Przykłady: 1. WHERE City = London OR City = Davos OR City = Bristol jest równoważne: WHERE City IN ( London, Davos, Bristol ) 2. SELECT * FROM Teachers WHERE City IN (SELECT City FROM Students); Wynik: Ci nauczyciele z relacji Teachers, którzy pochodzą z miasta występującego w relacji Students. #16 K.Goczyła
Operatory specjalne (cd.) BETWEEN Sprawdza, czy wartość w kolumnie jest zawarta w przedziale wartości. Przykłady. 1. WHERE Hours >= 96 AND Hours <= 126 jest równoważne: WHERE Hours BETWEEN 96 AND 126 2. SELECT * FROM Teachers WHERE TName BETWEEN A AND C ; Wynik: TNO TNAME TITLE CITY SUPNO T1 Blake Prof London NULL T5 Adams MSc Bristol T4 gdyż Clark > C #17 K.Goczyła
LIKE Operatory specjalne (cd.) Porównuje zawartość kolumny znakowej z łańcuchem znaków, który może zawierać symbole wieloznaczne (wildcards). Łańcuch ze znakami wieloznacznymi to wzorzec. Symbole wieloznaczne: _ (podkreślenie) - pasuje do dowolnego pojedynczego znaku, % (procent) - pasuje do dowolnej liczby dowolnych znaków. Przykład: 1. Pokaż wszystkich studentów o nazwiskach rozpoczynających się na J : Wynik: SELECT SName FROM Students WHERE SName LIKE J% ; SNAME Jones Johnson Uwaga: Podobne działanie ma operator MATCHES, jednak MATCHES pozwala stosować znacznie bardziej złożone wzorce niż LIKE. Szczegóły - w dokumentacji konkretnego DBMS. #18 K.Goczyła
Operatory specjalne (cd.) CONTAINS Sprawdza, czy wartość w kolumnie znakowej zawiera wskazany łańcuch. Przykład: Pokaż wszystkich studentów, których nazwisko zawiera łańcuch "Mary": SELECT SName FROM Students WHERE SName CONTAINS Mary ; Uwaga: Łańcuch użyty w operatorze CONTAINS może zawierać znaki specjalne oznaczające OR i AND. Szczegóły - w dokumentacji konkretnego DBMS. Przykład (Progress): SELECT SName FROM Students WHERE SName CONTAINS (Mary) (Maria) ; #19 K.Goczyła
COUNT() Funkcje agregujące Przykłady: 1. COUNT(*) - zwraca liczbę wierszy w tablicy wynikowej 2. COUNT(DISTINCT <nazwa kolumny>) - zwraca liczbę różnych wartości we wskazanej kolumnie. 1. Z ilu różnych miast pochodzą studenci? Wynik: SELECT COUNT(DISTINCT City) FROM Students; COUNT1 5 2. Ilu nauczycieli pochodzi z Londynu? SELECT COUNT(*) FROM Teachers WHERE City = London ; Wynik: COUNT1 2 #20 K.Goczyła
SUM([DISTINCT] <nazwa kolumny>) MIN([DISTINCT] <nazwa kolumny>) MAX([DISTINCT] <nazwa kolumny>) AVG([DISTINCT] <nazwa kolumny>) Funkcje agregujące (cd.) Zwracają odpowiednio: sumę, minimum, maksimum i średnią z wartości podanej kolumny. Dla SUM() i AVG(), kolumna musi być numeryczna, dla MIN() i MAX() kolumna może być też kolumną znakową lub daty. Przykłady: 1. Podaj sumę godzin zajęć studenta S5. SELECT SUM(Hours) Wynik: FROM TS SUM1 WHERE SNo = S5 ; 168.00 2. Podaj minimum, maksimum i średnią godzin zajęć nauczyciela T3. SELECT MIN(Hours), MAX(Hours), AVG(Hours) FROM TS WHERE TNo = T3 ; Wynik: MIN1 MAX2 AVG3 32.00 72.00 50.00 #21 K.Goczyła
SELECT - porządkowanie wyników Bez frazy ORDER BY wyniki zapytania ukazują się w porządku nieokreślonym (zwykle w porządku wstawienia ich do tablicy) ORDER BY <nazwa kolumny/numer> [ASC/DESC] [, <nazwa kolumny/numer> [ASC/DESC]... ] Uwagi: 1.Numer kolumny we frazie ORDER BY oznacza pozycję kolumny na liście wyboru instrukcji SELECT. Trzeba go użyć, jeśli porządkujemy wg wartości wyrażenia. 2. Domyślnie przyjmowany jest porządek rosnący (ASC). Przykład 1. Pokaż alfabetycznie dane o nauczycielach (nazwisko, identyfikator i tytuł. SELECT TName, TNo,Title FROM Teachers ORDER BY Tname; Wynik: TNAME TNO TITLE Adams T5 MSc Blake T1 Prof. Clark T4 PhD Jones T3 Prof. Smith T2 PhD #22 K.Goczyła
SELECT - porządkowanie wyników (cd.) Przykład 2. Pokaż dane (ident. studenta, liczba godzin, ident. nauczyciela) o zajęciach studentów S1, S2 i S3, porządkując je rosnąco wg ident. studentów i malejąco wg liczby godzin. SELECT SNo, Hours, TNo FROM TS WHERE SNo IN ( S1, S2, S3 ) ORDER BY SNo, Hours DESC; Wynik: SNO HOURS TNO S1 96 T4 S1 64 T1 S1 32 T3 S2 100 T2 S2 64 T1 S2 36 T3 S3 120 T2 S3 96 T4 S3 60 T3 #23 K.Goczyła
SELECT - grupowanie GROUP BY <nazwa kolumny> [, <nazwa kolumny>...] [HAVING <warunek>] Fraza ta powoduje powiązanie ze sobą wierszy wynikowych z instrukcji SELECT w grupy wierszy, w których wskazane we frazie GROUP BY kolumny mają tę samą wartość. Następnie każda grupa jest redukowana do pojedynczego wiersza. W tym wierszu występują kolumny z frazy GROUP BY oraz ew. kolumny będące wynikiem funkcji agregujących. Funkcje te wówczas działają na każdej grupie osobno. Następnie eliminowane są wiersze nie spełniające warunku HAVING. Uwaga 1. Każda kolumna występująca we frazie GROUP BY musi wystąpić na liście wyboru instrukcji SELECT, i na odwrót. Uwaga 2. W warunku HAVING może wystąpić funkcja agregująca (ale nie w warunku WHERE!). Przykład 1. Dla każdego nauczyciela pokaż, z iloma studentami miał zajęcia. SELECT Tno, COUNT(*) FROM TS GROUP BY Tno; Wynik: TNO T1 2 T2 3 T3 4 T4 3 T5 1 COUNT1 #24 K.Goczyła
SELECT - grupowanie (cd.) Przykład 2. Dla każdego studenta oblicz sumę godzin jego zajęć. Pokaż tylko identyfikatory tych studentów, dla których ta suma przekracza 160. Wynik uporządkuj malejąco wg liczby godzin. Wynik: SELECT SNo, SUM(Hours) FROM TS GROUP BY SNo HAVING SUM(Hours) > 160 ORDER BY 2 DESC; SNO SUM1 S3 276 S2 196 S1 192 #25 K.Goczyła
SELECT - złączenia Jeśli fraza FROM zawiera więcej niż jedną tablicę, instrukcja SELECT wykonuje produkt kartezjański (operator TIMES) wskazanych tablic. Jeśli dodatkowo występuje fraza WHERE, wykonywana jest operacja relacyjnego złączenia. Przykład 1. Pokaż informacje o wszystkich zajęciach nauczyciela T4, podając identyfikatory i nazwiska studentów oraz liczby godzin. Wynik uporządkuj alfabetycznie wg nazwisk studentów. SELECT SName, TS.SNo, Hours FROM TS, Students WHERE TS.SNo = Students.SNo AND TNo = T4 ORDER BY SName; Wynik: STUDENTS.SNAME TS.SNO TS.HOURS Ford S5 96 Henry S1 96 Johnson S3 96 #26 K.Goczyła
SELECT - złączenia (cd.) Przykład 2. Pokaż wszystkie pary (nauczyciel, student) takie, że nauczyciel i student pochodzą z tego samego miasta. Podaj identyfikatory i nazwiska studentów i nauczycieli. Wynik uporządkuj alfabetycznie wg nazw miast, a potem wg nazwisk nauczycieli i studentów. Wynik: SELECT T.City, TName, TNo, SName, SNo FROM Teachers T, Students S WHERE T.City = S.City ORDER BY T.City, TName, SName; T.CITY T.TNAME T.TNO S.SNAME S.SNO Bristol Adams T5 Ford S5 London Blake T1 Henry S1 London Blake T1 Higgins S4 London Jones T3 Henry S1 London Jones T3 Higgins S4 Uwaga: S i T są aliasami tablic. W tym przykładzie służą tylko do skrócenia zapisu. #27 K.Goczyła
SELECT - złączenia (cd.) Przykład 3. Dla każdego nauczyciela pokaż jego nazwisko, identyfikator i sumę godzin zajęć. Wynik uporządkuj alfabetycznie wg nazwisk. SELECT TName, TS.TNo, SUM(Hours) FROM Teachers T, TS WHERE T.TNo = TS.TNo GROUP BY TName, TS.TNo ORDER BY TName; Wynik: T.TNAME TS.TNO SUM1 Adams T5 32.00 Blake T1 128.00 Clark T4 288.00 Jones T3 200.00 Smith T2 340.00 #28 K.Goczyła
SELECT - złączenia (cd.) Złączenie tablicy z tą samą tablicą nazywamy samozłączeniem. Samozłączenie umożliwia wiązanie ze sobą informacji zawartych w różnych wierszach jednej tablicy. Do dokonania samozłączenia konieczne jest zastosowanie aliasów (nazw korelacji). Przykład 4. Dla każdego nauczyciela pokaż listę nauczycieli, którzy są jego podwładnymi. Wynik uporządkuj alfabetycznie wg nazwisk szefów, a potem wg nazwisk podwładnych. Wynik: SELECT Over.TName, Over.TNo, jest szefem dla, Under.TName, Under.TNo FROM Teachers Under, Teachers Over WHERE Under.SupNo = Over.TNo ORDER BY Over.TName, Under.TName; OVER.TNAME OVER.TNO EXP1 UNDER.TNAME UNDER.TNO Blake T1 jest szefem dla Jones T3 Blake T1 jest szefem dla Smith T2 Clark T4 jest szefem dla Adams T5 Jones T3 jest szefem dla Clark T4 #29 K.Goczyła
SELECT - podzapytania W podzapytaniu instrukcja SELECT jest zagnieżdżona we frazie WHERE lub HAVING. Zagnieżdżona instrukcja SELECT, zwana zapytaniem wewnętrznym, dostarcza wartości dla warunku WHERE lub HAVING. Instrukcja SELECT zawierająca podzapytanie to zapytanie zewnętrzne. Przykłady: 1. Pokaż dane o zajęciach nauczycieli pochodzących z Londynu. SELECT * FROM TS WHERE TNo IN (SELECT TNo FROM Teachers WHERE City = London ) ; 2. Pokaż identyfikatory i nazwiska nauczycieli, którzy prowadzili chociaż jedne zajęcia, które trwały ponad 64 godziny. SELECT TNo, TName FROM Teachers WHERE TNo IN (SELECT TNo FROM TS WHERE Hours > 64) ; #30 K.Goczyła
SELECT - podzapytania (cd.) 3. Pokaż identyfikatory i nazwiska nauczycieli, którzy prowadzili chociaż jedne zajęcia, które trwały dłużej niż wynosi średnia liczba godzin na jedno zajęcie. SELECT TNo, TName FROM Teachers WHERE TNo IN (SELECT TNo FROM TS WHERE Hours > (SELECT AVG(Hours) FROM TS)); 4. Pokaż nazwiska, identyfikatory i tytuły nauczycieli, dla których łączna liczba godzin zajęć przekracza 200. Uporządkuj wynik alfabetycznie wg nazwisk. SELECT TName, TNo, Title FROM Teachers WHERE TNo IN (SELECT TNo FROM TS GROUP BY TNo HAVING SUM(Hours) > 200) ORDER BY TName; #31 K.Goczyła
SELECT - podzapytania (cd.) 5. Pokaż dane o zajęciach, w których nauczyciel lub student pochodzą z Londynu. Uporządkuj wyniki wg identyfikatorów nauczycieli i studentów. SELECT * FROM TS WHERE TNo IN (SELECT TNo FROM Teachers WHERE City = London ) OR SNo IN (SELECT SNo FROM Students WHERE City = London ) ORDER BY TNo, SNo; #32 K.Goczyła
SELECT - podzapytania (cd.) W warunku WHERE może wystąpić operator EXISTS (predykat). EXISTS zwraca True, jeśli podzapytanie zwraca choć jeden wiersz, a False w przeciwnym wypadku. 6. Pokaż dane o nauczycielach, którzy uczyli studenta S1. SELECT * FROM Teachers WHERE EXISTS (SELECT * FROM TS WHERE Teachers.TNo = TS.TNo AND TS.SNo = S1 ); 7. Pokaż dane (ident. i nazwisko) studentów, których nie uczył nauczyciel T3. SELECT SNo, SName FROM Students WHERE NOT EXISTS (SELECT * FROM TS WHERE Students.SNo = TS.SNo AND TS.TNo = T3 ); #33 K.Goczyła
SELECT - podzapytania (cd.) 8. Pokaż dane (ident., nazwisko, tytuł) o nauczycielach, którzy uczyli wszystkich studentów. SELECT TNo, TName, Title FROM Teachers WHERE NOT EXISTS (SELECT * FROM Students WHERE NOT EXISTS (SELECT * FROM TS WHERE Teachers.TNo = TS.Tno AND Students.SNo = TS.SNo)); #34 K.Goczyła
SELECT - podzapytania (cd.) 9. Pokaż identyfikatory nauczycieli, którzy uczyli więcej niż jednego studenta. SELECT DISTINCT TS1.TNo FROM TS TS1 WHERE EXISTS (SELECT * FROM TS TS2 WHERE S1.TNo = TS2.TNo AND TS1.SNo <> TS2.SNo); 10. Pokaż nazwiska i identyfikatory tych nauczycieli, którzy są szefami. SELECT Over.TName, Over.TNo FROM Teachers Over WHERE EXISTS (SELECT * FROM Teachers Under WHERE Over.TNo = Under.SupNo); Uwaga: Ten sam wynik można uzyskać za pomocą złączenia podobnego do tego z przykładu 4 sekcji "SELECT - złączenia". #35 K.Goczyła
Wstawianie danych z innych tablic INSERT INTO <nazwa tablicy> [( <lista kolumn> )] < instrukcja SELECT > Cel: Wstawienie do jednej tablicy wierszy wybranych z innej tablicy lub innych tablic. Przykład: Załóżmy, że tablica Students1 ma tę samą strukturę co tablica Students. Instrukcja: INSERT INTO Students SELECT * FROM Students1 WHERE SYear > 1990; wstawia do tablicy Students wszystkie wiersze z tablicy Students1 dotyczące studentów, którzy rozpoczęli naukę po roku 1990. #36 K.Goczyła
Zachowywanie wyników w zapytania Niektóre DBMS pozwalają na zachowywanie wyników instrukcji SELECT w tablicy tymczasowej, przez zastosowanie frazy podobnej do poniższej: INTO TEMP <nazwa tablicy> (<lista kolumn>) Tablica tymczasowa jest tworzona przez instrukcję SELECT zgodnie z typami danych umieszczonych na liście wyboru instrukcji SELECT. Tablica taka jest automatycznie kasowana podczas zamykania bazy danych przez bieżącego użytkownika. Tablica tymczasowa może być używana we frazach FROM następnych instrukcji SELECT. W ten sposób można rozbijać skomplikowane zapytania na kilka etapów. #37 K.Goczyła
Przykład. Zachowywanie wyników w zapytania (cd.) Pokaż nazwiska, identyfikatory i tytuły tych nauczycieli, którzy mieli zajęcia o łącznej długości przekraczającej średnią łączną długość zajęć na jednego nauczyciela. Wynik uporządkuj alfabetycznie wg nazwisk. SELECT TNo, SUM(Hours) FROM TS GROUP BY TNo INTO TEMP Tsum(TNo, HSum); SELECT TName, TNo, Title FROM Teachers WHERE TNo IN (SELECT TNo FROM Tsum WHERE Hsum > (SELECT AVG(Hsum) FROM Tsum)); ORDER BY TName; Tablica TSUM zawiera sumy godzin zajęć dla każdego nauczyciela. W drugim zapytaniu z tablicy TEACHERS wybieramy tylko tych nauczycieli, dla których suma godzin z tablicy TSUM przekracza średnią z tych sum. #38 K.Goczyła
Zachowywanie wyników w zapytania (cd.) Niektóre systemy DBMS nie dają możliwości bezpośredniego zachowywania wyników instrukcji SELECT w tablicy tymczasowej (tzn. składnia instrukcji SELECT nie zawiera opcjonalnej frazy INTO TEMP lub podobnej). W takich wypadkach należy jawnie utworzyć nową tablicę i zastosować wsadową wersję instrukcji INSERT: SELECT... FROM... WHERE...... INTO TEMP Tab1(kol1, kol2,...); Przykład: SELECT TNo, Tname FROM Teachers WHERE Title = Prof. INTO TEMP Profes (PNo, PName); CREATE TABLE Tab1 (kol1 typ1, kol2 typ2,...); INSERT INTO Tab1 SELECT... FROM... WHERE...; CREATE TABLE Profes (PNo Char(4), Pname Char(12)); INSERT INTO Profes SELECT TNo, Tname FROM Teachers WHERE Title = Prof. ; #39 K.Goczyła
Aktualizowanie danych UPDATE <nazwa tablicy> SET <nazwa kolumny> = <wyrażenie> [, <nazwa kolumny> = <wyrażenie>...] [ WHERE <warunek> ] Cel: Zmiana wartości w kolumnach jednego lub wielu wierszy tablicy. Przykłady: 1. Prof. Blake (ident. T1) zmienił przeniósł się z Londynu do Birmingham. UPDATE Teachers SET City = Birmingham WHERE TNo = T1 ; 2. Okazało się, że pan Jones (ident. T3) miał ze wszystkimi swoimi studentami o 8 godzin więcej niż to zostało poprzednio zapisane. Trzeba dokonać następującej aktualizacji: UPDATE TS SET Hours = Hours+8 WHERE Tno = T3 ; 3. Okazało się, że niektóre dane o studencie S3 zostały błędnie zapisane w bazie danych. Trzeba zmienić wartość kilku pól. UPDATE Students SET Sname = Johnsone, Syear = 1984, City = Diblan WHERE Sno = S3 ; #40 K.Goczyła
Usuwanie danych DELETE FROM <nazwa tablicy> [ WHERE <warunek> ] Cel: Usunięcie z tablicy jednego lub wielu wierszy. Przykłady: 1. Prof. Blake (ident. T1) zmienił miejsce pracy. Należy usunąć zapis o nim z tablicy Teachers (gdzie przechowujemy dane tylko o aktualnie zatrudnionych nauczycielach) i przenieść je do tablicy Teachers1 (o strukturze takiej samej jak Teachers), pełniącej rolę archiwum. INSERT INTO Teachers1 SELECT * FROM Teachers WHERE TNo = T1 ; DELETE FROM Teachers WHERE TNo = T1 ; 2. Przy końcu roku akademickiego przenosimy wszystkie rekordy z tablicy TS do TS1, w której przechowujemy dane archiwalne z tablicy TS. Następnie czyścimy tablicę TS. INSERT INTO TS1 SELECT * FROM TS; DELETE FROM TS; #41 K.Goczyła
Sumowanie tablic <instrukcja SELECT> UNION [ALL] <instrukcja SELECT> Cel: Realizacja operacji algebry relacji UNION w stosunku do tablic będących wynikiem dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne. Uwagi: 1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL. 2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy kolumn z pierwszej tablicy. 3. Jeśli po UNION występuje fraza ORDER BY, muszą w niej występować numery, a nie nazwy kolumn. Przykład: Pokaż alfabetycznie nazwy miast, skąd pochodzą studenci lub nauczyciele. SELECT City FROM Teachers UNION SELECT City FROM Students ORDER BY 1; #42 K.Goczyła CITY Adelaide Bristol Davos Dublin Glasgow Liverpool London
Odejmowanie tablic (SQL-92) <instrukcja SELECT> MINUS [ALL] <instrukcja SELECT> Cel: Realizacja operacji algebry relacji MINUS w stosunku do tablic będących wynikiem dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne. Uwagi: 1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL. 2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy kolumn z pierwszej tablicy. 3. Jeśli po MINUS występuje fraza ORDER BY, muszą w niej występować numery, a nie nazwy kolumn. Przykład: Pokaż alfabetycznie nazwy miast, skąd pochodzą studenci, ale nie nauczyciele. SELECT City FROM Students MINUS SELECT City FROM Teachers ORDER BY 1; CITY Adelaide Davos Dublin #43 K.Goczyła
Przecinanie tablic (SQL-92) <instrukcja SELECT> INTERSECT [ALL] <instrukcja SELECT> Cel: Realizacja operacji algebry relacji INTERSECT w stosunku do tablic będących wynikiem dwóch lub więcej instrukcji SELECT. Tablice muszą być zgodne. Uwagi: 1. Z tablicy wynikowej usuwane są wiersze powtarzające się (duplikaty), chyba że występuje ALL. 2. Jeśli nazwy kolumn sumowanych tablic są różne, tablica wynikowa przyjmuje nazwy kolumn z pierwszej tablicy. 3. Jeśli po INTERSECT występuje fraza ORDER BY, muszą w niej występować numery, a nie nazwy kolumn. Przykład: Pokaż alfabetycznie nazwy miast, skąd pochodzą zarówno studenci, jak i nauczyciele. SELECT City FROM Students INTERSECT SELECT City FROM Teachers ORDER BY 1; CITY Bristol London #44 K.Goczyła
Tworzenie indeksów CREATE [UNIQUE] INDEX <nazwa indeksu> ON <nazwa tablicy> (<nazwa kolumny> [ASC/DESC] [, <nazwa kolumny> [ASC/DESC]... ]); Cel: Tworzy indeks na określonych kolumnach, zwanych kluczami indeksu. Domyślnie, indeks jest rosnący (ASC). Fraza UNIQUE oznacza, że kolumny indeksu zawierają wartości niepowtarzalne. Przykłady: CREATE UNIQUE INDEX TeachInd ON Teachers (Tno ); CREATE UNIQUE INDEX TSInd ON TS (Tno, SNo ); CREATE INDEX HrsInd ON TS (Sno, Hours DESC); #45 K.Goczyła
Tworzenie indeksów (cd.) Co to jest indeks? Jest to tablica zawierająca w jednej kolumnie wartości klucza, a w drugiej adresy wierszy w indeksowanej tablicy, które zawierają te wartości. Do czego służy? 1. Pozwala zwiększyć efektywność przetwarzania żądań dostępu do danych z tablicy (instrukcji SELECT). 2. Porządkuje wiersze tablicy w określonym porządku. 3. Zapobiega powtarzaniu się wartości w wierszach tablicy. Kiedy tworzyć indeks? 1. Gdy tablica jest często przetwarzana sekwencyjnie zgodnie z wartościami pewnej kolumny (rosnąco lub malejąco). 2. Gdy konieczne jest zachowanie unikatowości wartości kolumn(y). 3. Gdy dostęp do tablicy jest często realizowany zgodnie z wartościami danej kolumny lub kolumn (dostęp asocjacyjny). Jaki jest koszt? 1. Koszt pamięciowy (utrzymywanie dodatkowych danych). 2. Koszt czasowy (konieczność aktualizacji indeksu podczas aktualizowania tablicy (instrukcje INSERT, UPDATE, DELETE). #46 K.Goczyła
Tworzenie indeksów - przykłady Przykład 1: CREATE INDEX TSHours ON TS (Hours DESC); TSHours TS Hours RecNo TNO SNO HOURS RecNo 120 4 T1 S1 64 1 120 5 T1 S2 64 2 100 3 T2 S2 100 3 96 10 T2 S3 120 4 96 11 T2 S4 120 5 96 12 T3 S1 32 6 72 9 T3 S2 36 7 64 1 T3 S3 60 8 64 2 T3 S5 72 9 60 8 T4 S1 96 10 36 7 T4 S3 96 11 32 6 T4 S5 96 12 32 13 T5 S6 32 13 #47 K.Goczyła
Tworzenie indeksów - przykłady (cd.) Przykład 2: CREATE INDEX StudHrs ON TS (Sno, Hours); StudHrs TS SNo+Hours RecNo TNo SNo Hours RecNo S1 + 32 6 T1 S1 64 1 S1 + 64 1 T1 S2 64 2 S1 + 96 10 T2 S2 100 3 S2 + 36 7 T2 S3 120 4 S2 + 64 2 T2 S4 120 5 S2 + 100 3 T3 S1 32 6 S3 + 60 8 T3 S2 36 7 S3 + 96 11 T3 S3 60 8 S3 + 120 4 T3 S5 72 9 S4 + 120 5 T4 S1 96 10 S5 + 72 9 T4 S3 96 11 S5 + 96 12 T4 S5 96 12 S6 + 32 13 T5 S6 32 13 #48 K.Goczyła
Indeksy bitmapowe (Oracle) Przykład: CREATE BITMAP INDEX Titles ON Teachers (Title); Titles MSc PhD Prof 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 Rowid 1 2 3 4 5 Teachers TNO TNAME TITLE CITY SUPNO Rowid T1 Blake Prof. London NULL 1 T2 Smith PhD Glasgow T1 2 T3 Jones Prof. London T1 3 T4 Clark PhD Liverpool T3 4 T5 Adams MSc Bristol T4 5 Indeks bitmapowy warto stosować wtedy, gdy liczba różnych wartości indeksowanej kolumny jest b. mała w stosunku do liczby wierszy tablicy i jest z góry znana (nie rośnie). Typowym zastosowaniem są systemy przetwarzania danych w hurtowniach danych (bardzo obszerne dane, ale niezmienne w czasie). #49 K.Goczyła
Widoki Widok (wirtualna tablica) Kombinacja wierszy i kolumn wybranych z jednej lub kilku tablic. Po utworzeniu widoku można na nim wykonywać instrukcje SELECT jak na zwykłej tablicy. W bazie danych (w słowniku danych) pamiętana jest jedynie definicja widoku. Widok jest materializowany w razie potrzeby. Korzy ści ze stosowania widoków: Te same dane mogą być widziane w różny sposób przez różnych użytkowników. Pozwalają koncentrować się ma danych istotnych, a ignorować inne. Wprowadzają dodatkowy poziom niezależności od danych: Jeśli zmieni się coś w schemacie bazy danych, często wystarczy zmienić definicję widoku, nie zmieniając programu. Wprowadzają ochronę danych przez ich ukrycie: Użytkownicy "widzą" tylko widoki, czyli tylko te dane, do których mają prawo dostępu. Różnice między widokami a tablicami: Widoki nie zawierają danych; zawierają tylko informacje, jak zebrać te dane w razie potrzeby (tzn. z jakich tablic, z jakich kolumn i w jaki sposób). Widoków nie można indeksować (ale można indeksować tablice wchodzące w skład widoku). W ogólności, nie można aktualizować danych poprzez widok. #50 K.Goczyła
Tworzenie widoków CREATE VIEW <nazwa widoku> [ <lista kolumn> ] AS <instrukcja SELECT > [WITH CHECK OPTION] Cel: Utworzenie widoku (wirtualnej tablicy). Opcjonalna <lista kolumn> określa nazwy kolumn widoku. Jeśli jej nie ma, nazwy kolumn pochodzą z instrukcji SELECT widoku. WITH CHECK OPTION Gwarantuje, że wszystkie aktualizacje widoku (jeśli widok jest aktualizowalny) spełniają warunki występujące we frazie WHERE instrukcji SELECT. Przykład 1. (widok aktualizowalny) CREATE VIEW TopTeachers AS SELECT TNo, TName, Title FROM Teachers WHERE Title <> 'MSc' WITH CHECK OPTION; SELECT * FROM TopTeachers; Wynik zapytania: TNO TNAME TITLE T1 Blake Prof. T2 Smith PhD T3 Jones Prof. T4 Clark PhD #51 K.Goczyła