Bases de donn´ees SQL
Wiesław Zielonka
⋆ ⋆ ⋆
1 VIEW
-- CREATE VIEW <view name> AS <view definition> ; -- you can rename attributes in a VIEW
-- Most views are not updatable -- A view is updatable if
-- 1. it is constructed from just one table R -- 2. WHERE does not have a subquery involving R -- 3. SELECT contains only attributes of R
-- 4. the attributes of R missing in the view can be completed by -- NULL.
-- Then modyfying view modifies the underlying table R.
-- IMPORTANT: Views are preserved from one session to another -- unless you make DR0P VIEW
--- --DROP VIEW moy_salary;
-- le departement dont le salaire moy est le plus eleve CREATE VIEW moy_salary(dno,dname,salary)
AS SELECT D.dnumber, D.dname , CAST( avg(E.salary) AS Dec(8,2) ) FROM employee E, department D
WHERE E.dno = D.dnumber GROUP BY D.dname, D.dnumber ;
SELECT salary AS "salaire moy maximal", dno, dname FROM moy_salary
WHERE salary = (SELECT max(salary) FROM moy_salary);
DROP VIEW moy_salary;
--- --DROP VIEW dept_sept;
--DELETE FROM employee WHERE lname LIKE ’Kapus%’;
-- Si les tables qui servaient pour la construction de vue changent -- le vue change automatiquement. Ce n’est pas le cas de
-- TEMPORARY TABLE qui sont de vraies tables supprimees a la fin d’une session.
CREATE VIEW dept_sept
AS SELECT lname,fname,ssn FROM employee
WHERE dno = 7;
SELECT * FROM dept_sept;
INSERT INTO employee(lname,fname,ssn,dno) VALUES (’Kapuscinski’,’Artur’,’333555777’,7);
SELECT * FROM dept_sept;
DROP VIEW dept_sept;
--- SELECT lname,fname,ssn
INTO TEMPORARY TABLE dept_sept FROM employee
WHERE dno = 7;
SELECT * FROM dept_sept;
INSERT INTO employee(lname,fname,ssn,dno) VALUES (’Kapuscinski’,’Artur’,’333555777’,7);
SELECT * FROM dept_sept;
2 DATE et INTERVAL
SELECT date(’1980-12-12’);
SELECT interval ’21 day’;
SELECT date(’1980-12-12’) + interval ’50 days’;
SELECT mgrstartdate + interval ’10 year’
from department;
-- les department dont les chefs ont pris leur fonction il y a -- moins de 20 ans
SELECT dname, mgrstartdate FROM department
WHERE mgrstartdate + interval ’20 years’ >
current_date ;
-- les department dont les chefs ont pris leur fonction il y a -- moins de 10 ans
SELECT dname, mgrstartdate FROM department
WHERE extract(year FROM current_date) - extract(year FROM mgrstartdate)
< 10;
-- prenom, nom, departement, date de prise de fonction
-- pour les chefs de departments qui ont pris leur fonction en -- mai
SELECT E.fname, E.lname, D.dname, D.mgrstartdate FROM department D, employee E
WHERE E.ssn = D.mgrssn AND extract(month FROM D.mgrstartdate) = 5;
CREATE TABLE toto(
ssn char(9) references employee, nom varchar(20),
date date default(current_date) );
insert into toto(ssn,nom) values (’111111103’,’Knight’);
select * from toto;
DROP table toto;
3 Sous-requˆettes dans FROM
---
-- On peut faire des sous-requettes non seulement dans WHERE
-- mais aussi dans FROM. Noter que la sous requette qui apparait dans -- FROM doit avaoir un alias.
-- Pour chaque departement les femmes avec de salaires
-- les plus eleves (les plus eleves parmi les femmes, on ignore ici -- les hommes et leurs salaires).
SELECT E.fname, E.lname, E.salary, E.dno
FROM employee AS E, (SELECT max(salary) as salary, dno FROM employee
WHERE sex=’F’
GROUP BY dno) AS S WHERE S.salary = E.salary AND S.dno=E.dno ORDER BY salary;
-- meme chose avec join
SELECT fname, lname, salary, dno
FROM employee NATURAL JOIN (SELECT max(salary) as salary, dno, sex FROM employee
WHERE sex=’F’
GROUP BY dno,sex) AS S ORDER BY dno;
-- encore la meme chose avec join et -- avec HAVING
SELECT fname, lname, salary, dno
FROM employee NATURAL JOIN (SELECT max(salary) as salary, dno, sex FROM employee
GROUP BY dno,sex HAVING sex=’F’ ) AS S ORDER BY dno;
-- les moyennes des salaires par departement avec les nom de departements SELECT S.salary, D.dnumber, D.dname
FROM
(SELECT dno, CAST( avg(salary) AS Dec(8,2) ) AS salary FROM employee E
GROUP BY dno
) AS S, department D WHERE S.dno = D.dnumber;
4 INSERT DELETE
-- INSERT INTO R(A1,...,An) VALUES (v1,...,vn);
INSERT INTO employee(ssn,fname,lname) VALUES (’765432999’,’John’,’Updike’);
aINSERT INTO employee(ssn,fname,lname)
VALUES (’765432990’,’Andre’,’Kapuscinski’), (’765432989’,’Andre’,’Kapuscinski’);
-- il est possible de faire aussi -- INSERT INTO R(A1,...,An) -- SELECT ... ;
-- c’est-a-dire inserer des lignes qui -- resultent d’une requete SELECT SELECT lname,fname
FROM employee
WHERE lname LIKE ’Kapus%’;
-- Pour supprimer des lignes:
-- DELETE FROM <table> WHERE <condition> ; DELETE FROM employee
WHERE lname LIKE ’Kapus%’;
SELECT lname,fname FROM employee
WHERE lname LIKE ’Kapus%’;
5 UPDATE
-- UPDATE R
-- SET attr1=val1, ..., attrn=valn -- WHERE <condition>;
INSERT INTO employee(ssn,fname,lname)
VALUES (’765432990’,’Andre’,’Kapuscinski’), (’765432989’,’Andre’,’Kapuscinski’);
SELECT * FROM employee WHERE lname LIKE ’Kapus%’;
UPDATE employee
SET fname=’Joseph’,lname=’Kapusta’,dno=7 WHERE ssn=’765432989’;
SELECT * FROM employee WHERE lname LIKE ’Kapus%’;
-- UPDATE product
-- SET prix = prix * 1.1;
6 CONSTRAINT
-- NOT NULL
-- PRIMARY KEY sont toujours NOT NULL meme si rien ecrit explicitement
-- UNIQUE peuvent etre NULL, en particulier plusieurs lignes -- avec valeurs NULL sont possibles
-- FOREIGN KEY les attributs references par FOREING KEY doivent etre -- declares PRIMARY KEY ou UNIQUE dans l’autre table
-- Si la reference vers un seul attribut alors on peut mettre dans la ligne:
-- REFERENCES <table>(<attribut>) -- ou une clause separee
-- FOREIGN KEY(<liste des attributs>) REFERENCES <table>(<liste des attributs>) -- Si tous les attributs de FOREIGN KEY not null alors il faut
-- avoir une ligne correspondante dans l’autre table.
-- Par contre si certains attributs NULL alors pas de verification de -- reference dans une autre table.
-- REFERENCES <table>(<columns>) ON DELETE NO ACTION|RESTRICT|
-- CASCADE|SET NULL|SET DEFAULT
-- ON UPDATE
-- NO ACTION est defaut, peut etre deferre, RESTRICT ne peut pas etre deferre
-- les contraintes peuvent etre declarees NON DEFERRABLE ou DEFERRABLE -- NON DEFERRABLE est defaut et dans ce cas la contrainte est
-- verifiee a chaque modifications. Par contre DEFERRABLE peut etre DEFERRED -- a la fin de la transaction. Et dans ce cas seulement a la fin
-- la contrainte est verifiee.
-- CREATE TRIGGER name BEFORE|AFTER event -- ON table FOR [EACH] {ROW|STATEMENT}
-- EXECUTE PROCEDURE fun(args);
7 ALTER
-- Supprimer une table:
-- DROP TABLE R;
-- Modifier le schema
-- ALTER TABLE R ADD COLUMN <nom> <type> [<contraintes>];
ALTER TABLE employee ADD COLUMN tel_number CHAR(10) DEFAULT(’0000000000’);
ALTER TABLE employee DROP COLUMN tel_number;
-- ALTER TABLE employee DROP COLUMN tel_number CASCADE;
-- Pour supprimer les contraintes NOT NULL (lles n’ont pas de nom) -- ALTER TABLE <table> ALTER COLUMN <colonne> DROP NOT NULL;
-- Changer DEFAULT d’une colonne
-- ALTER TABLE <table> ALTER COLUMN <nom> SET DEFAULT valeur;
-- ALTER TABLE <table> ALTER COLUMN <col> DROP DEFAULT;
-- Changer le nom d’une colonne
-- ALTER TABLE <table> RENAME COLUMN <toto> TO <nouveau_toto>;
-- ALTER TABLE employee ADD CHECK (lname <> ’’ AND fname <> ’’);
ALTER TABLE employee DROP CONSTRAINT nom;
ALTER TABLE employee ADD CONSTRAINT nom CHECK (lname <> ’’ AND fname <> ’’);
-- ALTER TABLE DROP CONSTRAINT <nom contrainte>;
-- ALTER TABLE employee DROP CONSTRAINT employee_dno_fkey;
-- ALTER TABLE employee
-- ADD CONSTRAINT dno_cons FOREIGN KEY (dno) REFERENCES department(dnumber) -- ON UPDATE CASCADE;
-- ALTER TABLE project
-- ADD CONSTRAINT dno_cons FOREIGN KEY (dnum) REFERENCES department(dnumber) ---ON UPDATE CASCADE;
--ALTER TABLE dept_locations
--ADD CONSTRAINT dno_cons FOREIGN KEY (dnumber) REFERENCES department(dnumber) --ON UPDATE CASCADE;
--SELECT * FROM employee WHERE dno=5;
--UPDATE department SET dnumber =22 WHERE dnumber = 5;
--SELECT * FROM employee WHERE dno = 22;
--UPDATE department SET dnumber =5 WHERE dnumber = 22;
ALTER TABLE dept_locations DROP CONSTRAINT dno_cons;
ALTER TABLE dept_locations
ADD CONSTRAINT dno_cons FOREIGN KEY (dnumber) REFERENCES department(dnumber)
--INITIALLY IMMEDIATE DEFERRABLE;
INITIALLY DEFERRED DEFERRABLE;
--ALTER TABLE employee ADD CHECK( sex IN (’F’, ’M’) );
--SET CONSTRAINTS [ALL] [list of DEFFERABLE constraints] DEFERRED|IMMEDIATE;
BEGIN;
select * from dept_locations;
--SET CONSTRAINTS ALL DEFERRED;
SET CONSTRAINTS dno_cons DEFERRED;
INSERT INTO dept_locations(dnumber,dlocation) VALUES (66,’Hell’);
select * from dept_locations;
COMMIT;