Langage SQL
Langage SQL
Langage SQL
SQL signifie langage de requête structuré (Structured Query Language). SQL est
un langage de programmation standard spécialement conçu pour stocker, extraire,
gérer ou manipuler les données à l'intérieur d'un système de gestion de bases de
données relationnelles (SGBDR). SQL est devenu une norme ISO en 1987.
SQL est le langage de base de données le plus largement mis en œuvre et soutenu
par les systèmes de base de données relationnelles populaires,
comme MySQL, SQL Server, et Oracle. Cependant, certaines fonctionnalités de la
norme SQL sont implémentées différemment dans différents systèmes de bases de
données.
SQL a été développé à l'origine par IBM au début des années 1970. Initialement, il
s’appelait SEQUEL (Structured English Query Language), qui a ensuite été remplacé
par SQL
Ce que vous pouvez faire avec SQL
Il y a beaucoup de choses que vous pouvez faire avec SQL:
Créer une base de données.
Créer des tables dans une base de données.
Interroger ou demander des informations à partir d'une base de données.
Insérer des enregistrements dans une base de données.
Mettre à jour ou modifier des enregistrements dans une base de données.
Supprimer des enregistrements de la base de données.
Définir les permissions ou le contrôle d'accès dans la base de données pour la
sécurité des données.
Créer des vues pour éviter de taper des requêtes complexes fréquemment
utilisées.
La liste ne se termine pas ici, vous pouvez effectuer de nombreuses autres tâches
liées à la base de données avec SQL. Vous en apprendrez plus sur chacune d'elles
en détail dans les prochains cours.
Objectifs
Cette série de cours SQL couvre tous les concepts fondamentaux du langage SQL,
tels que la création de bases de données et de tables, l'utilisation de contraintes,
l'ajout d'enregistrements à une table, la sélection d'enregistrements à partir d'une
table basée sur des conditions différentes, la mise à jour et la suppression
d'enregistrements dans une table, et ainsi de suite.
Une fois que vous êtes familiarisé avec les bases, vous passerez au niveau suivant
qui expliquent les méthodes de récupération des enregistrements en rejoignant
plusieurs tables, la recherche des enregistrements dans la table basée sur le
modèle, etc.
Enfin, vous explorerez quelques concepts avancés, tels que la modification de la
structure de la table existante, effectuer des agrégations et regrouper des données,
créer des vues pour simplifier et sécuriser l'accès à la table, créer des index pour les
tables, Gérer les dates et les heures, cloner une table existante, créer des tables
temporaires, ainsi que le concept de sous-séries SQL et L'injection SQL.
INTRODUCTION
SQL est un langage pour exploiter des bases de données; elle inclut la création, la
suppression, l'extraction de lignes, la modification de lignes, etc. de bases de
données. SQL est un langage standard ANSI (American National Standards
Institute), mais il existe de nombreuses versions différentes du langage SQL.
Qu'est-ce que le SQL?
SQL est un langage de requête structuré, qui est un langage informatique permettant
de stocker, manipuler et récupérer des données stockées dans une base de
données relationnelle.
SQL est la langue standard pour les systèmes de base de données relationnelle.
Tous les systèmes de gestion de base de données relationnelle (SGBDR) tels
que MySQL, MS Access, Oracle, Sybase, Informix, Postgres et SQL
Server utilisent SQL comme langage de base de données standard.
Pourquoi SQL ?
SQL est très populaire car il offre les avantages suivants:
Permet aux utilisateurs d'accéder aux données des systèmes de gestion de base
de données relationnelle.
Permet aux utilisateurs de décrire les données.
Permet aux utilisateurs de définir les données dans une base de données et de
les manipuler.
Permet d'intégrer dans d'autres langages en utilisant des modules SQL, des
bibliothèques et des pré-compilateurs.
Permet aux utilisateurs de créer et de supprimer des bases de données et des
tables.
Permet aux utilisateurs de créer une vue, une procédure stockée et des fonctions
dans une base de données.
Permet aux utilisateurs de définir des autorisations sur les tables, les procédures
et les vues.
Processus SQL
Le traitement des requêtes inclut des traductions sur des requêtes de haut niveau en
expressions de bas niveau pouvant être utilisées au niveau physique du système de
fichiers, une optimisation de la requête et une exécution réelle de la requête pour
obtenir le résultat réel.
Le schéma fonctionnel du traitement des requêtes est le suivant:
Cela se fait dans les étapes suivantes:
Etape 1
Analyseur - lors de l'appel d'analyse, la base de données effectue les contrôles
suivants: contrôle de syntaxe, contrôle sémantique et contrôle de pool partagé, après
conversion de la requête en algèbre relationnelle.
Analyse dure et analyse douce - S'il y a une nouvelle requête et que son code de
hachage n'existe pas dans le pool partagé, cette requête doit passer par les étapes
supplémentaires connues sous le nom d'analyse dure. Sinon, si le code de hachage
existe, la requête ne passe pas par des étapes supplémentaires. . Il passe
directement au moteur d’exécution (voir schéma). Ceci est appelé analyse douce.
L'analyse dure comprend les étapes suivantes - optimiseur et génération de sources
de lignes.
Etape 2
Optimiseur - au cours de la phase d'optimisation, la base de données doit effectuer
une analyse syntaxique stricte au moins pour une instruction LMD unique et effectuer
une optimisation au cours de cette analyse. Cette base de données n'optimise jamais
la LDD à moins d'inclure un composant LMD, tel qu'une sous-requête, qui nécessite
une optimisation.
Il s'agit d'un processus dans lequel plusieurs plans d'exécution de requêtes pour
satisfaire une requête sont examinés et le plan de requêtes le plus efficace est
satisfait pour son exécution. Le catalogue de base de données stocke les plans
d'exécution, puis l'optimiseur transmet le plan d'exécution le moins coûteux.
Génération de source en ligne - Est un logiciel qui reçoit un plan d’exécution
optimal de l’optimiseur et génère un plan d’exécution itératif utilisable par le reste de
la base de données. le plan itératif est le programme binaire qui, lorsqu'il est exécuté
par le moteur SQL, produit le résultat.
Etape 3
Moteur d'exécution - Exécute enfin la requête et affiche le résultat souhaité.
Commandes SQL
Les commandes SQL standard pour interagir avec les bases de données
relationnelles sont CREATE, SELECT, INSERT, UPDATE, DELETE et DROP. Ces
commandes peuvent être classées dans les groupes suivants en fonction de leur
nature : Langage de définition de données(LDD), Langage de manipulation de
données (LMD), Langage de contrôle de données (LCD).
CREATE Crée une nouvelle table, une vue d’une table ou un autre objet de la base de données.
DROP Supprime une table entière, une vue d'une table ou d'autres objets de la base de données.
LMD - Langage de manipulation de données
Commande Description
Nous reviendrons sur toutes ces commandes en détail dans les prochains cours
CONCEPTS DE BASE DE SGBDR
Lorsqu'un attribut est défini dans une relation (table), il est défini pour ne contenir
qu'un certain type de valeurs, appelé domaine d'attribut.
Par conséquent, l'attribut Nom contiendra le nom de l'employé pour chaque tuple. Si
nous sauvegardons l'adresse de l'employé ici, ce sera une violation du modèle de
base de données relationnelle.
Quel est le schéma de relation ?
Un schéma de relation décrit la structure de la relation, avec le nom de la relation
(nom de la table), ses attributs, leurs noms et leur type.
Qu'est-ce qu'une clé de relation?
Une clé de relation est un attribut qui peut identifier de manière unique un tuple
(ligne) particulier dans une relation (table).
a) Contraintes de clé
Nous stockons les données dans des tableaux, pour y accéder plus tard lorsque cela
est nécessaire. Dans chaque tableau, un ou plusieurs attributs sont utilisées pour
récupérer les données des tableaux. La contrainte clé spécifie qu'il doit y avoir un tel
attribut (colonne) dans une relation (table), qui peut être utilisé pour récupérer des
données pour n'importe quel tuple (ligne).
L'attribut clé ne doit jamais être NULL ou identique pour deux lignes de données
différentes.
Par exemple, dans la table des employés, nous pouvons utiliser l'attribut Id pour
extraire des données pour chacun des employés. Aucune valeur de Id n'est nulle et
elle est unique pour chaque ligne. Il peut donc s'agir de notre attribut clé.
b) Contraintes de domaine
Les contraintes de domaine font référence aux règles définies pour les valeurs
pouvant être stockées pour un certain attribut.
Comme nous l'avons expliqué ci-dessus, nous ne pouvons pas enregistrer l'adresse
de l'employé dans la colonne Nom.
De même, un numéro de téléphone mobile ne peut pas dépasser 10 chiffres.
c) Contraintes d'intégrité référentielle
Les lignes ne peuvent pas être supprimées, si elles sont utilisées par d'autres
enregistrements.
Si une table fait référence à des données d'une autre table, cette table et ces
données doivent être présentes pour que la contrainte d'intégrité référentielle soit
vérifiée.
Nous étudierons cela en détail plus tard.
Normalisation de la base de données
La normalisation de base de données est le processus d’organisation efficace des
données dans une base de données. Ce processus de normalisation a deux raisons
Éliminer les données redondantes, par exemple, stocker les mêmes données dans
plusieurs tables.
S'assurer que les dépendances de données ont un sens.
Ces deux raisons sont des objectifs valables, car elles réduisent la quantité d'espace
utilisée par une base de données et garantissent que les données sont stockées de
manière logique.
La normalisation consiste en une série de directives qui vous aideront à créer une
bonne structure de base de données.
Les directives de normalisation sont divisées en formes normales. Le but des formes
normales est d’organiser la structure de la base de données, de sorte qu’elle
respecte les règles de la première forme normale, puis de la deuxième forme
normale et enfin de la troisième forme normale.
C'est votre choix d'aller plus loin et d'aller à la quatrième forme normale, cinquième
forme normale, etc., mais en général, la troisième forme normale est plus que
suffisant.
Nous parlerons plus tard en détail de ces formes normales
SYNTAXES DE DIFFERENTES INSTRUCTIONS SQL
SQL est suivi d'un ensemble unique de règles et de directives appelé syntaxe. Ce
cours vous permet de démarrer rapidement avec SQL en listant toute la syntaxe SQL
de base.
Toutes les instructions SQL commencent par l'un des mots clés tels que SELECT,
INSERT, UPDATE, DELETE, ALTER, DROP, CREATE, USE, SHOW et toutes les
instructions se terminent par un point-virgule (;).
Le point le plus important à noter ici est que SQL est insensible à la casse, ce qui
signifie que SELECT et select ont la même signification dans les instructions SQL.
Alors que MySQL fait la différence dans les noms de table. Donc, si vous travaillez
avec MySQL, vous devez donner les noms de table tels qu’ils existent dans la base
de données.
Instruction SELECT
1 SELECT colonne1, colonne2 ... colonneN
2 FROM nom_table;
Clause DISTINCT
SELECT DISTINCT colonne1, colonne2 ... colonneN
1 FROM nom_table;
2
Clause WHERE
SELECT colonne1, colonne2 ... colonneN
1 FROM nom_table
2
WHERE CONDITION;
3
Clause AND/OR
SELECT colonne1, colonne2 ... colonneN
1 FROM nom_table
2
WHERE CONDITION-1 {AND|OR} CONDITION-2;
3
Clause IN
1 SELECT colonne1, colonne2 ... colonneN
2 FROM nom_table
3 WHERE nom_colonne IN (val-1, val-2,...val-N);
Clause BETWEEN
1 SELECT colonne1, colonne2 ... colonneN
2 FROM nom_table
3 WHERE nom_colonne BETWEEN val-1 AND val-2;
Clause LIKE
1 SELECT colonne1, colonne2 ... colonneN
2 FROM nom_table
3 WHERE nom_colonne LIKE { PATTERN };
Clause ORDER BY
1 SELECT colonne1, colonne2 ... colonneN
2 FROM nom_table
3 WHERE CONDITION
4 ORDER BY nom_colonne {ASC|DESC};
Clause GROUP BY
1 SELECT SUM(nom_colonne)
2 FROM nom_table
3 WHERE CONDITION
4 GROUP BY nom_colonne;
Clause COUNT
1 SELECT COUNT(nom_colonne)
2 FROM nom_table
3 WHERE CONDITION;
Clause HAVING
1 SELECT SUM(nom_colonne)
2 FROM nom_table
3 WHERE CONDITION
4 GROUP BY nom_colonne
5 HAVING (condition de la fonction arithmétique);
Instruction DESC
1 DESC nom_table;
Instruction TRUNCATE TABLE
1 TRUNCATE TABLE nom_table;
Instruction UPDATE
1 UPDATE nom_table
2 SET colonne1 = valeur1, colonne2 = valeur2....colonneN=valeurN
3 [ WHERE CONDITION ];
Instruction DELETE
1 DELETE FROM nom_table
2 WHERE {CONDITION};
Instruction USE
1 USE nom_bd;
Instruction COMMIT
1 COMMIT;
Instruction ROLLBACK
ROLLBACK;
1
Plus loin dans ce tutoriel, nous allons discuter chacune de ces instructions en
profondeur
OPERATEURS SQL
Opérateurs arithmétiques
Opérateur Description
% (Reste de
Divise l'opérande gauche par l'opérande droit et renvoie le reste.
division)
Opérateurs de comparaison
Opérateur Description
Vérifie si les valeurs de deux opérandes sont égales ou non, si oui, la condition
=
devient vraie.
Vérifie si les valeurs de deux opérandes sont égales ou non, si les valeurs ne sont pas
!=
égales, alors la condition devient vraie.
Vérifie si les valeurs de deux opérandes sont égales ou non, si les valeurs ne sont pas
<>
égales, alors la condition devient vraie.
Opérateurs logiques
Opérateur Description
L'opérateur ALL permet de comparer une valeur à toutes les valeurs d'un autre jeu de
ALL
valeurs.
L'opérateur ANY est utilisé pour comparer une valeur à une valeur applicable de la liste
ANY
conformément à la condition.
L'opérateur EXISTS est utilisé pour rechercher la présence d'une ligne dans une table
EXISTS
spécifiée qui répond à un certain critère.
L'opérateur IN est utilisé pour comparer une valeur à une liste de valeurs littérales
IN
spécifiées.
L'opérateur LIKE est utilisé pour comparer une valeur à des valeurs similaires à l'aide
LIKE
d'opérateurs génériques.
L'opérateur NOT inverse la signification de l'opérateur logique avec lequel il est utilisé.
NOT
Ex.: NOT EXISTS, NOT BETWEEN, NOT IN, etc. Ceci est un opérateur de négation.
L'opérateur AND permet l'existence de plusieurs conditions dans la clause WHERE d'une
AND
instruction SQL.
L'opérateur OR est utilisé pour combiner plusieurs conditions dans la clause WHERE d'une
OR
instruction SQL.
IS NULL L'opérateur IS NULL est utilisé pour comparer une valeur avec une valeur NULL.
L'opérateur UNIQUE recherche dans chaque ligne de la table spécifiée l'unicité (pas de
UNIQUE
doublons).
CREATION ET SUPPRESSION D’UNE BASE DE DONNEES
1 SHOW DATABASES;
Exemple :
Attention! Soyez prudent avant d'utiliser cette opération, car la suppression d'une base de
données existante entraînerait la perte des informations complètes stockées dans la base de
données.
Assurez-vous de disposer du privilège administrateur avant de supprimer une base
de données. Une fois qu'une base de données est supprimée, vous pouvez la vérifier
dans la liste des bases de données, comme indiqué ci-dessous.
1 SHOW DATABASES;
1 USE nomBDonnees;
Exemple :
1 USE devInfo;
TYPES DE DONNEES SQL
Les types de données sont utilisés pour représenter une nature de données pouvant
être stockée dans la base de données. Le type de données est l'ensemble des
valeurs représentables. Il est également connu sous le nom d'attribut qui spécifie un
type de données de l'objet. Chaque colonne, variable et expression à le type de
données associé dans le code SQL lors de la création de la table.
Points importants sur les types de données SQL
Les fournisseurs de bases de données relationnelles ne prennent pas en charge tous les
types de données. Par exemple, la base de données Oracle ne prend pas en
charge DATETIME et MySQL ne prend pas en charge le type de données CLOB. Ainsi,
lors de la conception du schéma de base de données et de l'écriture des requêtes SQL,
assurez-vous de vérifier si les types de données sont pris en charge ou non.
Les types de données listés ici n'incluent pas tous les types de données; Ce sont les
types de données les plus couramment utilisés. Certains fournisseurs de bases de
données relationnelles ont leurs types de données qui ne sont peut-être pas répertoriés
ici. Par exemple, Microsoft SQL Server comporte des types de données money et
smallmoney, mais étant donné que les autres fournisseurs de bases de données préférés
ne les prennent pas en charge, elles ne sont pas répertoriées ici.
Chaque fournisseur de base de données relationnelle a sa taille maximale pour les
différents types de données et vous n'avez pas besoin de vous en rappeler. L'idée est de
savoir quel type de données utiliser dans un scénario spécifique.
Type de données De A
bit 0 1
tinyint 0 255
Type de
Description
données
Type de
Description
données
VARCHAR Stockage de longueur variable avec une longueur maximale de 8 000 caractères
Stockage à longueur variable avec le nombre maximum de caractères fourni, non pris
VARCHAR(max)
en charge dans MySQL
NVARCHAR Stockage de longueur variable avec une longueur maximale de 4 000 caractères
VARBINARY Stockage de longueur variable avec une longueur maximale de 8 000 octets
Il est utilisé pour spécifier une chaîne de longueur variable pouvant contenir des
Varchar(size) chiffres, des lettres et des caractères spéciaux. Sa taille "size" maximale est
comprise entre 0 et 65535 caractères.
Il est utilisé pour spécifier une chaîne de longueur fixe pouvant contenir des
Char(size) chiffres, des lettres et des caractères spéciaux. Par défaut, il peut contenir 1
caractère. Sa taille maximale est comprise entre 0 et 255 caractères.
Il est aussi similaire que VARCHAR (), et la seule différence est qu'il stocke des
VARBINARY(size)
chaînes d'octets binaires. Le paramètre size spécifie la colonne maximum en octets
Il est utilisé pour stocker des chaînes d'octets binaires. La valeur par défaut est 1 et
Binary(size)
son paramètre de taille spécifie la longueur de la colonne en octets.
TINYTEXT Il contient une chaîne avec une valeur maximale de 255 caractères.
Il est utilisé pour stocker une chaîne d'une longueur maximale de 255 caractères,
TEXT(size)
similaire à CHAR().
LONGTEXT Il contient une chaîne avec une valeur maximale de 4 294 967 295 caractères.
Il contient une chaîne avec une valeur maximale de 16 777 215 caractères, ce qui
MEDIUMTEXT
est assez plus grand que VARCHAR()
Il est utilisé lorsqu'un objet chaîne n'a qu'une seule valeur, choisie parmi une liste
de valeurs possibles. Vous pouvez répertorier jusqu'à 65 535 valeurs dans la
ENUM(val1,val2,….)
liste ENUM. Si une valeur est insérée, elle ne figure pas dans une liste et la valeur
vide sera insérée. Les valeurs sont triées dans l'ordre au moment de la saisie.
BLOB(size) Il est utilisé pour les gros objets binaires pouvant contenir jusqu'à 65 535 octets.
Utilisé pour un type de valeur de bit. La taille (size) est utilisée pour spécifier le nombre
BIT(size)
de bits. La plage est de 1-64. Par défaut, la valeur est 1.
Utilisé pour un nombre à virgule flottante. Le paramètre size spécifie le nombre total
FLOAT(size,d)
de chiffres. d est utilisé pour définir le nombre chiffres après le point décimal.
Utilisé pour spécifier un nombre à virgule fixe. La taille (size) de valeur maximale peut
DECIMAL(size,d) contenir 65, et par défaut, sa valeur sera 10 et d peut contenir une valeur maximale de
30, et par défaut, la valeur est 0.
Utilisé pour spécifier des valeurs booléennes. 0 est considéré comme faux et les valeurs
BOOL
non nulles restantes comme vraies.
Type de
Description
données
Utilisé pour spécifier le format de date. Dans MySQL, le format est AAAA-MM-JJ. La
DATE
plage va de «1000-01-01» à «9999-12-31».
Utilisé pour spécifier la combinaison de date et heure. Le format est AAAA-MM-JJ hh:
DATETIME
mm: ss. La plage va de «1000-01-01 00:00:00» à «9999-12-31 23:59:59».
Utilisé pour spécifier l'horodatage. Le format est AAAA-MM-JJ hh: mm: ss. La plage prise
TIMESTAMP
en charge est «1970-01-01 00:00:01» UTC à «2038-01-09 03:14:07» UTC.
Utilisé pour spécifier le format de l'heure. Le format est hh: mm: ss. La plage va de «-
TIME
838: 59: 59» à «838: 59: 59».
Utilisé pour spécifier l'année au format à quatre chiffres. La plage va de 1901 à 2155 et
YEAR
0000.
CREATION ET SUPPRESSION DE TABLE
CREATE TABLE est le mot clé qui indique au système de base de données ce que
vous voulez faire. Dans ce cas, vous voulez créer une nouvelle table. Le nom unique
ou l'identificateur de la table suit l'instruction CREATE TABLE.
Ensuite, entre parenthèses, la liste définissant chaque colonne de la table et son
type de données.
Exemple 1 :
Le code suivant est un exemple, qui crée une table Employes avec un ID en tant
que clé primaire et NOT NULL sont les contraintes indiquant que ces champs ne
peuvent pas être NULL lors de la création d'enregistrements dans cette table.
L'instruction DROP TABLE permet de supprimer une définition de table ainsi que
toutes les données, index, déclencheurs, contraintes et spécifications de permission
de cette table.
Attention ! Vous devez être très prudent lorsque vous utilisez cette commande car une fois
la table supprimée, toutes les informations disponibles dans cette table seront également
définitivement perdues.
Syntaxe :
Exemple 2 :
La syntaxe de base d'une commande ALTER TABLE pour ajouter une nouvelle
colonne dans une table existante est la suivante :
1 ALTER TABLE table_name
2 ADD (colonne1 type_donnees,
3 colonne1 type_donnees,
4 ...
colonneN type_donnees);
5
Exemple 1 :
ADD peut également être utilisé pour créer une contrainte sur les colonnes de la
table
Syntaxe :
DROP COLUMN est utilisé pour supprimer une colonne dans une table. Suppression
des colonnes indésirables de la table.
Syntaxe :
pour supprimer la colonne Age de la table Employes, vous pouvez utiliser la requête
suivante :
1 ALTER TABLE Employes
2 DROP COLUMN Age;
DROP CONSTRAINT peut également être utilisé pour supprimer une contrainte sur
les colonnes de la table
Syntaxe :
Les contraintes sont les règles appliquées aux colonnes de données d'une table.
Celles-ci sont utilisées pour limiter le type de données pouvant aller dans une table.
Cela garantit l'exactitude et la fiabilité des données de la base de données.
Les contraintes peuvent être au niveau de la colonne ou de la table. Les contraintes
de niveau de colonne ne sont appliquées qu'à une seule colonne, alors que les
contraintes de niveau de table s'appliquent à l'ensemble de la table.
Les contraintes les plus communes sont :
NOT NULL
DEFAULT
UNIQUE
CHECK
PRIMARY KEY
FOREIGN Key
INDEX
Contrainte NOT NULL
Par défaut, une colonne peut contenir des valeurs NULL. Si vous ne souhaitez pas
qu'une colonne ait une valeur NULL, vous devez définir une telle contrainte sur cette
colonne en spécifiant que NULL n'est plus autorisé pour cette colonne.
NULL n'est pas la même chose que pas de données, il représente plutôt des
données inconnues.
Exemple 1 :
Par exemple, la requête SQL suivante crée une nouvelle table appelée Employes et
ajoute quatre colonnes, dont trois sont Id, Nom et Age, nous spécifions pour ne pas
accepter les valeurs NULL.
1 CREATE TABLE Employes(
2 Id INT NOT NULL,
3 Nom VARCHAR (20) NOT NULL,
4 Age INT NOT NULL,
5 Salaire DECIMAL (18, 2),
6 PRIMARY KEY (Id)
);
7
Exemple 2 :
Si la table Employes a déjà été créée, pour ajouter une contrainte NOT NULL à la
colonne Salaire dans MySQL, vous devez écrire une requête comme suit :
ALTER TABLE Employes
1 MODIFY Salaire DECIMAL (18, 2) NOT NULL;
2
Contrainte DEFAULT
La contrainte DEFAULT fournit une valeur par défaut à une colonne lorsque
l'instruction INSERT INTO ne fournit pas de valeur spécifique.
Exemple 3 :
Par exemple, le code SQL suivant crée la même table Employes, mais ici, la
colonne Salaire est définie sur 5000.00 par défaut.
1 CREATE TABLE Employes(
2 Id INT NOT NULL,
3 Nom VARCHAR (20) NOT NULL,
4 Age INT NOT NULL,
5 Salaire DECIMAL (18, 2) DEFAULT 5000.00,
6 PRIMARY KEY (Id)
);
7
Exemple 4 :
Si la table Employes a déjà été créée, pour ajouter une contrainte DEFAULT à la
colonne Salaire dans MySQL, vous devez écrire une requête comme suit :
1 ALTER TABLE Employes
2 MODIFY Salaire DECIMAL (18, 2) DEFAULT 5000.00;
Pour supprimer une contrainte DEFAULT, utilisez la requête suivante :
1 ALTER TABLE Conges
2 ALTER COLUMN Salaire DROP DEFAULT;
Contrainte UNIQUE
La contrainte UNIQUE empêche que deux enregistrements aient des valeurs
identiques dans une colonne.
Exemple 5 :
Par exemple, la requête SQL suivante crée la même table Employes, mais dans ce
cas, la colonne Nom est définie sur UNIQUE, de sorte que vous ne pouvez pas avoir
deux enregistrements portant le même Nom.
Si la table Employes a déjà été créée, pour ajouter une contrainte UNIQUE à la
colonne Nom dans MySQL, vous devez écrire une requête comme suit :
Par exemple, la requête SQL suivante crée la même table Employes, mais dans ce
cas, la colonne Age est définie sur CHECK, de sorte que vous ne pouvez pas avoir
un employe de moins de 18 ans.
1 CREATE TABLE Employes(
2 Id INT NOT NULL,
3 Nom VARCHAR (20) NOT NULL,
4 Age INT NOT NULL CHECK (Age >= 18),
5 Salaire DECIMAL (18, 2),
6 PRIMARY KEY (Id)
);
7
Exemple 8 :
Si la table Employes a déjà été créée, pour ajouter une contrainte CHECK à la
colonne Age dans MySQL, vous devez écrire une requête comme suit :
1 ALTER TABLE Employes
2 MODIFY Age INT NOT NULL CHECK (Age >= 18);
Contrainte INDEX
L'INDEX est utilisé pour créer et récupérer des données de la base de données très
rapidement. Un index peut être créé en utilisant une seule colonne ou un groupe de
colonnes dans une table. Lors de la création de l'index, un ROWID est attribué à
chaque ligne avant le tri des données.
Les index appropriés sont bons pour les performances dans les bases de données
volumineuses, mais vous devez être prudent lors de la création d'un index. Une
sélection de champs dépend de ce que vous utilisez dans vos requêtes SQL.
Vous pouvez créer un index sur une ou plusieurs colonnes en utilisant la syntaxe
donnée ci-dessous.
1 CREATE INDEX nom_index
2 ON nom_table ( colonne1, colonne1, ...);
Pour créer un index sur la colonne Age, afin d'optimiser la recherche d'employés
pour un âge spécifique, vous pouvez utiliser la syntaxe suivante :
Voici la syntaxe pour définir l'attribut Id en tant que clé primaire dans une table
Employes.
1 CREATE TABLE Employes(
2 Id INT NOT NULL,
3 Nom VARCHAR (20) NOT NULL,
4 Age INT NOT NULL,
5 Salaire DECIMAL (18, 2),
6 PRIMARY KEY (Id)
);
7
Exemple 10 :
Pour créer une contrainte PRIMARY KEY sur la colonne "Id" alors que la table
Employes existe déjà, utilisez la syntaxe SQL suivante :
1 ALTER TABLE Employes
2 ADD PRIMARY KEY (ID);
Attention ! Si vous utilisez l'instruction ALTER TABLE pour ajouter une clé primaire, les
colonnes de clé primaire doivent déjà avoir été déclarées comme ne contenant pas de
valeurs NULL (lors de la création de la table).
Exemple 11 :
Pour définir une contrainte PRIMARY KEY sur plusieurs colonnes, utilisez la syntaxe
donnée ci-dessous.
1 CREATE TABLE Employes(
2 Id INT NOT NULL,
3 Nom VARCHAR (20) NOT NULL,
4 Age INT NOT NULL,
5 Salaire DECIMAL (18, 2),
6 PRIMARY KEY (Id, Nom)
);
7
Exemple 12 :
Pour créer une contrainte PRIMARY KEY sur les colonnes "Id" et "Nom" alors que la
table Employes existe déjà, utilisez la syntaxe suivante :
1 ALTER TABLE Employes
Vous pouvez supprimer les contraintes de clé primaire de la table avec la syntaxe
donnée ci-dessous.
1 ALTER TABLE Employes DROP PRIMARY KEY ;
Si la table Conges a déjà été créée et que la clé étrangère n'a pas encore été
définie, utilisez la syntaxe suivante pour spécifier une clé étrangère en modifiant une
table.
1 ALTER TABLE Conges
2 ADD FOREIGN KEY (ID_EMP) REFERENCES Employes(Id);
Pour supprimer une contrainte FOREIGN KEY, utilisez la syntaxe suivante :
1 ALTER TABLE Conges
2 DROP FOREIGN KEY;
Suppression des contraintes
Toute contrainte que vous avez définie peut être supprimée à l'aide de la
commande ALTER TABLE avec l'option DROP CONSTRAINT.
Syntaxe :
Exemple 1 :
Comme nous remplissons toutes les colonnes, nous pouvons utiliser INSERT
INTO sans spécifier les colonnes.
1 INSERT INTO Employes VALUES(1, "Ismail", 25, 6000);
+----+--------+-----+---------+
| Id | Nom | Age | Salaire |
+----+--------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
+----+--------+-----+---------+
Pour insérer plusieurs enregistrements dans la table, utilisez la syntaxe suivante
1 INSERT INTO nom_table VALUES
2 (valeur1, valeur2, value3,...valeurN),
3 (valeur1, valeur2, value3,...valeurN),
4 (valeur1, valeur2, value3,...valeurN),
5 .....
(valeur1, valeur2, value3,...valeurN);
6
Exemple 2 :
1 UPDATE nom_table
2 SET colonne1 = valeur1, colonne2 = valeur2...., colonneN = valeurN
3 [WHERE condition];
Vous pouvez combiner un nombre plusieurs conditions à l’aide des
opérateurs AND ou OR.
Exemple 3 :
Considérons la table Employes ayant les enregistrements suivants
+----+---------+-----+---------+
| Id | Nom | Age | Salaire |
+----+---------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
| 2 | Mohamed | 30 | 8000.40 |
| 3 | Fatima | 29 | 6000.00 |
| 4 | Dounia | 31 | 9000.00 |
| 5 | Omar | 30 | 7500.00 |
+----+---------+-----+---------+
La requête suivante mettra à jour le salaire d'un employé en ajoutant 900 DH à son
ancien salaire.
1 UPDATE Employes
2 SET Salaire=Salaire+900;
La requête suivante mettra à jour le salaire de chaque employé dont l'âge est
supérieur ou égal à 30 ans.
1 UPDATE Employes
2 SET Salaire=Salaire+500
3 WHERE age>=30;
2 [WHERE condition];
Exemple 4 :
Ici, colonne1, colonne2,..., colonneN sont les champs d'une table dont vous voulez
récupérer les valeurs. Si vous voulez récupérer tous les champs, vous pouvez utiliser
la syntaxe suivante :
1 SELECT * FROM nom_table;
Exemples
La table échantillon - Employes
+----+---------+-----+---------+
| Id | Nom | Age | Salaire |
+----+---------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
| 2 | Mohamed | 30 | 8000.40 |
| 3 | Fatima | 29 | 6000.00 |
| 4 | Dounia | 31 | 9000.00 |
| 5 | Omar | 30 | 7500.00 |
+----+---------+-----+---------+
Exemple 1 :
La requête suivante est un exemple qui extrairait les champs Id, Nom et Salaire des
employés disponibles dans la table Employes :
1 SELECT Id, Nom, Salaire FROM Employes;
Exemple 2 :
Si vous souhaitez récupérer tous les champs de la table Employes, vous devez
utiliser la requête suivante :
1 SELECT * FROM Employes;
Pour renommer une colonne spécifique dans le jeu de résultats, utilisez le mot
clé AS dans la requête.
Exemple 3 :
Pour renommer la colonne Nom avec "Nom d'employé" dans le jeu de résultats,
utilisez la requête suivante :
1 SELECT Id, Nom AS "Nom d'employé ", Salaire FROM Employes;
La clause SQL WHERE est utilisée pour spécifier une condition lors de l'extraction
des données d'une seule table ou de plusieurs tables associées. Si la condition
donnée est satisfaite, elle renvoie uniquement une valeur spécifique de la table.
Vous devez utiliser la clause WHERE pour filtrer les enregistrements et extraire
uniquement les enregistrements nécessaires.
La clause WHERE est non seulement utilisée dans l'instruction SELECT, mais
également dans l'instruction UPDATE, DELETE, etc.
Pour suivre ce cours correctement, vous devez jeter un coup d'oeil sur les opérateurs
en SQL
Syntaxe :
+----+---------+-----+---------+
| Id | Nom | Age | Salaire |
+----+---------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
| 2 | Mohamed | 30 | 8000.40 |
| 3 | Fatima | 29 | 6000.00 |
| 4 | Dounia | 31 | 9000.00 |
| 5 | Omar | 30 | 7500.00 |
+----+---------+-----+---------+
Exemple 1 :
La requête suivante est un exemple qui extrairait les champs Id, Nom et Salaire de
la table Employes, où le Salaire est supérieur à 7000.
1 SELECT Id, Nom, Salaire FROM Employes WHERE Salaire > 7000;
Exemple 2 :
1 SELECT Id, Nom FROM Employes WHERE age BETWEEN 25 AND 29;
Exemple 3 :
2 FROM nom_table
Exemple 4 :
1 SELECT Id, Nom FROM Employes WHERE Salaire>7000 AND age BETWEEN 25 AND 30;
L'opérateur OR
Cet opérateur affiche les enregistrements pour lesquels au moins une condition est
évaluée à True.
Syntaxe :
2 FROM nom_table
1 SELECT Id, Nom FROM Employes WHERE Salaire>=9000 OR age BETWEEN 25 AND 29;
Parfois, nous pouvons exiger des nuplets de la base de données qui correspondent
à certains modèles. Par exemple, nous pouvons souhaiter extraire toutes les
colonnes où les n-uplets commencent par la lettre "y" ou par "b" et se terminent par
"a", ou même par des motifs de chaîne plus compliqués et restrictifs. C'est ici que la
lause LIKE vient nous sauver.
Souvent associée à la clause WHERE en SQL.
Deux types de caractères génériques sont utilisés pour filtrer les résultats:
% : Utilisé pour faire correspondre zéro, un ou plusieurs caractères. (Longueur variable)
_ : Utilisé pour correspondre exactement à un caractère. (Longueur fixe)
Voici les règles utilisées pour la correspondance de modèle avec la clause LIKE:
Modèle Description
"a%t" Il fait correspondre les chaînes qui commencent par «a» et se terminent par «t».
"%abc%" Il fait correspondre les chaînes qui contiennent la sous-chaîne "abc" en n'importe quelle position.
"_abc%" Il fait correspondre les chaînes contenant la sous-chaîne "abc" en deuxième position.
Il fait correspondre les chaînes qui commencent par "a" et contiennent au moins 2 caractères
"a_%_%"
supplémentaires.
Exemples
La table échantillon - Employes
+----+---------+-----+---------+
| Id | Nom | Age | Salaire |
+----+---------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
| 2 | Mohamed | 30 | 8000.40 |
| 3 | Fatima | 29 | 6000.00 |
| 4 | Dounia | 31 | 9000.00 |
| 5 | Omar | 30 | 7500.00 |
| 6 | Mostafa | 32 | 7000.00 |
+----+---------+-----+---------+
Exemple 1 :
La requête suivante va chercher tous les employés dont les noms commencent par
"Mo"
Exemple 2 :
Exemple 3 :
Exemple 4 :
L’instruction ORDER BY dans SQL est utilisée pour trier les données extraites par
ordre croissant ou décroissant selon une ou plusieurs colonnes.
Par défaut, ORDER BY trie les données par ordre croissant.
Vous pouvez utiliser le mot-clé DESC pour trier les données par ordre décroissant et le
mot-clé ASC pour trier par ordre croissant.
Syntaxe :
1 SELECT liste-colonnes
2 FROM nom_table
3 [WHERE condition]
4 [ORDER BY colonne1, colonne2, .. ] [ASC | DESC];
Attention ! Vous pouvez utiliser plusieurs colonnes dans la clause ORDER BY. Assurez-
vous que les colonnes que vous utilisez pour trier ces enregistrements doivent figurer dans
la liste des colonnes (liste-colonnes).
Lorsque vous utilisez ORDER BY sur plusieurs colonnes, le tri commence par la
première colonne, si deux ou plusieurs enregistrements ont le même rang, alors le tri
passe à la colonne suivante, etc.
Exemples
La table échantillon - Employes
+----+---------+-----+---------+
| Id | Nom | Age | Salaire |
+----+---------+-----+---------+
| 1 | Ismail | 25 | 6000.00 |
| 2 | Mohamed | 30 | 8000.40 |
| 3 | Fatima | 29 | 6000.00 |
| 4 | Dounia | 25 | 9000.00 |
| 5 | Omar | 30 | 7500.00 |
+----+---------+-----+---------+
Exemple 1 :
Exemple 2 :
Exemple 3 :
La clause JOIN est utilisée pour récupérer les données de deux ou plusieurs tables,
qui sont jointes pour apparaître comme un seul ensemble de données. Elle est
utilisée pour combiner des colonnes de deux tables ou plus en utilisant des valeurs
communes aux deux tables.
Le mot-clé JOIN est utilisé dans les requêtes SQL pour joindre deux tables ou plus.
Les conditions minimales requises pour joindre la table sont (n-1), n étant le nombre
de tables. Une table peut également se joindre à elle-même, appelée SELF JOIN.
Voici les types de jointure que nous pouvons utiliser en SQL:
CROSS
INNER
LEFT
RIGHT
SELF
Pendant ce cours, nous allons travailler sur ces deux tables
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 29 | 9000.00 | Ingenieur | 1 |
| 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL |
+----+---------+-----+---------+------------+------+
Table - Departement
+--------+--------------+
| Id_dep | Nom_dep |
+--------+--------------+
| 1 | Informatique |
| 2 | RH |
| 3 | Vente |
| 4 | Strategies |
+--------+--------------+
CROSS JOIN
Ce type de JOIN renvoie le produit cartésien des lignes des tables de la jointure. Elle
renverra un jeu de résultats des enregistrements combinant chaque ligne de la
première table avec chaque ligne de la deuxième table.
Syntaxe :
1 SELECT liste-colonnes
2 FROM
3 table1 CROSS JOIN table2;
Exemple 1 :
Comme vous pouvez le constater, cette jointure renvoie le produit cartésien de tous
les enregistrements présents dans les deux tables.
INNER JOIN
La jointure la plus importante et la plus utilisée est la jointure INNER. Elle est
également appelée jointure d'égalité.
INNER JOIN crée un jeu de résultats en combinant les valeurs de colonne de deux
tables (table1 et table2) en fonction du prédicat de jointure. La requête compare
chaque ligne de table1(A) avec chaque ligne de table2(B) pour rechercher toutes les
paires de lignes satisfaisant le prédicat de jointure. Lorsque le prédicat de jointure est
satisfait, les valeurs de colonne de chaque paire de lignes correspondante de A et
de B sont combinées dans une ligne de résultat.
Syntaxe 1 :
1 SELECT liste-colonnes
2 FROM
3 table1 INNER JOIN table2
4 ON table1.champ_commun = table1.champ_commun;
Syntaxe 2 :
LEFT JOIN
LEFT JOIN renvoie toutes les lignes de la table de gauche, même s'il n'y a pas de
correspondance dans la table de droite. Cela signifie que si la clause ON correspond
à 0 (zéro) enregistrements dans la table de droite; la jointure retournera toujours une
ligne dans le résultat, mais avec NULL dans chaque colonne de la table de droite.
Cela signifie qu'une jointure gauche renvoie toutes les valeurs de la table de gauche,
ainsi que les valeurs correspondantes de la table de droite ou NULL en cas
d'absence de prédicat de jointure correspondant.
Syntaxe:
1 SELECT liste-colonnes
2 FROM
3 table1 LEFT JOIN table2
4 ON table1.champ_commun = table1.champ_commun;
Exemple 3 :
RIGHT JOIN
RIGHT JOIN renvoie toutes les lignes de la table de droite, même s'il n'y a pas de
correspondance dans la table de gauche. Cela signifie que si la
clause ON correspond à 0 (zéro) enregistrements dans la table de gauche; la jointure
retournera toujours une ligne dans le résultat, mais avec NULL dans chaque colonne
de la table de gauche.
Syntaxe:
1 SELECT liste-colonnes
2 FROM
3 table1 RIGHT JOIN table2
4 ON table1.champ_commun = table1.champ_commun;
Exemple 4 :
SELF JOIN
SELF JOIN est utilisée pour joindre une table à elle-même comme si la table était
deux tables; renommer temporairement au moins une table dans l'instruction SQL.
Syntaxe:
1 SELECT liste-colonnes
2 FROM
3 table1 AS T1, table1 AS T2
4 WHERE T1.champ_commun = T2.champ_commun;
Ici, la clause WHERE peut être toute expression donnée en fonction de vos besoins.
Exemple 5 :
Remarque ! Toutes les fonctions d'agrégation excluent par défaut les valeurs NULL avant
de travailler sur les données.
La table échantillon - Employes
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 29 | 9000.00 | Ingenieur | 1 |
| 7 | Mostafa | 29 | 7500.00 | Ingenieur | NULL |
+----+---------+-----+---------+------------+------+
COUNT
La fonction COUNT est utilisée pour compter le nombre de lignes dans une table de
base de données. Il peut fonctionner sur les types de données numériques et non
numériques.
La fonction COUNT utilise COUNT(*) qui renvoie le nombre de toutes les lignes
d'une table spécifiée. COUNT(*) considère les doublons et Null.
Syntaxe :
1 COUNT(*)
2 // ou
Exemple 1 :
SUM
La fonction SUM renvoie la somme de toutes les valeurs de la colonne
spécifiée. SUM fonctionne uniquement sur les champs numériques.
Syntaxe :
Exemple 4 :
La requête suivante renvoie la somme des âges sans compter les valeurs dupliquées
1 SELECT SUM(DISTINCT Age) FROM Employes;
AVG
La fonction AVG renvoie la moyenne des valeurs d'une colonne spécifiée. Tout
comme la fonction SUM, elle ne fonctionne que sur les types de données
numériques.
Syntaxe :
Exemple 6 :
MIN
La fonction MIN est utilisée pour déterminer la plus petite valeur de toutes les valeurs
sélectionnées d'une colonne.
Syntaxe :
Exemple 7 :
MAX
Comme son nom l'indique, la fonction MAX est l'opposé de la fonction MIN. Elle
renvoie la plus grande valeur de toutes les valeurs sélectionnées d'une colonne.
Syntaxe :
Exemple 8 :
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 30 | 9000.00 | Ingenieur | 1 |
| 7 | Mostafa | 29 | 7500.00 | Ingenieur | NULL |
+----+---------+-----+---------+------------+------+
Table - Departement
+--------+--------------+
| Id_dep | Nom_dep |
+--------+--------------+
| 1 | Informatique |
| 2 | RH |
| 3 | Vente |
| 4 | Strategies |
+--------+--------------+
Notez que seuls trois résultats ont été renvoyés. C'est parce que nous n'avons que
trois âges différents. La clause GROUP BY a regroupée tous les employés de la
valeur Age="25" et n'a renvoyée qu'une seule ligne. La même chose avec les valeurs
"29" et "30".
Groupe 1 - Age = 25
+-----+
| Age |
+-----+
| 25 |
+-----+
Groupe 2 - Age=29
+-----+
| Age |
+-----+
| 29 |
| 29 |
+-----+
Groupe 3 - Age = 30
+-----+
| Age |
+-----+
| 30 |
| 30 |
| 30 |
+-----+
3 ON E.Dep=D.Id_dep
4 GROUP BY D.Nom_dep;
Supposons maintenant que nous voulions regrouper tous les employés en fonction
de leur âge et de leur département.
1 SELECT Age, Dep, COUNT(*) FROM Employes GROUP BY Age, Dep;
3 ON E.Dep=D.Id_dep
Clause HAVING
Nous savons que la clause WHERE est utilisée pour imposer des conditions aux
colonnes, mais que se passe-t-il si nous voulons imposer des conditions aux
groupes?
C'est ici que la clause HAVING entre en vigueur. Nous pouvons utiliser la
clause HAVING pour poser des conditions afin de décider quel groupe fera partie de
l'ensemble des résultats finaux. De plus, nous ne pouvons pas utiliser les fonctions
d'agrégation telles que SUM(), COUNT(), etc. avec la clause WHERE. Nous devons
donc utiliser la clause HAVING si nous voulons utiliser l'une de ces fonctions dans
les conditions.
Syntaxe :
Supposons maintenant que nous ne voulions montrer que les départements dont le
salaire moyen est supérieur à 6000 ?
1 SELECT D.Nom_dep, AVG(E.Salaire) AS "Salaire moyen"
2 FROM Employes AS E INNER JOIN Departement AS D
3 ON E.Dep=D.Id_dep
4 GROUP BY D.Nom_dep
Table - Departement
+--------+--------------+
| Id_dep | Nom_dep |
+--------+--------------+
| 1 | Informatique |
| 2 | RH |
| 3 | Vente |
| 4 | Strategies |
+--------+--------------+
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 30 | 9000.00 | Ingenieur | 1 |
| 6 | Mostafa | 29 | 7500.00 | Ingenieur | 3 |
+----+---------+-----+---------+------------+------+
Table - Projet
+------+------------+-----------+------------------+
| Id_p | Titre | Cout | Date_realisation |
+------+------------+-----------+------------------+
| 1 | SIG Meknes | 200000.00 | 2019-01-25 |
| 2 | SI Vente | 130000.00 | 2019-03-12 |
| 3 | Blog RH | 30000.00 | 2018-05-03 |
+------+------------+-----------+------------------+
Table - Participer
+-----+------+
| Emp | Proj |
+-----+------+
| 1| 1|
| 2| 1|
| 2| 3|
| 3| 1|
| 6| 2|
| 6| 3|
+-----+------+
Sous-requêtes indépendantes
Dans les sous-requêtes indépendantes, l'exécution de la requête commence de la
requête la plus interne vers la plus externe. L'exécution d'une requête interne est
indépendante de la requête externe, mais le résultat de la requête interne est utilisé
dans l'exécution de la requête externe. Divers opérateurs tels que IN, NOT IN, ANY,
ALL, etc. sont utilisés pour l'écriture de sous-requêtes indépendantes.
Exemple 1 :
Si nous voulons connaître les Ids des employés qui participent aux projets «Vente
SI» ou «Blog RH», nous pouvons l’écrire à l’aide d’une sous-requête indépendante
et d’un opérateur IN. A partir de la table Projet, nous pouvons trouver Id_p pour les
projet «SI Vente» ou «Blog RH» et nous pouvons utiliser ces Id_p pour trouver Ids
des employés à partir de la table Particper.
Nous pouvons le faire en deux étapes :
Etape 1 - Trouver Id_p pour les projet «SI Vente» ou «Blog RH»
Etape 2 - utiliser les Id_p pour de la première etape pour trouver les Ids des employés à partir de la table
Particper
2 WHERE Proj IN (SELECT Id_p FROM Projet WHERE Titre="Blog RH" OR Titre="Vente SI");
Sous-requêtes corrélées
Une sous-requête corrélée est une sous-requête dont le résultat est différent selon
les valeurs de la ligne de la requête externe pour laquelle la sous-requête est
exécutée. Cela rend nécessaire d'exécuter la sous-requête pour chaque ligne
extraite par la requête externe et ajoute au coût de performance de la requête.
Exemple 1 :
Dans la requête ci-dessus, la sous-requête doit être exécutée pour chaque ligne de
la table Employes, car chaque employé peut appartenir à un service différent. Par
conséquent, comparer son salaire au salaire maximum de son service signifie qu'il
peut potentiellement être comparé à un nombre différent.
La requête doit exécuter la sous-requête pour chaque valeur distincte de Dep. Elle
peut également trouver un moyen de mettre en cache les résultats de ces sous-
requêtes et de les utiliser pour comparer les lignes d'employés suivantes avec le
même Dep. Certaines implémentations SQL peuvent effectuer cette optimisation,
d'autres non.
Si la sous-requête n'est pas corrélée, elle renverra logiquement le même résultat,
quelles que soient les valeurs de la ligne de la requête externe. L'optimiseur SQL
peut être conçu pour factoriser complètement la sous-requête, de sorte qu'elle n'ait à
exécuter qu'une seule fois, quel que soit le nombre de lignes de la requête externe
qui utilisent le résultat. C'est souvent une grande amélioration pour la performance.
Sous-requêtes vs jointures
Comparées aux jointures, les sous-requêtes sont simples à utiliser et à lire. Ils ne
sont pas aussi compliqués que les jointures. Par conséquent, les débutants en SQL
l'utilisent fréquemment.
Mais les sous-requêtes posent des problèmes de performances. L'utilisation d'une
jointure au lieu d'une sous-requête peut parfois vous donner un gain de
performances jusqu'à 500 fois. Si vous avez le choix, il est recommandé d'utiliser une
jointure plutôt qu'une sous-requête.
Les sous-requêtes ne doivent être utilisées comme solution de secours que lorsque
vous ne pouvez pas utiliser une opération JOIN pour atteindre les objectifs ci-dessus.
Sous-requêtes avec l'instruction INSERT
La sous-requête SQL peut également être utilisée avec l'instruction INSERT. Dans
l'instruction INSERT, les données renvoyées par la sous-requête sont utilisées pour
être insérées dans une autre table.
Dans la sous-requête, les données sélectionnées peuvent être modifiées avec
n’importe laquelle des fonctions de caractère et de date.
Syntaxe :
1 UPDATE table
2 SET nom_colonne = nouvelle_valeur
3 [ WHERE OPERATOR [ VALUE ]
4 (SELECT COLUMN_NAME
5 FROM TABLE_NAME)
[ WHERE) ]
6
Exemple 1 :
Supposons que nous ayons une table Employes_SAUVEGARDE disponible qui est
une sauvegarde de la table Employes. L'exemple donné supprime les
enregistrements de la table Employes pour tous les employés dont l'âge est inférieur
ou égal à 29.
?
1 DELETE FROM Employes
La clause/opérateur SQL UNION est utilisée pour combiner les résultats de deux ou
plusieurs instructions SELECT sans renvoyer les lignes en double.
Pour utiliser cette clause UNION, chaque instruction SELECT doit avoir :
Le même nombre de colonnes sélectionnées
Le même type de données et
Les avoir dans le même ordre
Mais ils n'ont pas besoin d'être dans la même longueur.
La clause UNION produit des valeurs distinctes dans le jeu de résultats. Pour extraire
les valeurs en double, UNION ALL doit être utilisée à la place de UNION.
Syntaxe - UNION
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Technicien | 2 |
| 2 | Mohamed | 30 | 2000.10 | Directeur | 1 |
| 3 | Fatima | 29 | 8000.00 | Assistant | 2 |
| 4 | Dounia | 30 | 1750.00 | Assistant | 4 |
| 5 | Omar | 30 | 2250.00 | Ingenieur | 1 |
| 6 | Mostafa | 32 | 7500.00 | Formateur | 1 |
+----+---------+-----+---------+------------+------+
Table - Conges
+------+------------+------------+-------------------+-----+
| Id_c | Date_debut | Date_fin | Raison | Emp |
+------+------------+------------+-------------------+-----+
| 1 | 2019-02-01 | 2019-02-15 | Voyage | 1|
| 2 | 2019-05-20 | 2019-06-03 | Maladie d'enfant | 3 |
| 3 | 2019-09-01 | 2019-09-15 | Rentrée scolaire | 4 |
+------+------------+------------+-------------------+-----+
Remarque ! Les noms de colonne dans les deux instructions SELECT peuvent être
différents mais le type de données doit être identique. Et dans le résultat, le nom de la
colonne utilisée dans la première instruction SELECT apparaîtra.
Exemples
Exemple 1 :
4 ORDER BY Id;
Cette requête produira le jeu de résultats suivant :
+----+---------+
| Id | Nom |
+----+---------+
| 1 | Voyage |
| 4 | Dounia |
| 5 | Omar |
| 6 | Mostafa |
+----+---------+
Exemple 4 :
2 UNION
En SQL, les dates sont compliquées pour les débutants, car lors de l'utilisation d'une
base de données, le format de la date dans le tableau doit être apparié avec la date
d'entrée pour pouvoir l'insérer.
Dans divers scénarios au lieu de la Date, DateTime(l'heure est également impliquée
avec la date) est utilisé.
Dans ce cours, nous allons parler de différentes fonctions de date par défaut dans
MySQLl.
La table échantillon - Conges
+------+------------+------------+-------------------+-----+
| Id_c | Date_debut | Date_fin | Raison | Emp |
+------+------------+------------+-------------------+-----+
| 1 | 2019-02-01 | 2019-02-15 | Voyage | 1|
| 2 | 2019-05-20 | 2019-06-03 | Maladie d'enfant | 3 |
| 3 | 2019-09-01 | 2019-09-15 | Rentrée scolaire | 4 |
| 4 | 2019-09-24 | 2019-09-29 | Voyage | 2|
| 5 | 2019-09-19 | 2019-09-24 | Soutenance | 5|
+------+------------+------------+-------------------+-----+
NOW()
Renvoie la date et l'heure actuelles sous forme de valeur au format 'AAAA-MM-JJ
HH: MM: SS' ou YYYYMMDDHHMMSS, selon que la fonction est utilisée dans un
contexte de chaîne ou numérique. La valeur est exprimée dans le fuseau horaire
actuel.
Exemple :
1 SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2019-09-24 13:48:18 |
+---------------------+
CURDATE()
Renvoie la date actuelle sous forme de valeur au format 'AAAA-MM-
JJ' ou AAAAMMMJJ, selon que la fonction est utilisée dans un contexte de chaîne
ou numérique.
Exemple :
1 SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2019-09-24 |
+------------+
CURTIME()
Renvoie l'heure actuelle sous forme de valeur au format 'HH: MM: SS' ou HHMMSS,
selon que la fonction est utilisée dans un contexte de chaîne ou numérique. La
valeur est exprimée dans le fuseau horaire actuel.
Exemple :
1 SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 13:59:00 |
+-----------+
DATE(date)
Extrait la partie date de la date ou de l'expression DateTime.
Exemple 1 :
+-----------------------------+
| DATE('2019-09-24 13:59:03') |
+-----------------------------+
| 2019-09-24 |
+-----------------------------+
Exemple 2 :
?
1 SELECT DATE(Date_debut) FROM Conges;
+------------------+
| DATE(Date_debut) |
+------------------+
| 2019-02-01 |
| 2019-05-20 |
| 2019-09-01 |
| 2019-09-24 |
| 2019-09-19 |
+------------------+
3 FROM Conges;
+------+------+--------+
| Jour | Mois | Année |
+------+------+--------+
| 1 | 2 | 2019 |
| 20 | 5 | 2019 |
| 1 | 9 | 2019 |
| 24 | 9 | 2019 |
| 19 | 9 | 2019 |
+------+------+--------+
+---------------------------------------+
| DATE_ADD(Date_debut, INTERVAL 1 YEAR) |
+---------------------------------------+
| 2020-02-01 |
| 2020-05-20 |
| 2020-09-01 |
| 2020-09-24 |
| 2020-09-19 |
+---------------------------------------+
Exemple 2 :
+----------------------------------------+
| DATE_ADD(Date_debut, INTERVAL 3 MONTH) |
+----------------------------------------+
| 2019-05-01 |
| 2019-08-20 |
| 2019-12-01 |
| 2019-12-24 |
| 2019-12-19 |
+----------------------------------------+
+----------------------------------------+
| DATE_SUB(Date_debut, INTERVAL 3 MONTH) |
+----------------------------------------+
| 2018-11-01 |
| 2019-02-20 |
| 2019-06-01 |
| 2019-06-24 |
| 2019-06-19 |
+----------------------------------------+
DATEDIFF(date1, date2);
Renvoie date1-date2 sous forme de valeur en jours d'une date à
l'autre. date1 et date2 sont des expressions de date ou de date et heure. Seules les
parties de date des valeurs sont utilisées dans le calcul.
Exemple :
+----------------------+
| Nombre jours passés |
+----------------------+
| 235 |
| 127 |
| 23 |
| 0|
| 5|
+----------------------+