Typy numeryczne Typy daty i czasu. W celu uniknięcia niejasności czy zapis 11-08-2005 oznacza - 11 sierpnia 2005, czy może 8 listopada 2005, należy ustalić sposób interpretacji daty (europejski lub amerykański). SET DATESTYLE TO { US EUROPEAN } Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem. Formaty wprowadzania daty: 9 september 2006 sposób pewny, niewrażliwy na styl zapisu, 2006-09-08 rok-miesiąc-dzień, niewrażliwy na styl zapisu, 09-08-2004 - miesiąc-dzień -rok w stylu US, dzień -miesiąc-rok w stylu EUROPEAN, 9/8/2004 - miesiąc-dzień -rok w stylu US, dzień -miesiąc -rok w stylu EUROPEAN, 20130506 - rok- miesiąc-dzień, niewrażliwy na styl zapisu, 130506- rok- miesiąc-dzień, niewrażliwy na styl zapisu, 2007.056 rok i dzień roku, Formaty wprowadzania czasu: 03:02:07.122 godzina:minuta:sekunda.mikrosekunda, 04:06:34 godzina:minuta:sekunda, 07:37 godzina:minuta, 07:34 AM to samo co 07:34, 07:34 PM to samo co 19:34. 23 października 2017 Strona 1
Schemat bazy danych, wczytanej z pliku create_tables.sql (\i create_tables.sql) Wypełnienie tablic pliki pop_*.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)); 23 października 2017 Strona 2
Jako kolumny referencyjne mogą służyć kolumny klucza głównego, lub kolumny objęte klauzulą UNIQUE. town_id VARCHAR(32) NOT NULL REFERENCES customer(town), CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id)); 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 (\i pop_orderinfo.sql) Zawartość tabeli orderinfo SELECT orderinfo_id, customer_id FROM orderinfo; 23 października 2017 Strona 3
Próba usunięcia rekordu customer_id = 3 z tablicy customer DELETE FROM customer WHERE customer_id =3; 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), 23 października 2017 Strona 4 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 orderinfo. 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; 23 października 2017 Strona 5
Złączenia Iloczyn kartezjański dwóch tabel: SELECT * FROM customer, orderinfo; 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'; Ćwiczenie: Wszystkie zamówienia złożone przez Ann Stones wraz z identyfikatorami produktów Wszystkie zamówione przez Ann Stones produkty. 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 (proszę podać nazwisko) 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 23 października 2017 Strona 6
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 znamy numer telefonu?. SELECT COUNT (phone)from customer; Funkcje agregujące: Ćwiczenia Proszę podać średni czas oczekiwania na zamówienie. Proszę podać ile razy kupowane były poszczególne towary (identyfikator, opis, ilość zakupów). 23 października 2017 Strona 7
Zadania Proszę stworzyć skrypt, który pozwoli na utworzenie bazy danych zgodnie ze schematem, a następnie wypełnić tabele danymi podanymi poniżej. Tabela emp: EMPNO NUMERIC(4) klucz główny identyfikator pracownika ENAME VARCHAR(10) nazwisko JOB VARCHAR(9) stanowisko MGR NUMERIC(4) identyfikator zwierzchnika, HIREDATE DATE data zatrudnienia SAL NUMERIC(7,2) wynagrodzenie COMM NUMERIC(7,2) prowizja DEPTNO NUMERIC(2) klucz obcy numer departamentu Tabela dept DEPTNO NUMERIC(2) klucz główny DNAME CHAR(14) nazwa departamentu LOC CHAR(13) lokal numer departamentu Tabela salgrade GRADE NUMERIC stopień zaszeregowania LOSAL NUMERIC minimalna płaca HISAL NUMERIC maksymalna płaca 23 października 2017 Strona 8
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'); 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); 23 października 2017 Strona 9