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