Schemat bazy danych, wczytanej z pliku create_tables.sql Relacji między tabelami klucze obce Klucz obcy jako ograniczenie dla kolumny customer_id INTEGER NOT NULL REFERENCES customer(customer_id), CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id)); 14 listopada 2011 Strona 1
Klucz obcy jako ograniczenie dla tabeli customer_id INTEGER NOT NULL, CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id), CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES customer(customer_id)); Ponownie wypełniamy tabelę orderinfo (pop_orderinfo.sql) Zawartość tabeli orderinfo SELECT orderinfo_id, customer_id FROM orderinfo; Próba usunięcia rekordu customer_id = 3 z tablicy customer DELETE FROM customer WHERE customer_id =3; 14 listopada 2011 Strona 2
Próba wstawienia rekordu odnoszącego się do nieistniających wartość z tabeli customer INSERT INTO orderinfo(customer_id, date_placed, shipping) VALUES (250, '07-25-2000', 0.00); Ograniczenia dla klucza obcego DROP TABLE orderline; CREATE TABLE orderline( orderinfo_id INTEGER NOT NULL, item_id INTEGER NOT NULL, quantity INTEGER NOT NULL, CONSTRAINT orderline_pk PRIMARY KEY(orderinfo_id, item_id), CONSTRAINT orderline_orderinfo_id_fk FOREIGN KEY(orderinfo_id) REFERENCES orderinfo (orderinfo_id), CONSTRAINT orderline_item_id_fk FOREIGN KEY(item_id) REFERENCES item (item_id)); Ustawienie kluczy obcych implikuje kolejność wypełniania tabel :item, orderinfo, orderline Obsługa naruszeń integralności podczas aktualizacji i usuwania rekordów. customer_id INTEGER NOT NULL, CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id), CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES customer(customer_id)on DELETE CASCADE); Usunięcie wiersza z tabeli customer, powoduje usunięcie wszystkich powiązanych z nim rekordów w tablicy ordeline. 14 listopada 2011 Strona 3
customer_id INTEGER NOT NULL, CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id), CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES customer(customer_id)on DELETE SET NULL); Usunięcie wiersza z tabeli customer, powoduje wstawienie w powiązanych z nim rekordach w polu customer_id wartości NULL. DROP TABLE customer RESTRICT; Złączenia Wszystkie zamówienia złożone przez Ann Stones SELECT c.fname, o.date_placed FROM customer c, orderinfo o WHERE c.customer_id = o.customer_id AND c.fname = Ann AND c.lname = Stones ; SELECT c.fname, o.date_placed FROM customer c JOIN orderinfo o ON c.customer_id=o.customer_id WHERE c.fname = 'Ann' AND c.lname = 'Stones'; Wszystkie zamówienia złożone przez Ann Stones wraz z identyfikatorami produktów SELECT customer.fname, customer.lname, orderinfo.date_placed, orderline.item_id,orderline.quantity FROM customer, orderinfo, orderline WHERE customer.customer_id = orderinfo.customer_id AND orderinfo.orderinfo_id = orderline.orderinfo_id AND customer.fname = 'Ann' AND customer.lname = 'Stones'; SELECT customer.fname, customer.lname, orderinfo.date_placed, orderline.item_id,orderline.quantity FROM ((customer JOIN orderinfo ON customer.customer_id = orderinfo.customer_id) JOIN orderline ON orderinfo.orderinfo_id = orderline.orderinfo_id) WHERE customer.fname = 14 listopada 2011 Strona 4 'Ann' AND customer.lname = 'Stones';
Wszystkie zamówione przez Ann Stones produkty. SELECT customer.fname, customer.lname, orderinfo.date_placed, item.description, quantity FROM customer, orderinfo, orderline, item WHERE customer.customer_id = orderinfo.customer_id AND orderinfo.orderinfo_id = orderline.orderinfo_id AND orderline.item_id = item.item_id AND customer.fname = 'Ann' AND customer.lname = 'Stones'; SQL funkcje agregujące. Ilu klientów mieszka w Bingham?. SELECT COUNT(*)FROM customer WHERE town = 'Bingham'; Ilu klientów mieszka w poszczególnych miastach?. SELECT COUNT(*), town FROM customer GROUP BY town; Ilu klientów mieszka w poszczególnych miastach i ile jest tam osób o tych samych nazwiskach?. SELECT COUNT(*), lname, town FROM customer GROUP BY town, lname; Uwaga! Używanie funkcji grupującej wewnątrz klauzuli WHERE nie jest poprawne. Należy wykorzystać klauzulę HAVING Znaleźć nazwiska wszystkich klientów i miast, skąd oni pochodzą z wyjątkiem miasta Lincoln. Istotne są tylko te miasta gdzie jest więcej niż jeden klient.. SELECT lname, town FROM customer WHERE town <> 'Lincoln'; SELECT COUNT(*) AS number,lname, town FROM customer WHERE town <> 'Lincoln' GROUP BY lname, town; SELECT COUNT(*) AS number,lname, town FROM customer WHERE town <> 'Lincoln' GROUP BY lname, town HAVING COUNT(*)>1; Do ilu klientów nie znamy numeru telefonu?. 14 SELECT listopada COUNT 2011 (phone)from customer; Strona 5
Zadania Proszę rozbudować skrypt z poprzednich zajęć, tak aby tworzył tabele zgodnie ze schematem. Tabela dept powinna składać się z następujących pól: deptno numer departamentu - numeric (2,0) klucz główny; dname nazwisko departamentu - varchar(14); loc numer lokalu - varchar(13); W tabeli emp pole depno jest kluczem obcym łączący z tabelą Wypełnienie tabeli emp INSERT INTO EMP VALUES(7369,'SMITH','CLERK',7902,'17-12-1980',800,NULL,20); INSERT INTO EMP VALUES(7499,'ALLEN','SALESMAN',7698,'20-2-1981',1600,300,30); INSERT INTO EMP VALUES(7521,'WARD','SALESMAN',7698,'22-2-1981',1250,500,30); INSERT INTO EMP VALUES(7566,'JONES','MANAGER',7839,'2-4-1981',2975,NULL,20); INSERT INTO EMP VALUES(7654,'MARTIN','SALESMAN',7698,'28-9-1981',1250,1400,30); INSERT INTO EMP VALUES(7698,'BLAKE','MANAGER',7839,'1-5-1981',2850,NULL,30); INSERT INTO EMP VALUES(7782,'CLARK','MANAGER',7839,'9-6-1981',2450,NULL,10); INSERT INTO EMP VALUES(7788,'SCOTT','ANALYST',7566,date '13-JUL-87'-85,3000,NULL,20); INSERT INTO EMP VALUES(7839,'KING','PRESIDENT',NULL,'17-11-1981',5000,NULL,10); INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'8-9-1981',1500,0,30); INSERT INTO EMP VALUES(7876,'ADAMS','CLERK',7788,date '13-JUL-87'-51,1100,NULL,20); INSERT INTO EMP VALUES(7900,'JAMES','CLERK',7698,'3-12-1981',950,NULL,30); INSERT INTO EMP VALUES(7902,'FORD','ANALYST',7566,'3-12-1981',3000,NULL,20); INSERT INTO EMP VALUES(7934,'MILLER','CLERK',7782,'23-1-1982',1300,NULL,10); Wypełnienie tabeli dept INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'); INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS'); INSERT INTO DEPT VALUES (30,'SALES','CHICAGO'); INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON'); 14 listopada 2011 Strona 6
Wypełnienie tabeli salgrade INSERT INTO SALGRADE VALUES (1,700,1200); INSERT INTO SALGRADE VALUES (2,1201,1400); INSERT INTO SALGRADE VALUES (3,1401,2000); INSERT INTO SALGRADE VALUES (4,2001,3000); INSERT INTO SALGRADE VALUES (5,3001,9999); Wykonując kolejne polecenia, proszę kwerendy zapisywać do pliku 1. Wyświetlić nazwiska i nazwy departamentów wszystkich pracowników w kolejności alfabetycznej. 2. Wyświetl nazwiska pracowników zatrudnionych w Dallas 3. Wyświetl nazwiska i pensje pracowników oraz ich klasę zaszeregowania 4. Wybierz nazwiska, pensje i klasę zaszeregowania. Pracowników(emp) których zarobki odpowiadają klasie 3 5. Wyświetl nazwiska i pensje pracowników którzy zarabiają mniej od swoich kierowników 6. Wyświetl stanowiska występujące w działach 10 i 30 7. Oblicz średni zarobek w firmie 8. Znajdź minimalne zarobki na stanowisku CLERK 9. Ilu pracowników zatrudniono w departamencie 20 10. Jakie są średnie zarobki na każdym stanowisku pracy 11. Jakie są maksymalne zarobki dla każdego stanowiska 12. Wyświetlić średnie zarobki dla departamentów zatrudniających powyżej 3 pracowników 13. Jaka jest różnica między najwyższą i najniższą pensją? 14. Ilu podwładnych ma każdy kierownik? 15. Jaka jest średnia pensja w każdej klasie zarobkowej? 16. Ilu pracowników jest w każdej klasie zarobkowej? 17. Znaleźć pracowników z pensją równą minimalnej pensji w firmie 18. Wyświetlić nazwy działów w których pracują urzędnicy (CLERK) 19. Którzy pracownicy zarabiają powyżej średniej w swoich departamentach? 20. Znaleźć departamenty w których nie ma pracowników. 14 listopada 2011 Strona 7