ELEMENTS SUR SQL

© 2006, Rémi Dorat


Elements de base

Elements avancés



Elements introductifs sur les bases de données

sommaire

On trouve ici quelques éléments simples sur SQL. Les informations présentées sont très séléctives et partielles. La réference la plus complète : www.mysql.org.

"Structured Query Langage" ou SQL est une norme définissant un ensemble de commandes pour interroger et gérer une base de données, ces commandes étant disponibles pour l'ensemble des SGBD standards (Système de gestion des bases de données) et implémentant la norme. Les bases de données sont structurées en tables, une table est un objet à plusieurs colonnes ou champs et contenant un ensemble d'enregistrements-lignes (ou tuples ou occurences), chaque enregistrement sur la table renseignant les différents champs. On considère ici une table qu'on appelle Client :

Table Client :
nomprenomagepays
DupontSylvie78France
DurandHenri12Luxembourg
MeunierDominique34France
PonderAlain89Belgique

Ici, on a 4 colonnes-champs : nom, prenom, age, pays et 4 enregistrements-lignes qui correspondent aux noms 'Dupont', 'Durand', etc...

La base de données que l'on considère ici à titre d'exemple contient la table Client et une autre table :

Table Achat :
idAchatidProduitnomdate
1129Meunier2005-12-31
217Meunier2005-11-06
323Durand2006-01-06
42Durand2006-02-17

La table Client retient des informations sur chaque client, la table Achat retient des informations sur les achats. Noter qu'à partir d'un enregistrement de Achat, il est possible de retrouver les informations sur le client qui a fait cet achat, via le fait que l'on dispose du nom de la personne qui a acheté dans la table Achats. Une base de données sépare donc les données en tables pour assurer un stockage optimal de l'information, mais des informations évoluées reposant sur les informations contenues dans plusieurs tables peuvent être retrouvées : par exemple, on verra qu'à partir de la base de données courante, il est possible d'obtenir l'age moyen des individus qui ont acheté un produit particulier.

SQL permet de créer des tables, ie de définir le nombre et le nom des colonnes de chaque table et le type de données que l'on va avoir dans chaque colonne. SQL permet d'insérer des enregistrements dans les tables. Le langage permet enfin de consulter les informations qui ont été rentrées dans une table.

Le schéma relationnel d'une base de donnée est une représentation schématique de la base de donnée. On donne le schéma de la base de données minimaliste utilisée ici :

La démarche de conception d'une base de donnée consiste à établir un schéma relationel pour la base de donnée dont on a besoin. L'établissement de ce schéma est assez direct dans le cas où l'information manipulée n'est pas trop complexe, au delà, des méthode de conception existent : Merise, UML avec des techniques pour passer des schéma issus de ces méthodes vers des schéma relationnels.

Le document qui suit présente les fonctions de base du SQL : consultation de table, modification de table, création de tables. Il existe beaucoup d'autres fonctions définies par le langage SQL. Ces fonctions ne sont pas évoquées ici et permettent une gestion beaucoup plus poussée des bases de données (gestion des droits de différents individus, gestion des évenements...), des réferences peuvent être trouvées sur le Web ou dans des ouvrages.

Notez que toute requête SQL doit être terminée par ';'.


INSTRUCTION DE BASE : SELECT

sommaire

La requête SELECT demande le renvoi d'enregistrements au sein d'une table, son schéma général est :

SELECT [champs / colonnes que l'on veut voir apparaître dans le retour]
FROM [nom de la table au sein de laquelle on veut récupérer les enregistrements]
WHERE [condition(s) sur les enregistrements que l'on veut voir renvoyés];

Ici, on appelle la récupération des valeurs des champs spécifiés après le SELECT, pour les enregistrements contenus dans la table indiquée après le FROM et pour les enregistrements répondant aux conditions spécifiées après le WHERE.

Par exemple :

SELECT nom, prenom
FROM Client

Cette requête renvoie :

nomprenom
DupontSylvie
DurandHenri
MeunierDominique
PonderAlain

Autre exemple :

SELECT nom, prenom
FROM Client
WHERE Client.prenom='Sylvie';

Cette requête renvoie :

nomprenom
DupontSylvie

Le logiciel auquel est passé la commande va d'abord éliminer les éléments qui ne répondent pas à la condition spécifiée par le WHERE :

nomprenomagepays
DupontSylvie78France

Le logiciel ne renvoie que les colonnes attribuées spécifiées après le SELECT.

nomprenom
DupontSylvie

Quand on ne veut pas choisir quels attributs/ colonnes séléctionner :

SELECT *
FROM Client
WHERE Client.age >=78;

nomprenomagepays
DupontSylvie78France
PonderAlain89Belgique

Ici, * signifie tous les champs, la requête correspond donc au fait de renvoyer tous les champs pour l'ensemble des enregistrements tels que le champ "age" est rempli d'une valeur supérieure ou égale à 78. Ce qui se passe :

On peut enchainer des condition avec des opérateurs logiques :

SELECT *
FROM Client
WHERE Client.age >=78 AND Client.name='Dupont';

nomprenomagepays
DupontSylvie78France

SELECT *
FROM Client
WHERE Client.age=78 OR Client.pays='Belgique';

nomprenomagepays
DupontSylvie78France
PonderAlain89Belgique

On peut classer les occurences renvoyées :

SELECT *
FROM Client
ORDER BY prenom;

nomprenomagepays
PonderAlain89Belgique
MeunierDominique34France
DurandHenri12Luxembourg
DupontSylvie78France

On constate que l'on a les enregistrements qui sont classées par prenom dans l'ordre alphabétique.

On peut classer les occurences renvoyées par ordre décroissant :

SELECT *
FROM Client
WHERE pays='France'
ORDER BY age DESC;

Le mot clé DESC demande le classement dans l'ordre décroissant.

nomprenomagepays
DupontSylvie78France
MeunierDominique34France


INSTRUCTION DE BASE : INSERT

sommaire

Schéma général de la commande qui sert à rentrer un enregistrement dans une table :

INSERT INTO [nom de la table]
[nom des champs dont on donnera une valeur pour l'enregistrement]
VALUES [valeurs des champs pour l'enregistrement];

Exemple : On travaille sur la table INDIVIDUS, on veut rentrer un nouvel inividu (ie un nouvel enregistrement dans cette table) : Auburtin Alexandre agé de 20 ans, français, en fonction du schéma de la commande decrit plus haut, la commande va être :

INSERT INTO Client (nom,prenom,age,pays)
VALUES ('Auburtin',"Alexandre',20,'français');

nomprenomagepays
DupontSylvie78France
DurandHenri12Luxembourg
MeunierDominique34France
PonderAlain89Belgique
AuburtinAlexandre20français

A supposer que l'on veuille rentrer un individu dont on ne connaît ni l'âge ni le pays : Renoud Lucas, on passe la commande :

INSERT INTO Client (nom,prenom)
VALUES ("Renoud","Lucas");

nomprenomagepays
DupontSylvie78France
DurandHenri12Luxembourg
MeunierDominique34France
PonderAlain89Belgique
AuburtinAlexandre20français
RenoudLucas


INSTRUCTION DE BASE : DELETE

sommaire

Schéma général de la commande qui sert à éliminer un enregistrement d'une table :

DELETE FROM [table]
WHERE [conditions];

Cette requête permet d'éliminer l'ensemble des enregistrements-lignes de la tables. La requête élimine l'ensemble des enregistrements de la table spécifiée qui respectent les conditions spécifiés.

On veut enlever toutes les occurences des gens qui ont plus de 70 ans (ou 70 ans) dans la table :

DELETE FROM Client
WHERE Client.age>=70;

On obtient :

nomprenomagepays
DurandHenri12Luxembourg
MeunierDominique34France
AuburtinAlexandre20français
RenoudLucas


INSTRUCTION DE BASE : UPDATE

sommaire

Schéma général de la commande qui sert à mettre à jours des champs :

UPDATE [table]
SET [Mise à jour à faire];
WHERE [conditions];

On donne un exemple :

UPDATE Client
SET Client.age=Client.age+1;

On obtient :

nomprenomagepays
DurandHenri13Luxembourg
MeunierDominique35France
AuburtinAlexandre21français
RenoudLucas


JOINTURES, LIENS DE TABLES

sommaire

On suppose avoir une autre table qui fait réference à la table INDIVIDUS : la table ACHATS qui enregistre des achats, cette table est ainsi renseignée :

idAchatidProduitnomdate
1129Meunier2005-12-31
217Meunier2005-11-06
323Durand2006-01-06
42Durand2006-02-17

On peut avoir besoin de l'information contenue dans plusieurs tables pour répondre à certaines requêtes, on considère l'instruction suivante :

SELECT *
FROM Client JOIN Achats
ON Client.nom=Achats.nom

Cette requête renvoie :

nomprenomagepaysidAchatidProduit7
MeunierDominique35France1129Meunier2005-12-31
MeunierDominique35France217Meunier2005-11-06
DurandHenri13Luxembourg323Durand2006-01-06
DurandHenri13Luxembourg42Durand2006-02-17

Supposons que l'on veuille savoir les idProduits achetés par des luxembourgeois : nous avons besoin de connaître les informations des deux tables Client et Achats.

La requête :

SELECT *
FROM Client JOIN Achats
ON Client.nom=Achats.nom
WHERE Client.pays='Luxembourg'

nomprenomagepaysidAchatidProduit7
DurandHenri13Luxembourg323Durand2006-01-06
DurandHenri13Luxembourg42Durand2006-02-17


Quelques éléments avancés


SELECT AVANCE et GROUP BY

sommaire

On présente ici des opérateurs utiles qui permettent d'obtenir des moyennes sur des colonnes, d'obtenir les valeurs maximales d'une colonne etc...

Le schéma général pour le SELECT MAX est :

SELECT MAX([nomCol])
FROM [nomTable]

On donne un exemple :

SELECT MAX(age)
FROM Client

MAX(age)
35

Un autre exemple :

SELECT AVG(age)
FROM Client

AVG(age)
23.0000

Un autre exemple :

SELECT COUNT(age)
FROM Client

COUNT(age)
3

Un autre opérateur possible de ce type est le SELECT MIN() On peut raffiner l'utilisation des ces opératuers. Le GROUP BY est possible avec tous les opérateurs présentés plus haut, il consiste à calculer la moyenne, le max, non pas sur l'ensemble des occurences, mais sur chaque groupe d'occurences reliées selon un certain critère. Par exemple, on peut calculer la moyenne d'age en fonction du pays, le max d'age en fonction du pays

Par exemple :

SELECT AVG(age),pays
FROM Client
GROUP BY pays
AVG(age)pays
35.0000France
21.0000français
13.0000Luxembourg

Autre exemple :

SELECT MAX(age),pays
FROM Client
GROUP BY pays

MAX(age)pays
35France
21français
13Luxembourg


REQUETES IMBRIQUES

sommaire

A partir des requêtes proposées dans la section précédente, il est possible d'envisager des requêtes plus complexes avec une sémantique plus riche. Par exemple, on peut vouloir savoir qui est la personne la plus agée parmis celles de la base. La stratégie d'exploration d'une table qui vient naturellement aux individus consiste à regarder quel est l'age maximum dans la base pour ensuite voir à quelle(s) occurence(s) cet age correspond. SQL fonctionne de la même façon, si dans notre base, on veut connaître le nom de la personne à âge max :

SELECT *
FROM Client
WHERE age=(SELECT MAX(age) FROM Client);

Cette requête renvoie :

nomprenomagepays
MeunierDominique35France


INSTRUCTION DE CREATION DE TABLE

sommaire

L'instruction CREATE TABLE a le schéma suivant :

CREATE TABLE [nomTable]
([definition du champ 1], [definition du champ 2], ..., [definition du champ i], [Complément 1]...[complément j]);

La définition de champ a minima correspond au fait de donner un nom de champ et un type de champ.

Par exemple :

Les types suivants sont possibles :

Nom du typeDescription
INTEGERValeur entière
FLOAT(n)Valeur réelle avec une précision définie par n.
VARCHAR(n)Chaine de caractères avec au plus n caractères
DATEUne date, on peut rentrer une valeur en passant une chaine 'YYYY-MM-DD'

Certaines options peuvent être définies pour un champ après la définition de son type :

Parmi les compléments que l'on peut spécifier :

Attention, il ne faut pas définir plusieurs clés primaires : il faut qu'il n'y ait qu'une seule définition. La première instruction présentée ici définie nomChamp1 comme une clé étrangère d'une autre table. La deuxième instruction correspond au cas où un seul champ ne suffit pas à définir une clé, mais le cas où plusieurs champs sont nécessaires. Par exemple, dans la plupart des cas où on définit une référence de produit, on a ce champ qui définit une dépendance fonctionnelle sur l'ensemble des autres champs et on peut se servir de ce champ comme clé primaire.


INSTRUCTION DE DESTRUCTION DE TABLE

sommaire

Cette instruction est à manipuler avec une certaine prudence, elle permet d'éliminer une table et toutes les occurences enregistrées dans cette table. Son schéma est le suivant :

DROP TABLE [nomTable];


INSTRUCTION DE MODIFICATION DE TABLE

sommaire

Ici il ne s'agit pas de modifier les occurences d'une table, il s'agit de modifier la définition d'une table. On peut ajouter des champs à une table, enlever des champs d'une table etc... La commande est ALTER TABLE, sa syntaxe est la suivante pour ajouter un champ :

ALTER TABLE [nomTable]
ADD [nomCol] [definition]
;

Par exemple, on ajoute un champ date de naissance pour les clients :

ALTER TABLE Client
ADD dateNaissance DATE;

La table Client devient alors :

nomprenomagepaysdateNaissance
DurandHenri13Luxembourg
MeunierDominique35France
AuburtinAlexandre21français
RenoudLucas

Pour éliminer un champ :

ALTER TABLE [nomTable]
DROP [nomCol];

Par exemple, puisque on a rajouter un champ date de naissance, on pourra recalculer l'age des clients à partir de leur date de naissance (se posera un problème pour l'ensemble des clients pour lesquels on n'a pas récupéré la date de naissance au moment de leur enregistrement) :

On passe la requête :

ALTER TABLE Client
DROP age;

La table Client devient :

nomprenompaysdateNaissance
DurandHenriLuxembourg
MeunierDominiqueFrance
AuburtinAlexandrefrançais
RenoudLucas


Divers

sommaire



Quelques élements théoriques relatifs à la conception des bases de données

sommaire