De nombreux langages informatiques sont associés aux systèmes de gestion de bases de données. SQL est le plus répandu d'entre eux.
SQL signifie Structured Query Language (langage de requête structuré).
SQL fait l'objet de plusieurs normalisations internationales, la première datant de 1986, et est encore en cours d'évolution actuellement.
Les implémentations de SQL se conforment généralement à l'algèbre relationnelle (cf. chapitre 5 Modèle relationnel : algèbre) mais il n'est pas rare qu'elles s'en écartent sur plusieurs points. Par exemple, certaines admettent des occurrences identiques au sein d'une relation, ce qui est impossible dans le modèle relationnel.
SQL permet :
Sauf mention contraire, les relations ci-dessous sont utilisées dans tous les exemples et exercices de ce chapitre.
| numéroÉtudiant | nom | adresse |
| 12 | Dupont | Lyon |
| 23 | Durand | Lyon |
| 34 | Martin | Saint-Étienne |
| 78 | Paul | ⊥ |
| 89 | Simpson | Villeurbanne |
| 123 | Durand | Villeurbanne |
| numéroEnseignant | nom | grade | salaire |
| 12 | Dupont | Assistant | 700 |
| 45 | Simon | Assistant | 1000 |
| 56 | Didier | Maître de Conférences | 980 |
| 67 | Gray | Maître de Conférences | 1020 |
| 90 | Collot | Maître de Conférences | 1200 |
| numéroModule | titre | responsable |
| 10 | Mathématiques | 56 |
| 20 | Physique | 56 |
| 30 | Français | 12 |
| 40 | Anglais | 67 |
| numéro | numéroModule |
| 12 | 10 |
| 12 | 30 |
| 12 | 40 |
| 23 | 10 |
| 34 | 40 |
| 78 | 10 |
| 78 | 30 |
| 78 | 40 |
| 89 | 30 |
| 123 | 10 |
| 123 | 30 |
| 123 | 40 |
| numéro | numéroModule |
| 12 | 30 |
| 23 | 10 |
| 34 | 40 |
| 78 | 40 |
| 89 | 30 |
| 123 | 30 |
| 123 | 40 |
| numéro | numéroModule |
| 12 | 30 |
| 45 | 10 |
| 45 | 20 |
select.select listeAttributs from relationπnom,adresseÉtudiant se traduit en select nom,adresse from Étudiantselect réalise une projection et pas une sélection !where.select * from relation where conditionσnom="Dupont"Étudiant se traduit en select * from Étudiant where nom="Dupont"where qui réalise la sélection, et non select !select listeAttributs from relation where conditionπnom,adresseσnom="Dupont"Étudiant se traduit en select nom,adresse from Étudiant where nom="Dupont"Comment, en SQL, exprimeriez-vous les questions suivantes ?
Avant d'aller plus loin, il est maintenant utile de découvrir quelques éléments du langage SQL.
| Remplacement | Syntaxe SQL | Exemple | Commentaire |
| de tous les attributs dans une relation | * |
select *… |
|
| du vide dans un attribut | null |
…where nom is null |
La notion de vide diffère de celle de zéro pour les nombres et de chaîne de caractères vide pour les chaînes de caractères : elle représente une absence de valeur ou une valeur inconnue. |
| d'un caractère dans une chaîne de caractères | _ |
…where nom like "t_t_" |
_ remplace un caractère quelconque et un seul dans une chaîne de caractères. |
| d'un ensemble de caractères dans une chaîne de caractères | % |
…where nom like "t%o" |
% remplace zéro, un ou plusieurs caractères quelconques dans une chaîne de caractères. |
| Opération | Opérateur SQL | Exemple | Commentaire |
| est égal à | = |
…where âge=25 |
|
| est différent de | != ou <> |
…where nombreEnfants!=0 |
Selon les implémentations de SQL, les veux versions sont acceptées ou seulement une. |
| est strictement supérieur à | > |
…where âge>18 |
|
| est strictement inférieur à | < |
…where numéro<1024 |
|
| est supérieur ou égal à | >= |
…where âge>=10 |
|
| est inférieur ou égal à | <= |
…where salaire<=1000 |
|
| est compris entre … et … | between … and |
…where numéro between 12 and 20 |
Les bornes de l'intervalle sont généralement incluses. |
| est conforme à | like |
…where nom like "D%" |
like permet de vérifier qu'une chaîne de caractères est conforme à un modèle contenant _ et/ou %. |
| n'est pas conforme à | not like |
…where nom not like "l%e" |
not like est l'inverse de like. |
| est vide | is null |
…where salaire is null |
is null teste l'absence de valeur qui peut être assimilée à une valeur inconnue. |
| n'est pas vide | is not null |
…where nom is not null |
is not null est l'inverse de is null. |
| et | and |
…where âge>25 and âge!=20 |
Le and de SQL a généralement le comportement suivant : si le premier opérande permet de déterminer la réponse, le second n'est pas évalué. |
| ou | or |
…where nombreEnfants>2 or salaire<500 |
Le or de SQL a généralement le comportement suivant : si le premier opérande permet de déterminer la réponse, le second n'est pas évalué. |
| non | not |
…where not salaire>=500 |
|
| grouper | (…) |
…where not (nombreEnfants>2 or salaire<500) |
(…) permet de modifier l'ordre des opérations. |
En raison de la possibilité d'avoir une valeur null, les opérations logiques de SQL voient leur expressivité étendue.
Rappel : la table de vérité du ∧ est :
| ∧ | vrai | faux |
| vrai | vrai | faux |
| faux | faux | faux |
La table de vérité étendue du and de SQL est :
and |
true |
false |
null |
true |
true |
false |
null |
false |
false |
false |
false |
null |
null |
false |
null |
Le principe est simple : si la valeur du résultat ne peut pas être connue grâce à au moins un des deux opérandes, alors le résultat est null.
Rappel : la table de vérité du ∨ est :
| ∨ | vrai | faux |
| vrai | vrai | vrai |
| faux | vrai | faux |
La table de vérité étendue du or de SQL est :
or |
true |
false |
null |
true |
true |
true |
true |
false |
true |
false |
null |
null |
true |
null |
null |
Le principe est identique.
Rappel : la table de vérité du ¬ est :
| ¬ vrai | faux |
| ¬ faux | vrai |
La table de vérité étendue du not de SQL est :
not true |
false |
not false |
true |
not null |
null |
Le principe est similaire : si la valeur du résultat ne peut pas être connue grâce à l'opérande, alors le résultat est null.