Le langage SQL

I. Commande SELECT

A. Syntaxe minimum

B. Projection

C. Condition de sélection (ou restriction)

D. Composition ou jointure : un produit cartésien suivi d'une restriction

E.Le complémentaire d'un select

II. Créer, mettre à jour, supprimer

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.

  1. créer/modifier/détruire des lignes dans les tables, c'est le DML - Data Manipulation Language
  2. créer/modifier/détruire des tables, c'est le DDL - Data Description Language ;
  3. 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 :

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
CREATE :     pour créer un objet
ALTER :         pour modifier la structure d'un objet
DROP :          pour supprimer un objet
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