Dû à l'historique des sgbdr, le langage SQL est très proche de l'algèbre et du modèle relationnel.
Lorsque le modèle relationnel parle de relations, d'attributs et de tuples,
SQL les appelle tables, colonnes et lignes.
En SQL il existe 2 types de mots :
Le langage SQL n'est pas sensible à la casse ! (sauf pour les comparaisons de chaînes de caractère évidement)
Un SGBD possède 2 langages, le langage de définition des données et le langage de manipulation
SQL permet de faire les 2 !
Cette capsule vidéo va présenter en détail le langage de manipulation des données.
Vous aurez besoin des 2 langages pour le projet final
Vous disposez de 4 opérations principales :
Notons qu'on utilise des guillemets pour identifier les chaînes de caractères uniquement
On utilise donc pas de guillemets pour les booléens et les nombres
La requête SELECT est généralement composée de 3 clauses :
Mais on peut la compléter de cette manière :
SELECT [DISTINCT|ALL]{*|expColonne [AS nom]] [,...]}
FROM nomTable [alias] [,...]
[WHERE condition]
[GROUP BY listeColonnes] [HAVING condition]
[ORDER BY listeColonnes]
L'ordre d'apparition des clauses SELECT FROM WHERE GROUP BY HAVING ORDER BY n'est pas interchangeable !
Par contre l'ordre de traitement des mots clés est différent de l'ordre d'écriture de la requète !
Comme le résultat de la requête SELECT est une table, il est temps de présenter les différents types de tables en SQL !
select NCLI, NOM, LOCALITE
from CLIENT;
| NCLI | NOM | LOCALITE | B062 | GOFFIN | Namur |
|---|---|---|
| B112 | HANSENNE | Poitiers |
| B332 | MONTI | Genève |
| ... | ... | ... |
select NCLI, NOM
from CLIENT
where LOCALITE = 'Toulouse';
| NCLI | NOM | B512 | GILLET |
|---|---|
| C003 | AVRON |
| D063 | MERCIER |
| ... | ... |
select distinct LOCALITE
from CLIENT
where CAT = 'C1';
Dans la clause WHERE, il est possible de mettre tous les opérateurs connus :
select NCLI
from CLIENT
where CAT in ('C1','C2','C3');
select NCLI
from CLIENT
where CAT not in ('C1','C2','C3');
select NCLI
from CLIENT
where COMPTE between 1000 and 4000;
Il est aussi possible de rechercher la présence de certains caractères dans un champ. La clause like permet de le faire
Categorie like '_1'
adresse like '%Neuve%'
Comme dans tous les langages de programmation, il est possible d'utiliser les opérateurs d'algèbre de bool (and, or et not)
Exemple :
SELECT nom, adresse, compte
FROM Client
WHERE LOCALITE = 'Toulouse' and COMPTE > 0
Il est toujours possible d'utiliser des parenthèses pour spécifier explicitement les priorités des opérateurs
char_length(ch)
cast(v as t)
extract(u from d_t)
case when c1 then exp1
extract(year from datecreation) -1
Select NCLI,
case substring(CATEGORIE from 1 for 1)
when 'A' then 'BON'
when 'B' then 'MOYEN'
when 'C' then 'OCCASIONNEL'
else coalesce(CATEGORIE, 'INCONNU')
end, LOCALITE
from CLIENT;
Bien entendu, les fonction d'agrégation retournent qu'une seule valeur, il est donc illégal de les utiliser en sélectionnant plusieurs lignes avec une fonction d'agrégation !
aussi elles ne peuvent être utilisés que dans la portion select ou having d'une requête
SELECT no_employé, count(salary)
FROM Employés;
Cette requête ne fonctionne pas !
SELECT count(*) FROM Employés
Cette requête fonctionne !
SELECT MIN(salary) AS myMin,
MAX(salary) AS myMay, AVG(salary) AS myAVG,
AVG(salary) AS myAVG
FROM Staff;
Il faut respecter certaines restriction pour regrouper les données :
Chaque item du SELECT doit retourner une seule valeur par groupe
La clause SELECT peut contenir seulement des noms de colonnes, des constantes et des fonctions d'agrégation.
Tous les noms de colonnes du SELECT doivent apparaître dans la clause GROUP BY, à monis que le nom ne soit utilisé seulement dans une fonction d'agrégation
Si WHERE est utilisé avec GROUP BY, WHERE est évalué d'abord, et ensuite les groupes sont formés avec les lignes restantes
Pour les besoins de GROUP BY, deux valeurs nulles sont considérées égales
La clause HAVING est toujours utilisée avec GROUP BY
Elle Sert à filtrer les groupes qui apparaissent dans la table finale, selon une condition
Elle fonctionne comme un WHERE sauf que WHERE filtre les lignes alors que HAVING filtre les groupes
Les noms des colonnes dans la portion HAVING doivent apparaître dans GROUP BY ou être contenus dans une fonction d'agrégation
SELECT branchNo,
COUNT(staffNo) AS myCount,
SUM(salary) AS mySum
FROM Staff
GROUP BY branchNo
ORDER BY branchNo;
Compter le nombre de salariés par branche de l'entreprise et indiquer la somme de leur salaires
| BranchNo | Mycount | Mysum |
|---|---|---|
| B003 | 3 | 54000 |
| B005 | 2 | 39000 |
Pour chaque succursale avec plus d'un employé, trouver le nombre d'employés et leur salaire total (par succursale).
SELECT branchNo,
COUNT(staffNo) AS myCount,
SUM(salary) AS mySum
FROM Staff
GROUP BY branchNo
HAVING COUNT(staffNo) > 1;
ORDER BY branchNo;
| BranchNo | Mycount | Mysum |
|---|---|---|
| B003 | 3 | 54000 |
| B005 | 2 | 39000 |
Dans notre requète il est possible de rechercher les colonnes ou Null est indiqué.
Select * FROM CLIENT
WHERE date_suppression IS NULL
attention il faut utiliser IS NULL et non date_suppression NULL
Il est toujours possible d'intégrer une requête SQL à l'intérieur d'une autre requête SQL.
SELECT NCLI
FROM CLIENT
WHERE LOCALITE='NAMUR'
Cette requête retourne (1,3,6,7)
SELECT NOM, DATE_COMMANDE
FROM COMMANDE
WHERE NCLI in (1,3,6,7)
Cela donne conc :
SELECT NOM, DATE_COMMANDE
FROM COMMANDE
WHERE NCLI in (SELECT NCLI
FROM CLIENT
WHERE LOCALITE='NAMUR');
La jointure permet de créer une table constituée des données de plusieurs tables :
select NCOM, DATECOM, CLIENT.NCLI, NOM, LOCALITE
from COMMANDE, CLIENT
where COMMANDE.NCLI = CLIENT.NCLI;
select CLIENT.NCLI, NOM, DATECOM, NPRO
from CLIENT, COMMANDE, DETAIL
where CLIENT.NCLI = COMMANDE.NCLI
and COMMANDE.NCOM = DETAIL.NCOM;
select NCOM, CLIENT.NCLI, DATECOM, NOM, ADRESSE
from COMMANDE, CLIENT
where COMMANDE.NCLI = CLIENT.NCLI
and CAT = 'C1'
and DATECOM < '23-12-2009';
select NCOM,DATECOM
from COMMANDE
where NCLI in (select NCLI
from CLIENT
where LOCALITE = 'Poitiers');
=
select NCOM,
from COMMANDE,
where COMMANDE.NCLI = CLIENT.
and LOCALITE = 'Poitiers';
La sous-requête permet de formuler :
Alors que la jointure ne permet de formuler uniquement une condition d'association
Le résultat d'une jointure clé étrangère/Id représente les entités de la table de la clé étrangère
Union, intersection, différence
SELECT CLI_NOM, TEL_NUMERO
FROM CLIENT c
INNER JOIN TELEPHONE t
ON c.CLI_ID = t.CLI_ID
Le mot clef INNER est facultatif. Par défaut l'absence de précision de la nature de la jointure la fait s'exécuter en jointure interne.
Il existe 3 types de jointures externes, les Left outer join, les right outer join et les full outer join.
SELECT colonnes
FROM TGauche LEFT OUTER JOIN TDroite ON condition de jointure
SELECT colonnes
FROM TGauche RIGHT OUTER JOIN TDroite ON condition de jointure
SELECT colonnes
FROM TGauche FULL OUTER JOIN TDroite ON condition de jointure
Les jointures externes sont extrêmement pratiques pour rapatrier le maximum d'informations disponible, même si des lignes de table ne sont pas renseignées entre les différentes tables jointes.
Les mots clefs LEFT, RIGHT et FULL indiquent la manière dont le moteur de requête doit effectuer la jointure externe. Il font référence à la table située à gauche (LEFT) du mot clef JOIN ou à la table située à droite (RIGHT) de ce même mot clef. Le mot FULL indique que la jointure externe est bilatérale.
INSERT INTO client values(1,'Marie', 'Tremblay');
Si la table contient déjà des lignes qui violent la contrainte que l'on souhaite ajouter, alors il sera impossible de l'ajouter.
INSERT INTO client (prenom_client, nom_client) values('Marie', 'Tremblay');
Si la table contient déjà des lignes qui violent la contrainte que l'on souhaite ajouter, alors il sera impossible de l'ajouter.
INSERT INTO client (prenom_client, nom_client)
values('Marie', 'Tremblay'),
('Serge', 'Gagnon');
L'argument de la fonction insert into est une table statique, il est donc possible d'ajouter plusieurs lignes à la fois !
DELETE FROM client WHERE id_client='1';
Nous verrons l'instruction where dans le prochain cours !
UPDATE client
SET nom_client='Vivaldi'
WHERE id_client='1';
Il est important de noter que la mise à jour, et la modification des données ne sera effectuée uniquement si les résultats obtenus respectent toutes les contraintes définies par votre schéma de base de données !