Le Structured Query Language est un langage de requète de bases de données, chaque requête est exécuté à la suite.
Convention
En SQL on utilise le Snake Case, les objets sont au singulier, exemple :
Les tables descriptives sont plus faciles à comprendre, les colonnes doivent être lisibles :
date_achat et non dt_achat !
Important
Chaque ordre d’une requète sur sa propre ligne !
sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATETABLEIFNOTEXISTSutilisateur(idINTEGERPRIMARYKEY,nomTEXT,dateNaissanceDATE,villeNaissanceTEXT);INSERTINTOutilisateur(nom,dateNaissance,villeNaissance)VALUES("Jean",'2000-01-01',"Lille"),("François",'1980-05-07',"Roubaix");-- A ne pas faire !
SELECT*FROMutilisateurWHEREdateNaissance>'1990-01-01';-- A faire !
SELECT*FROMutilisateurWHEREdateNaissance>'1990-01-01';
Les conventions sont définies par la norme ISO/IEC 9075.
CREATETABLEIFNOTEXISTScourse(idSERIALPRIMARYKEY,nom_coureurTEXT,nom_courseTEXT,temps_courseDOUBLEPRECISION,taille_courseINTEGER);INSERTINTOcourse(nom_coureur,nom_course,temps_course,taille_course)VALUES('Jean','course du peuplier',32.04,200),('Charles','course de la musaraigne',10.41,100),('Thomas','course du chat',42.41,200),('Jeanne','course du berger',21.10,200),('Marc','course de Lille',15.86,100),('Patrique','course de pot',20.06,100);SELECTAVG(temps_course)AS"temps moyen",taille_courseAS"distance"FROMcourseGROUPBYtaille_course;
CREATETABLEIFNOTEXISTScourse(idSERIALPRIMARYKEY,nom_coureurTEXT,nom_courseTEXT,temps_courseDOUBLEPRECISION,taille_courseINTEGER);INSERTINTOcourse(nom_coureur,nom_course,temps_course,taille_course)VALUES('Jean','course du peuplier',32.04,200),('Charles','course de la musaraigne',10.41,100),('Thomas','course du chat',42.41,200),('Jeanne','course du berger',21.10,200),('Marc','course de Lille',15.86,100),('Patrique','course de pot',20.06,100);SELECTnom_coureurAS'coureur',taille_courseAS'taille course',MIN(temps_course)AS'temps minimum'FROMcourseGROUPBYtaille_course;
CREATETABLEIFNOTEXISTScourse(idSERIALPRIMARYKEY,nom_coureurTEXT,nom_courseTEXT,temps_courseDOUBLEPRECISION,taille_courseINTEGER);INSERTINTOcourse(nom_coureur,nom_course,temps_course,taille_course)VALUES('Jean','course du peuplier',32.04,200),('Charles','course de la musaraigne',10.41,100),('Thomas','course du chat',42.41,200),('Jeanne','course du berger',21.10,200),('Marc','course de Lille',15.86,100),('Patrique','course de pot',20.06,100);SELECTnom_coureurAS'coureur',taille_courseAS'taille course',MAX(temps_course)AS'temps maxiumum'FROMcourseGROUPBYtaille_course;
Info
La clause GROUP BY permet de regrouper les lignes selon une colonne, pour appliquer des fonctions d’agrégation sur chaque groupe.
CREATETABLEIFNOTEXISTSproduit(idINTEGERPRIMARYKEY,nomTEXT,nombre_produitINTEGER,type_produitTEXT);INSERTINTOproduit(nom,nombre_produit,type_produit)VALUES('Baguette',10,"aliment"),('Chaise',5,"objet"),('Banane',25,"aliment"),('Tasse',8,"aliment");SELECTtype_produitAS'type de produit',SUM(nombre_produit)AS'nombre de produit'FROMproduitGROUPBYtype_produit;
On retourne seulement les lignes correspondantes dans les deux tables
sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATETABLEIFNOTEXISTSutilisateur(idINTEGERPRIMARYKEY,nomTEXT);CREATETABLEIFNOTEXISTScommande(idINTEGERPRIMARYKEY,utilisateur_idINTEGER,produitTEXT,nombre_produitINTERGER,FOREIGNKEY(utilisateur_id)REFERENCESutilisateur(id));INSERTINTOutilisateur(nom)VALUES('Jean'),('François'),("Thomas");INSERTINTOcommande(utilisateur_id,produit,nombre_produit)VALUES(1,'Chaise',4),(2,'Table',1);-- INNER JOIN : uniquement les utilisateurs ayant une commande
SELECTu.nom,c.produit,c.nombre_produitFROMutilisateurASuINNERJOINcommandeAScONc.utilisateur_id=u.id;
Dans une jointure, utiliser des alias (ici u et c) rend le code plus lisible.
Toujours écrire les mots-clés SQL en majuscules : SELECT, FROM, JOIN, WHERE, etc.