Documente Academic
Documente Profesional
Documente Cultură
STAGE RENOVATION
- SQL.Chapitre 3 -
Sources du document : Site sql.developpez.com ; Manuel SQL PostgreSQL (existe en plusieurs versions HTML, PDF). Olivier Mondet http://unidentified-one.net
A. Introduction
Le langage SQL est compos de diffrents sous-ensembles : - LMD : Langage de Manipulation des donnes (DML, Data Manipulation Language) Permet la manipulation et la mise jour des tables, compos de quatre ordres fondamentaux : SELECT, UPDATE, INSERT, DELETE. - LDD : Langage de Dfinition des Donnes (DDL, Data Definition Language) Permet la dfinition et la mise jour du schma relationnel de la base de donnes (mode administration). Compos des ordres suivants : CREATE TABLE, CREATE INDEX, CREATE VIEW, DROP TABLE, DROP INDEX, DROP VIEW, ALTER TABLE. - LCD : Langage de Contrle des Donnes (DCL, Data Control Language) Permet de dfinir les contraintes dintgrit, de grer les accs et les autorisations (administration). Compos des ordres : GRANT, REVOKE, LOCK. Recouvre les dclencheurs (triggers), procdures catalogues. Le langage SQL a t norm par lANSI (American National Standards Institut) en 1986, repris par lISO (Organisation Internationale de Normalisation) en 1987, puis modifi en 1989. On nomme alors les diffrentes versions : SQL-86, SQL-87 et le SQL-89. En 1992 le SQL prend un virage avec des volutions majeures : on lappelle le SQL-92 ou SQL-2. En 1999 est n le SQL-99 ou SQL-3 (qui intgrera dsormais les triggers ou dclencheurs). Le SQL a t adoss au XML en 2003 (SQL-2003) Lobjet de ce cours ntant pas de retracer lhistorique des ordres nous ne dvelopperont donc pas plus cette partie. - Extensions de SQL : SQL+ (ORACLE), langage procdural (PL/SQL), Middleware (ODBC/JDBC), architecture Client/Serveur. - Utilitaires : Chargement et dchargement de tables partir de fichiers. Dchargement et rechargement de la base. Gnrateurs dtats, gestionnaire dcrans, QBE, interfaces.
page 1 / 13
om (2001-2005)
B. Lordre SELECT
B.1. Ordre SELECT (version SQL89)
Permet de consulter les tables et les vues dune BDD (extraire les donnes). Les clauses SELECT et FROM sont obligatoires. SELECT [ALL|DISTINCT] <critres de projection> FROM <tables> [WHERE <critres de slection et/ou de jointure>] [ORDER BY <critre de classement> [ASC|DESC]] [GROUP BY <critre de regroupement>] [HAVING <condition de regroupement>] [FETCH FIRST n ROWS ONLY] Les clauses sont excutes dans cet ordre : FROM WHERE GROUP BY / HAVING SELECT ORDER BY Il est possible de donner un autre libell aux colonnes projetes avec la clause AS : SELECT nomcli AS nom du client. On peut galement crire : SELECT nomcli "nom du client" (admis sous Oracle). Exemple : affichage de toutes les colonnes dune table. SELECT * FROM client;
page 2 / 13
om (2001-2005)
NB : NATURAL JOIN permet d'viter de prciser les colonnes concernes par la jointure (que lon peut restreindre certaines colonnes avec la clause USING). INNER JOIN prcise une jointure interne, ce qui est le cas par dfaut avec la simple utilisation de JOIN. UNION permet de joindre deux tables dont la structure est diffrente. Exemple : affichage de tous les clients ayant pass au moins une commande. SELECT numclient, nomclient FROM client JOIN commande ON client.numclient=commande.numclient; Exemple : affichage de tous les clients nayant pas pass de commande. SELECT numclient, nomclient FROM client EXCEPTION JOIN commande ON client.numclient=commande.numclient;
B.3.2. IN
Permet de chercher une valeur dans une liste (OR). Exemple : affichage de toutes les commandes de 10 ou 20 articles. SELECT numcde, datecde, qtecde FROM commande WHERE qtecde IN (10, 20);
B.3.3. NULL
Permet de tester les valeurs non renseignes dans une colonne. Exemple : affichage de tous les clients nayant pas communiqu leur numro de tlphone. SELECT numclient, nomclient FROM client WHERE telclient IS NULL;
B.3.4. LIKE
Permet de rechercher dans une colonne une chane de caractres avec les caractres jokers _ et %. Exemple : affichage des clients dont le nom commence par PSO. SELECT numclient, nomclient
Ch.3 - Le Langage SQL, LMD.doc page 3 / 13 om (2001-2005)
FROM client WHERE nomclient LIKE PSO%; Nota : Sous Access la formulation des jokers est diffrente (proche plus proche de VB dailleurs) : LIKE permet de chercher une occurrence dans les champs dune table. * = nimporte quelle chane de caractres ? = nimporte quel caractre # = nimporte quel nombre [A-G] = plage de caractres [1-8] = plage de nombres [!A-G] = hors plage de caractres [!1-8] = hors plage de nombres En SQL non Access % = * et _ = ?
page 4 / 13
om (2001-2005)
page 5 / 13
om (2001-2005)
B.8. ORDER
Permet le tri des rsultats dune slection. ORDER BY <NomChamp / N colonne> [ASC|DESC] Exemple : affichage de la liste des employs trie par catgorie et par niveau de salaire (du plus lev au plus faible). SELECT matricule, nomemploy, categ, salaire FROM employ ORDER BY categ ASC, salaire DESC;
B.9. DISTINCT
Clause qui permet dviter davoir des lignes redondantes. Exemple : affichage de la liste des qualifications des employs sans doublons. SELECT DISTINCT qualif FROM employ; NB : la clause ALL prend toutes les valeurs, mmes celles en double (ALL est loption par dfaut et est facultatif). Nota : Sous Access la formulation est diffrente : on utilise DISTINCTROW.
B.10.
B.10.1.
Permet de calculer la somme dune colonne ou dune expression. Exemple : affichage du total des salaires verss. SELECT SUM(salaire) "Total" FROM employ; NB : Ou en notation pour Access : SELECT SUM(salaire) AS "Total" FROM employ;
Ch.3 - Le Langage SQL, LMD.doc page 6 / 13 om (2001-2005)
B.10.2.
AVG
Permet de calculer ma moyenne dune colonne ou dune expression. Exemple : affichage de la rmunration moyenne des reprsentant (salaires+commission). SELECT AVG(salaire+comm) FROM employ;
B.10.3.
COUNT
Permet de compter le nombre de lignes. COUNT(*) : compte le nombre de lignes ; COUNT(colonne) : compte le nombre de valeurs dans une colonne ; COUNT(DISTINCT colonne) : compte les valeurs distinctes dans une colonne en liminant les valeurs nulles.
Exemple : Affichage du nombre total de salaris. SELECT COUNT(*) FROM employ; Exemple : affichage du nombre de catgories diffrentes parmi les employs. SELECT COUNT(DISTINCT categ) FROM employ;
B.10.4.
MAX / MIN
B.10.5.
VAR, STDDEV
page 7 / 13
om (2001-2005)
B.11.
B.11.1.
GROUP BY
Clause qui permet de grouper les lignes par type. Exemple : affichage du salaire moyen de chaque catgorie demploys. SELECT categ, AVG(salaire) FROM employ GROUP BY categ; Exemple : affichage du nombre de commandes passes par client. SELECT numclient, nomclient COUNT(numcde) FROM client, commande WHERE client.numcde = facture.numcde GROUP BY numclient;
B.11.2.
GROUP BY HAVING
Clause qui permet de spcifier des critres de slection sur les groupes de valeurs. Cette clause accompagne la clause GROUP BY. HAVING sapplique des groupes de lignes alors que WHERE sapplique des lignes. Exemple : affichage du nombre de commandes passes par client uniquement dans le cas o il y a plus de 10 commandes. SELECT numclient, nomclient COUNT(numfact) FROM client, facture WHERE client.numclient = facture.numclient GROUP BY numclient HAVING COUNT(*) > 10;
B.12.
Jointures multiples
Les alias
B.12.1.
Il est possible dutiliser des alias (pour simplifier) pour nommer une table diffremment dans la requte. Par exemple : SELECT F.titre, C.libell-catgorie FROM FILM F, CATGORIE C WHERE F.code-catgorie = C.code-catgorie;
page 8 / 13
om (2001-2005)
B.12.2.
Il est possible de mettre des SELECT lintrieur dautres SELECT. On peut ainsi faire des requtes partir de rsultats dautres requtes (requtes imbriques). Il sagit l dune fonctionnalit trs puissante du SQL. Les sous-requtes sont utilises avec les oprateurs : =, IN, ALL, ANY, EXISTS et SOME. Un SELECT peut utiliser le rsultat d'une autre requte de plusieurs manires.
B.12.2.2. BETWEEN
Exemple : Liste des articles ayant un prix variant d'au maximum +/- 10 % par rapport la moyenne. SELECT * FROM tariff WHERE prix BETWEEN (SELECT AVG(prix)*0,9 from tarif) AND (SELECT AVG(prix)*1,1 FROM tarif)
page 9 / 13
om (2001-2005)
B.12.2.4. IN / NOT IN
SELECT... WHERE expression [NOT] IN (sous_requte) IN : La valeur de l'expression doit se trouver dans la liste retourne par la sous-requte. NOT IN : La valeur de l'expression ne doit pas se trouver dans la liste retourne par la sous-requte. Exemple : on veut la liste des lves qui n'ont jamais t colls (qui ne sont pas dans la table COLLES). SELECT nom FROM lve WHERE nom NOT IN (SELECT NOM FROM colles);
B.12.3.
Auto-jointure
Il est possible de dfinir plusieurs fois la mme table dans un mme SELECT. Exemple : nombre de salaris dont le salaire est suprieur au salaire moyen. SELECT COUNT(matricule) FROM employ WHERE salaire < (SELECT AVG(salaire) FROM employ); Exemple : affichage de la liste des employs gagnant plus que le salari nomm "GRALOPPY". SELECT a.matricule, a.nomemploy, a.salaire FROM employ a, employ b WHERE a.salaire < b.salaire AND b.nomemploy = "GRALOPPY"; ou SELECT matricule, nomemploy, salaire FROM employ WHERE salaire < (SELECT salaire FROM employ WHERE nomemploy = "GRALOPPY");
page 10 / 13
om (2001-2005)
B.12.4.
Jointures externes
Lorsque lon excute une requte, les lignes des tables qui ne vrifient pas la condition exprime par le pivot de jointure, ne son pas affiches dans le rsultat. Une jointure externe (ou demie jointure) favorise une table, appele table dominante, par rapport lautre, appele table subordonne. Les lignes de la table dominante sont affiches mme si la condition de jointure nest pas ralise. Loprateur (+) plac aprs le nom dune table indique la table subordonne (dans laquelle il manque des lments). Exemple : Une table contient diffrents films et une autre les genres. Chaque film possde un seul genre, mais par contre il se trouve que certains genres ne soient pas (encore) affects un genre. Une jointure habituelle ne permettrait dafficher que les films de la base et les genres correspondants, sans afficher les autres genres. Sauf SELECT film.titrefilm, genre.genrefilm FROM film, genre WHERE genre.numgenre = film.numgenre (+); INNER JOIN <Table> ON <Champ1>=<Champ2> : permet de slectionner les enregistrements de deux tables jointes en naffichant pour les deux tables que les enregistrements qui ont une correspondance pour leur champ commun (cl primaire et cl trangre). Ce qui revient au WHERE table1.champ = table2.champ que nous connaissons. LEFT JOIN <Table> ON <Champ1>=<Champ2> : permet de slectionner les enregistrements de deux tables jointes en affichant pour la table de gauche (cl primaire) tous les enregistrements mme s'ils nont pas de correspondance dans la table de droite (cl trangre). RIGHT JOIN <Table> ON <Champ1>=<Champ2> : permet de slectionner les enregistrements de deux tables jointes en affichant pour la table de droite (cl trangre) tous les enregistrements mme s'ils nont pas de correspondance dans la table de gauche (cl primaire).
C. Fonctions essentielles
Fonction(x) MAX(X,Y) MIN(X,Y) ABSVAL(x) CEIL(x) Retourne ? retourne la plus grande valeur de X ou de Y retourne la plus petite valeur de X ou de Y la valeur absolue de x Retourne l'entier immdiatement suprieur X Retourne un nombre alatoire Retourne l'arrondi comptable la prcision y ROUND(2,42 , 1) = 2,40 ROUND(2,56 , 1) = 2,60 SIGN(x) TRUNCATE(x,y) Retourne -1 si x est ngatif, 1 s'il est positif, 0 Where SIGN(x) = -1 s'il est null Retourne le chiffre immdiatement infrieur X TRUNCATE(2,42 , 1) = 2,40 TRUNCATE(2,56 , 1) = 2,50
om (2001-2005)
Exemple MAX(prixHA, pritarif) * qte MIN(datce, datliv) ABSVAL(prix) * qte CEIL(2,42) = 3 CEIL(2,56) = 3
RAND() ROUND(x,y)
page 11 / 13
DEC(x,l,d) DIGITS(x) CHAR(x) FLOAT(x) INT(x) STRIP(x) ou TRIM(x) RTRIM(x) LTRIM(x) LENGTH(x) ou OCTET_LENGTH(x) CONCAT(x,y) SUBSTR(x,d,l) LEFT(x,l) RIGHT(x,l) SPACE(n) REPEAT(x,n) MOD(x,y) RRN(fichier) TRANSLATE(x) UPPER(x) UCASE(x) LOWER(x) LCASE(x) DECODE(expr,sear ch1,result1,...[,def ault]) NVL(expr,replace)
x au format numrique pack avec la lg et la prcision demande. x en tant que chane de caractres
x en tant que chane de car. (x tant une CHAR(current date) date) x au format "virgule flottante" x au format binaire supprime les blancs au deux extrmits de x. les blancs de droite les blancs de gauche la longueur de x LENGTH(nom) LENGTH(TRIM(nom)) concatene X et Y (aussi x CONCAT y ou X !! Y) CONCAT(nom, prenom) extrait une partie de x depuis D sur L octets extrait une partie de x depuis 1 sur L octets extrait les L derniers octets de x retourne n blancs retourne n fois x le reste de la division de x par y N de rang SUBSTR(nom, 1, 10) SUBSTR(nom, length(nom), 1) LEFT(nom, 10) RIGHT(nom, 5) nom concat prenom repeat('*', 15) MOD(annee, 4) RRN(clientp1) space(5) concat TRIM(raisoc) FLOAT(qte) INT(codart)
X en majuscule
WHERE 'VO%'
UCASE(RAISOC)
LIKE
x en minuscule
Effectue une recherche dans une expression et retourne le rsultat. Remplace une valeur par une autre
page 12 / 13
om (2001-2005)
page 13 / 13
om (2001-2005)