 |
Le langage SQL |
|
Le langage SQL, c'est un langage très simple : l'utilisateur dit ce
qu'il veut obtenir et non pas la façon de l'obtenir.
Il comprend un nombre restreint de commandes (répondant en partie
à une norme ISO) que l'on peut regrouper en plusieurs familles.
- créer/modifier/détruire des lignes dans les tables, c'est le DML -
Data Manipulation Language
- créer/modifier/détruire des tables, c'est le DDL - Data Description
Language ;
- gérer les droits d'accès et l'intégrite de la base, c'est le DCL -
Data Control Language;
Les principales commandes sont :
- le langage de manipulation
de données (LMD)
SELECT : pour interroger
le contenu d'une ou plusieurs tables
INSERT : pour
insérer des lignes dans une table
UPDATE : pour
modifier des lignes dans une table
DELETE : pour
supprimer des lignes dans une table
- le langage de définition
de données (LDD)
CREATE : pour créer un objet
ALTER :
pour modifier la structure d'un objet
DROP :
pour supprimer un objet
- le langage de contrôle
des données (LCD)
GRANT : pour
accorder un droit
REVOKE : pour retirer un
droit
I. Commande SELECT
A. Syntaxe minimum
SELECT * FROM
table ;
* signifie toutes les colonnes de la table
Les déclarations SQL peuvent être écrites en majuscules ou minuscules.
B. Projection
On appelle projection la sous-table réduite à certaines colonnes.
SELECT
a,b FROM table ;
Remarque : on peut effectuer un SELECT sur plusieurs tables. Par défaut c'est
un produit cartésien qui est effectué
select
x.a,y.b from x,y ;
Nous rendre une table de deux colonnes avec pour chaque x.b tous les y.a
possibles
C. Condition de sélection (ou restriction)
On appelle restriction (ou sélection) un sous-ensemble de lignes
répondant à un critère
select
* from table where condition ;
On peut effectuer des opérations sur des groupages ou sélections
Compter les éléments, faire des moyennes, prendre des max ou des min
select
count from t where x=1 and y>4 ;
select
avg(prix) from produit where catagorie='luxe' ;
select
max(dette) from creancier where amitie=null ;
select min(effort)
from necessaire where exemple='à chercher' ;
Remarque : on peut évidement trier sur un champ
select
x,y,z from y where condition order by x ;
D. Composition ou jointure : un produit cartésien suivi d'une restriction
Nous allons suivre un exemple sur deux tables afin de comprendre les jointures
CREATE
TABLE fille (prenom varchar(30),age int,idole varchar(30));
INSERT
INTO fille VALUES( 'Corinne', '15', 'Stendhal');
INSERT
INTO fille VALUES( 'Germaine', '17', 'Stendhal');
INSERT
INTO fille VALUES( 'Justine', '19', 'Hugo');
INSERT
INTO fille VALUES( 'Anne', '21', 'Sartre');
CREATE TABLE
livre (auteur varchar(30),titre varchar(30));
INSERT INTO livre
VALUES( 'Sartre', 'Les mots');
INSERT INTO livre
VALUES( 'Sartre', 'L\'être et le néant');
INSERT INTO livre
VALUES( 'Stendhal', 'Le rouge et le noir');
INSERT INTO livre
VALUES( 'Baudelaire', 'Les fleurs du mal'); |
fille(prenom,age,idole) |
livre(nom,titre) |
|
Corinne |
15 |
Stendhal |
|
|
Sartre |
Les mots |
Germaine |
17 |
Stendhal |
Sartre |
L'être
et le néant |
Justine |
19 |
Hugo |
Stendhal |
Le
rouge et le noir |
Anne |
21 |
Sartre |
Baudelaire |
Les fleurs
du mal |
|
On aurait pu récupérer les données dans un fichier CSV (avec séparateur entre
les champs) que n'importe quel tableur peut produire et les charger dans une
table par la fonction LOAD DATA INFILE
1. Jointure
interne
Les livres des auteurs préférées des filles
select
fille.prenom,livre.titre
from fille,livre
where fille.idole=livre.auteur ; |
Corinne |
Le rouge et le
noir |
Germaine |
Le rouge et le
noir |
Anne |
Les mots |
Anne |
L'être et
le néant |
|
Avec des sélections imbriquées (nested requests) on ferait
select
fille.prenom
from
fille
where
fille.idole in (select livre.auteur from livre) ;
La jointure peut être
- calculée (ce ne ne sera plus une "equi-jointure")
- faite sur plus de deux attributs
- une "auto-jointure" (pour la représentation
des arbres par exemple, ou chaque ligne contient le numéro de son père
2. Jointure
externe à gauche
On fait rentrer en plus les valeurs de gauche qui ne sont pas en correspondance
select
fille.prenom,livre.titre
from
fille left join livre on fille.idole=livre.auteur ;
|
Justine |
|
Corinne |
Le rouge et le noir |
Germaine |
Le rouge et le noir |
Anne |
Les mots |
Anne |
L'être et le
néant |
|
Si on ne voulait que les filles dont la bibliothèque disponible ne peut satisfaire
(pour n'avoir que la ligne de justine du tableau précédent, il faudrait effectuer
select fille.prenom,livre.titre
from fille left join livreon fille.idole=livre.auteur
where livre.auteur is null ;
3. Externe à droite
(les lignes de la table de droite)
On fait rentrer en plus les valeurs de droite qui ne sont pas en
correspondance en SQL
select
fille.prenom,livre.titre
from
livre left join fille on fille.idole=livre.auteur ;
|
Corinne |
Le rouge et le
noir |
Germaine |
Le rouge et le
noir |
Anne |
Les mots |
Anne |
L'être et
le néant |
|
Les fleurs du mal |
|
4. Externe
complète (les lignes de deux)
On ferait rentrer en plus toutes les valeurs (de chaque côté)
qui ne sont pas en correspondance
select
fille.prenom,livre.titre
from
fille full join livre on fille.idole=livre.auteur ;
|
Justine |
|
Corinne |
Le rouge et le noir |
Germaine |
Le rouge et le noir |
Anne |
Les mots |
Anne |
L'être et le
néant |
|
Les fleurs du mal |
|
E. Le complémentaire d'un select
Il est très utile de prendre le complémentaire. Pour un select simple, il
suffit de prendre la négation de la condition du where, mais pour les jointures,
il y a un truc, il faut utiliser le is null
II. Créer, mettre à jour, supprimer
Nous allons présenter les opérations dans un tableau, de manière à voir en
même temps ce qui concerne les bases de données, les tables, les champs (les
données), les données (les lignes).
Nous n'envisageons pas le système de droits. Les actions dont il est question
peuvent être permises ou interdites selon le niveau de l'utilisateur.
créer |
create
database <database> |
modifier |
voir
ce qui concerne les tables |
supprimer |
drop
database <database> |
créer |
create
table <table> ( <champ> <champ>, ) |
|
create
table article(numero int,nom varchar(30),categorie int) |
modifier |
voir
ce qui concerne les colonnes |
supprimer |
drop
table <table> |
créer |
alter
table <table> add <table> <champ> <type> |
modifier |
alter
table <table> <champ> <nouveau champ> <nouveau
type> |
supprimer |
alter
table <table> drop <champ> |
créer |
insert
into <table> (<champ>, ) values (<valeur>, ) |
|
insert
into article (numero,nom) values (12,'sifflet') |
modifier |
update
<table> set <champ>=<valeur> where <condition> |
|
update
article set nom='sifflet rouge' where numero=12 |
supprimer |
delete
from <table> where <condition> |
|
delete
from article where numero=12 |