Laboratorium 3 - Złączenia i funkcje agregujące.
Transkrypt
Laboratorium 3 - Złączenia i funkcje agregujące.
PostgreSQL zajęcia 2 Schemat bazy danych, wczytanej z pliku create_tables.sql Relacji między tabelami – klucze obce Klucz obcy jako ograniczenie dla kolumny DROP TABLE orderinfo; CREATE TABLE orderinfo( orderinfo_id SERIAL, customer_id INTEGER NOT NULL REFERENCES customer(customer_id), date_placed DATE NOT NULL, date_shipped DATE, shipping NUMERIC(7,2), CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id)); 14 listopada 2011 Strona 1 PostgreSQL zajęcia 2 Klucz obcy jako ograniczenie dla tabeli DROP TABLE orderinfo; CREATE TABLE orderinfo( orderinfo_id SERIAL, customer_id INTEGER NOT NULL, date_placed DATE NOT NULL, date_shipped DATE, shipping NUMERIC(7,2), 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 PostgreSQL zajęcia 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 . DROP TABLE orderinfo; CREATE TABLE orderinfo( orderinfo_id SERIAL, customer_id INTEGER NOT NULL, date_placed DATE NOT NULL, date_shipped DATE, shipping NUMERIC(7,2), 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 PostgreSQL zajęcia 2 DROP TABLE orderinfo; CREATE TABLE orderinfo( orderinfo_id SERIAL, customer_id INTEGER NOT NULL, date_placed DATE NOT NULL, date_shipped DATE, shipping NUMERIC(7,2), 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'; PostgreSQL zajęcia 2 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 PostgreSQL zajęcia 2 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 INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO EMP EMP EMP EMP EMP EMP EMP EMP EMP EMP EMP EMP EMP EMP VALUES(7369,'SMITH','CLERK',7902,'17-12-1980',800,NULL,20); VALUES(7499,'ALLEN','SALESMAN',7698,'20-2-1981',1600,300,30); VALUES(7521,'WARD','SALESMAN',7698,'22-2-1981',1250,500,30); VALUES(7566,'JONES','MANAGER',7839,'2-4-1981',2975,NULL,20); VALUES(7654,'MARTIN','SALESMAN',7698,'28-9-1981',1250,1400,30); VALUES(7698,'BLAKE','MANAGER',7839,'1-5-1981',2850,NULL,30); VALUES(7782,'CLARK','MANAGER',7839,'9-6-1981',2450,NULL,10); VALUES(7788,'SCOTT','ANALYST',7566,date '13-JUL-87'-85,3000,NULL,20); VALUES(7839,'KING','PRESIDENT',NULL,'17-11-1981',5000,NULL,10); VALUES(7844,'TURNER','SALESMAN',7698,'8-9-1981',1500,0,30); VALUES(7876,'ADAMS','CLERK',7788,date '13-JUL-87'-51,1100,NULL,20); VALUES(7900,'JAMES','CLERK',7698,'3-12-1981',950,NULL,30); VALUES(7902,'FORD','ANALYST',7566,'3-12-1981',3000,NULL,20); VALUES(7934,'MILLER','CLERK',7782,'23-1-1982',1300,NULL,10); Wypełnienie tabeli dept INSERT INSERT INSERT INSERT INTO INTO INTO INTO DEPT DEPT DEPT DEPT 14 listopada 2011 VALUES (10,'ACCOUNTING','NEW YORK'); VALUES (20,'RESEARCH','DALLAS'); VALUES (30,'SALES','CHICAGO'); VALUES (40,'OPERATIONS','BOSTON'); Strona 6 PostgreSQL zajęcia 2 Wypełnienie tabeli salgrade INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO SALGRADE SALGRADE SALGRADE SALGRADE SALGRADE VALUES VALUES VALUES VALUES VALUES (1,700,1200); (2,1201,1400); (3,1401,2000); (4,2001,3000); (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