cours_SQL
cours_SQL
cours_SQL
Introduction :
SQL est un langage d’extraction pour des bases de données relationnelles. Dans
un SGBD, SQL remplace le langage de manipulation des données pour consulter
et modifier les données et le langage de définition de données pour créer les
tables.
Syntaxe :
SHOW DATABASES;
USE nom_base_de_données;
idProd int,
code varchar(30),
libelle varchar(255),
prix int,
quantite int ,
idCategorie int
);
Contraintes
Les contraintes sont utilisées pour spécifier les règles pour chaque donnée de la
table. Les principales contraintes utilisées en SQL sont les suivantes :
NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT, INDEX
NOT NULL
Cette contrainte assure que la colonne spécifiée ne prenne pas de valeur nulle
Exemple :
Mlle DIAGNE Aicha J.
[email protected] 77 766 73 27
2
CREATE TABLE produit (
idProd int NOT NULL,
code varchar(30) NOT NULL,
libelle varchar(255) NOT NULL,
prix int,
quantite int,
idCategorie int NOT NULL
);
UNIQUE
Exemple :
PRIMARY KEY
FOREIGN KEY
Identifie une ligne d’une autre table. La clé étrangère permet de créer un lien
entre deux (2) tables
Exemple :
CHECK
DEFAULT
Attribue une valeur par défaut à la colonne si aucune valeur n’est spécifiée
Exemple :
Exemple :
CREATE TABLE categorie (
idCategorie int NOT NULL auto_increment,
nom varchar (50) NOT NULL,
dateCreation date DEFAULT NOW(),
PRIMARY KEY (idCategorie)
);
NB : les colonnes ayant la contrainte NOT NULL lors de la création de table doivent
obligatoirement avoir une valeur.
Si toutes les colonnes doivent avoir une valeur, on est pas obligé de citer les
colonnes, il faudra utiliser la syntaxe suivante en respectant l’ordre des colonnes
lors de la création:
Ou
UPDATE nom_table
Exemple :
L’utilisation la plus courante de SQL consiste à lire des données issues de la base
de données. Cela s’effectue grâce à la commande SELECT, qui retourne des
enregistrements dans un tableau de résultat. Cette commande peut sélectionner
une ou plusieurs colonnes d’une table.
Commande basique
L’utilisation basique de cette commande s’effectue de la manière suivante :
Si l’on veut avoir la liste de toutes les villes des clients, il suffit d’effectuer
la requête suivante :
Ville
Paris
Nantes
Lyon
Marseille
Grenoble
Prenom Nom
Pierre Dupond
Sabrina Durand
Julien Martin
David Bernard
Marie Leroy
Cette requête retourne exactement les mêmes colonnes qu’il y a dans la base de
données. Dans notre cas, le résultat sera donc :
Une requête SELECT peut devenir assez longue. Juste à titre informatif, voici une
requête SELECT qui possède presque toutes les commandes possibles :
Commande basique
L’utilisation basique de cette commande consiste alors à effectuer la requête
suivante :
Exemple
Prenons le cas concret d’une table « client » qui contient des noms et prénoms :
Prenom
Pierre
Sabrina
David
Marie
SQL WHERE
La commande WHERE dans une requête SQL permet d’extraire les lignes d’une
base de données qui respectent une condition. Cela permet d’obtenir
uniquement les informations désirées.
Syntaxe
La commande WHERE s’utilise en complément à une requête utilisant SELECT. La
façon la plus simple de l’utiliser est la suivante :
SELECT nom_colonne
FROM nom_table
WHERE condition ;
Pour obtenir seulement la liste des clients qui habitent à Paris, il faut effectuer la
requête suivante :
SELECT *
FROM client
WHERE ville = 'paris'
Résultat :
Attention : dans notre cas tout est en minuscule donc il n’y a pas eu de problème.
Cependant, si une table est sensible à la casse, il faut faire attention aux
majuscules et minuscules.
Opérateurs de comparaisons
Il existe plusieurs opérateurs de comparaisons. La liste ci-jointe présente
quelques uns des opérateurs les plus couramment utilisés.
Attention : il y a quelques opérateurs qui n’existent pas dans des vieilles versions
de système de gestion de bases de données (SGBD). De plus, il y a de nouveaux
opérateurs non indiqués ici qui sont disponibles avec certains SGBD.
Une requête SQL peut être restreinte à l’aide de la condition WHERE. Les
opérateurs logiques AND et OR peuvent être utilisées au sein de la commande
WHERE pour combiner des conditions.
Attention : il faut penser à utiliser des parenthèses lorsque c’est nécessaire. Cela
permet d’éviter les erreurs car et ça améliore la lecture d’une requête par un
humain.
Exemple de données
Pour illustrer les prochaines commandes, nous allons considérer la table « produit
» suivante :
Opérateur AND
L’opérateur AND permet de joindre plusieurs conditions dans une requête. En
gardant la même table que précédemment, pour filtrer uniquement les produits
informatiques qui sont presque en rupture de stock (moins de 20 produits
disponibles) il faut exécuter la requête suivante :
Opérateur OR
Pour filtrer les données pour avoir uniquement les données sur les produits «
ordinateur » ou « clavier » il faut effectuer la recherche suivante :
Résultats :
Combiner AND et OR
Il ne faut pas oublier que les opérateurs peuvent être combinés pour effectuer de
puissantes recherche. Il est possible de filtrer les produits « informatique » avec
un stock inférieur à 20 et les produits « fourniture » avec un stock inférieur à 200
avec la recherche suivante :
SQL IN
L’opérateur logique IN dans SQL s’utilise avec la commande WHERE pour vérifier
si une colonne est égale à une des valeurs comprise dans set de valeurs
déterminées. C’est une méthode simple pour vérifier si une colonne est égale à
une valeur OU une autre valeur OU une autre valeur et ainsi de suite, sans avoir
à utiliser de multiple fois l’opérateur OR.
Syntaxe
Pour chercher toutes les lignes où la colonne « nom_colonne » est égale à ‘valeur
1′ OU ‘valeur 2′ ou ‘valeur 3′, il est possible d’utiliser la syntaxe suivante :
SELECT nom_colonne
FROM nom_table
WHERE nom_colonne IN ( valeur1, valeur2, valeur3, ... ) ;
Cette syntaxe peut être associée à l’opérateur NOT pour recherche toutes les
lignes qui ne sont pas égales à l’une des valeurs énumérées.
Simplicité de l’opérateur IN
La syntaxe utilisée avec l’opérateur est plus simple que d’utiliser une succession
d’opérateur OR. Pour le montrer concrètement avec un exemple, voici 2 requêtes
qui retourneront les mêmes résultats, l’une utilise l’opérateur IN, tandis que
l’autre utilise plusieurs OR.
SQL BETWEEN
L’opérateur BETWEEN est utilisé dans une requête SQL pour sélectionner un
intervalle de données dans une requête utilisant WHERE. L’intervalle peut être
constitué de chaînes de caractères, de nombres ou de dates. L’exemple le plus
concret consiste par exemple à récupérer uniquement les enregistrements entre
2 dates définies.
Syntaxe
L’utilisation de la commande BETWEEN s’effectue de la manière suivante :
SELECT *
FROM table
WHERE nom_colonne BETWEEN 'valeur1' AND 'valeur2' ;
Si l’on souhaite obtenir les membres qui se sont inscrit entre le 1 avril 2012 et le
20 avril 2012 il est possible d’effectuer la requête suivante :
Id nom date_inscription
3 Chloé 2012-04-14
4 Marie 2012-04-15
L’autre élément important à savoir c’est que toutes les bases de données ne
gèrent pas l’opérateur BETWEEN de la même manière. Certains systèmes vont
SQL LIKE
L’opérateur LIKE est utilisé dans la clause WHERE des requêtes SQL. Ce mot-clé
permet d’effectuer une recherche sur un modèle particulier. Il est par exemple
possible de rechercher les enregistrements dont la valeur d’une colonne
commence par telle ou telle lettre. Les modèles de recherches sont multiples.
Syntaxe
La syntaxe à utiliser pour utiliser l’opérateur LIKE est la suivante :
Exemple
Imaginons une table « client » qui contient les enregistrements d’utilisateurs :
Id Nom Ville
2 Odette Nice
3 Vivien Nantes
Obtenir les résultats terminent par « e »
Requête :
Id Nom ville
2 Odette Nice
4 Etienne Lille
Dans le langage SQL, l’opérateur IS permet de filtrer les résultats qui contiennent
la valeur NULL. Cet opérateur est indispensable car la valeur NULL est une valeur
inconnue et ne peut par conséquent pas être filtrée par les opérateurs de
comparaison (cf. égal, inférieur, supérieur ou différent).
Exemple
Imaginons une application qui possède une table contenant les utilisateurs. Cette
table possède 2 colonnes pour associer les adresses de livraison et de facturation
à un utilisateur (grâce à une clé étrangère). Si cet utilisateur n’a pas d’adresse de
facturation ou de livraison, alors le champ reste à
NULL.
Table « utilisateur » :
SQL GROUP BY
Pour obtenir le coût total de chaque client en regroupant les commandes des
mêmes clients, il faut utiliser la requête suivante :
Client SUM(tarif)
Pierre 262
Simon 47
Marie 38
La manière simple de comprendre le GROUP BY c’est tout simplement d’assimiler
qu’il va éviter de présenter plusieurs fois les mêmes lignes. C’est une méthode
pour éviter les doublons.
Juste à titre informatif, voici ce qu’on obtient de la requête sans utiliser GROUP
BY.
Requête :
Client SUM(tarif)
Pierre 262
Simon 47
Marie 38
Marie 38
Pierre 262
Utilisation d’autres fonctions de statistiques
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs
enregistrements, il s’agit des fonctions d’agrégations statistiques, les principales
sont les suivantes :
- AVG() pour calculer la moyenne d’un set de valeur. Permet de connaître le
prix du panier moyen pour de chaque client
- COUNT() pour compter le nombre de lignes concernées. Permet de savoir
combien d’achats ont été effectué par chaque client
- MAX() pour récupérer la plus haute valeur. Pratique pour savoir l’achat le
plus cher
- MIN() pour récupérer la plus petite valeur. Utile par exemple pour
connaître la date du premier achat d’un client
- SUM() pour calculer la somme de plusieurs lignes. Permet par exemple de
connaître le total de tous les achats d’un client
Ces petites fonctions se révèlent rapidement indispensable pour travailler sur des
données.
SQL HAVING
Syntaxe
L’utilisation de HAVING s’utilise de la manière suivante :
Important : HAVING est très souvent utilisé en même temps que GROUP BY bien
que ce ne soit pas obligatoire.
Exemple
Pour utiliser un exemple concret, imaginons une table « achat » qui contient les
achats de différents clients avec le coût du panier pour chaque achat.
SELECT client, SUM(tarif) FROM achat GROUP BY client HAVING SUM(tarif) > 40 ;
Résultat :
Client SUM(tarif)
Pierre 162
Simon 47
La cliente « Marie » a cumulée 38€ d’achat (un achat de 18€ et un autre de 20€)
ce qui est inférieur à la limite de 40€ imposée par HAVING. En conséquent cette
ligne n’est pas affichée dans le résultat.
La commande ORDER BY permet de trier les lignes dans un résultat d’une requête
SQL. Il est possible de trier les données sur une ou plusieurs colonnes, par ordre
ascendant ou descendant.
Syntaxe
Une requête où l’on souhaite filtrer l’ordre des résultats utilise la commande
ORDER BY de la sorte :
Exemple
Pour l’ensemble de nos exemples, nous allons prendre une table « utilisateur »
de test, qui contient les données suivantes :
SQL LIMIT
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre.
Syntaxe
La syntaxe commune aux principaux systèmes de gestion de bases de données
est la suivante :
Bon à savoir : la bonne pratique lorsque l’on utilise LIMIT consiste à utiliser
également la clause ORDER BY pour s’assurer que quoi qu’il en soit ce sont
SQL UNION
Syntaxe
La syntaxe pour unir les résultats de 2 tableaux sans afficher les doublons est la
suivante :
La commande UNION ALL de SQL est très similaire à la commande UNION. Elle
permet de concaténer les enregistrements de plusieurs requêtes, à la seule
différence que cette commande permet d’inclure tous les enregistrements,
même les doublons. Ainsi, si un même enregistrement est présent normalement
dans les résultats des 2 requêtes concaténées, alors l’union des 2 avec UNION ALL
retournera 2 fois ce même résultat.
SQL INTERSECT
Syntaxe
La syntaxe à adopter pour utiliser cette commande est la suivante :
Jointure SQL
Les jointures en SQL permettent d’associer plusieurs tables dans une même
requête. Cela permet d’exploiter la puissance des bases de données
Exemple
En général, les jointures consistent à associer des lignes de 2 tables en associant
l’égalité des valeurs d’une colonne d’une première table par rapport à la valeur
d’une colonne d’une seconde table. Imaginons qu’une base de données possède
une table « utilisateur » et une autre table « adresse » qui contient les adresses
de ces utilisateurs. Avec une jointure, il est possible d’obtenir les données de
l’utilisateur et de son adresse en une seule requête.
On peut aussi imaginer qu’un site web possède une table pour les articles (titre,
contenu, date de publication …) et une autre pour les rédacteurs (nom, date
d’inscription, date de naissance …). Avec une jointure il est possible d’effectuer
une seule recherche pour afficher un article et le nom du rédacteur. Cela évite
d’avoir à afficher le nom du rédacteur dans la table « article ».
Il y a d’autres cas de jointures, incluant des jointures sur la même table ou des
jointures d’inégalité. Ces cas étant assez particuliers et pas si simples à
comprendre.
Types de jointures
Il y a plusieurs méthodes pour associer 2 tables ensemble. Voici la liste des
différentes techniques qui sont utilisées :
• INNER JOIN : jointure interne pour retourner les enregistrements quand la
condition est vrai dans les 2 tables. C’est l’une des jointures les plus
communes.
• CROSS JOIN : jointure croisée permettant de faire le produit cartésien de 2
tables. En d’autres mots, permet de joindre chaque lignes d’une table avec
chaque lignes d’une seconde table. Attention, le nombre de résultats est
en général très élevé.
• LEFT JOIN (ou LEFT OUTER JOIN) : jointure externe pour retourner tous les
enregistrements de la table de gauche (LEFT = gauche) même si la
condition n’est pas vérifié dans l’autre table.
Dans le langage SQL la commande INNER JOIN, aussi appelée EQUIJOIN, est un
type de jointures très communes pour lier plusieurs tables entre-elles. Cette
commande retourne les enregistrements lorsqu’il y a au moins une ligne dans
chaque colonne qui correspond à la condition.
Syntaxe
Pour utiliser ce type de jointure il convient d’utiliser une requête SQL avec cette
syntaxe :
Exemple
Imaginons une application qui possède une table utilisateur ainsi qu’une table
commande qui contient toutes les commandes effectuées par les utilisateurs.
Table commande :
Résultats :
Syntaxe
Il y a plusieurs façons d’utiliser les sous-requêtes. De cette façon il y a plusieurs
syntaxes envisageables pour utiliser des requêtes dans des requêtes.
SELECT *
FROM nom_table
WHERE nom_colonne = (
SELECT nom_colonne_table2
FROM table2
LIMIT 1
);
Cet exemple montre une requête interne (celle sur « table2″) qui renvoie une
seule valeur. La requête externe quant à elle, va chercher les résultats de «
nom_table » et filtre les résultats à partir de la valeur retournée par la requête
interne.
A noter : il est possible d’utiliser n’importe quel opérateur d’égalité tel que =, >,
<, >=, <= ou <>.
Exemple
La suite de cet article présente des exemples concrets utilisant les sous-requêtes.
Imaginons un site web qui permet de poser des questions et d’y répondre. Un tel
site possède une base de données avec une table pour les questions et une autre
pour les réponses.
SELECT *
FROM question
WHERE q_id = (
SELECT r_fk_question_id
FROM reponse
ORDER BY r_date_ajout DESC
LIMIT 1
);
SQL EXISTS
Dans le langage SQL, la commande EXISTS s’utilise dans une clause conditionnelle
pour savoir s’il y a une présence ou non de lignes lors de l’utilisation d’une sous-
requête.
A noter : cette commande n’est pas à confondre avec la clause IN. La commande
EXISTS vérifie si la sous-requête retourne un résultat ou non, tandis que IN vérifie
la concordance d’une à plusieurs données.
Syntaxe
L’utilisation basique de la commande EXISTS consiste à vérifier si une sous-
requête retourne un résultat ou non, en utilisant EXISTS dans la clause
conditionnelle. La requête externe s’exécutera uniquement si la requête interne
retourne au moins un résultat.
SELECT nom_colonne1
FROM table1
WHERE EXISTS (
SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10
);
Dans l’exemple ci-dessus, s’il y a au moins une ligne dans table2 dont
nom_colonne3 contient la valeur 10, alors la sous-requête retournera au moins
Exemple
Dans le but de montrer un exemple concret d’application, imaginons un système
composé d’une table qui contient des commandes et d’une table contenant des
produits.
Table commande :
SELECT *
FROM commande
WHERE EXISTS (
SELECT *
FROM produit
WHERE c_produit_id = p_id
);
SQL ALL
Dans le langage SQL, la commande ALL permet de comparer une valeur dans
l’ensemble de valeurs d’une sous-requête. En d’autres mots, cette commande
permet de s’assurer qu’une condition est « égale », « différente », « supérieure
», « inférieure », « supérieure ou égale » ou « inférieure ou égale » pour tous les
résultats retourné par une sous-requête.
Syntaxe
Cette commande s’utilise dans une clause conditionnelle entre l’opérateur de
condition et la sous-requête. L’exemple ci-dessous montre un exemple basique :
SELECT *
FROM table1
WHERE condition > ALL (
SELECT *
FROM table2
WHERE condition2
);
A savoir : les opérateurs conditionnels peuvent être les suivants : =, <, >, <>, !=,
<=, >=, !> ou !<.
Exemple
Imaginons une requête similaire à la syntaxe de base présentée précédemment :
Mlle DIAGNE Aicha J.
[email protected] 77 766 73 27
4
1
SELECT colonne1
FROM table1
WHERE colonne1 > ALL (
SELECT colonne1
FROM table2
);
Avec cette requête, si nous supposons que dans table1 il y a un résultat avec la
valeur 10, voici les différents résultats de la condition selon le contenu de table2
:
• La condition est vrai (cf. TRUE) si table2 contient {-5, 0, +5} car toutes les
valeurs sont inférieure à 10
• La condition est fausse (cf. FALSE) si table2 contient {12, 6, NULL,-100} car
au moins une valeur est inférieure à 10
• La condition est non connue (cf. UNKNOW) si table2 est vide
SQL ANY
Dans le langage SQL, la commande ANY permet de comparer une valeur avec le
résultat d’une sous-requête. Il est ainsi possible de vérifier si une valeur est «
égale », « différente », « supérieur », « supérieur ou égale », « inférieur » ou «
inférieur ou égale » pour au moins une des valeurs de la sous-requête.
Syntaxe
Cette commande s’utilise dans une clause conditionnelle juste après un opérateur
conditionnel et juste avant une sous-requête. L’exemple ci-dessous démontre
une utilisation basique de ANY dans une requête SQL :
SELECT *
FROM table1
WHERE condition > ANY (
SELECT * FROM table2 WHERE condition2) ;
A savoir : les opérateur conditionnels peuvent être les suivants : =, <, >, <>, !=,<=,
>=, !> ou !<.
Exemple
En se basant sur l’exemple relativement simple présenté ci-dessus, il est possible
d’effectuer une requête concrète qui utilise la commande ANY :
SELECT colonne1
FROM table1
WHERE colonne1 > ANY (
SELECT colonne1
FROM table2
);
Supposons que la table1 possède un seul résultat dans lequel colonne1 est égal à
10.
• La condition est vrai (cf. TRUE) si table2 contient {21, 14,7} car il y a au
moins une valeur inférieure à 10
• La condition est fausse (cf. FALSE) si table2 contient {20,10} car aucune
valeur est strictement inférieure à 10
• La condition est non connue (cf. UNKNOW) si table2 est vide
5. ENVIRONNEMENT MULTIUTILISATEUR :
- suppression de privilèges :