SQL signifie Structured Query Language (Langage de Requête Structurée).
C'est un langage standard permettant d'interroger et de manipuler des bases de données relationnelles.
Un serveur Bases de Données contient une ou plusieurs bases de données, interrogeable par un programme client. Le client demande par exemple au serveur de bases de données la liste des employés habitant Marseille. Le langage va beaucoup plus loin comme nous allons le voir ci-dessous.
Théoriquement c'est plus rapide à parser mais les parsers ne sont pas sensibles à la casse.
Le langage SQL s'appuie sur trois langages:
- Le DDL (Data Definition Language) Langage de Définition de Données, qui permet de créer des bases de données, des tables , modifier une table, ses champs... Cad la structure.
- Le Langage de Contrôle de Données LCD (en anglais DCL, Data Control Language),
qui permet d'assigner ou de révoquer des droits aux utilisateurs. Par exemple ne pas permettre à l'utilisateur Dupont d'effacer une table. Cad les droits des utilisateurs.
- Le DML (Data Manipulation Language) qui est un Langage de Manipulation de Données: il permet d'accéder aux enregistrements : obtenir, insérer, effacer, modifier...Cad les données.
Syntaxe du SQL
La casse
Le développeur est libre d'utiliser des majuscules ou des minuscules pour rédiger la requête SQL.Par souci de lisibilité et de rapidité de lecture de la requête, les termes SQL sont généralement en majuscules.
Le langage n'est pas sensible à la casse. Cependant comme il est souvent employé depuis un autre langage de programmation, on tend à l'écrire en majuscules pour rendre le code plus lisible: ce qui est en majuscule est du SQL.
Les commentaires
Les commentaires se notent (selon les SGBD: Système de Gestion de Bases de Données):- avec une ligne commençant par #
- ou double tiret --
- ou commentaire C /* */
Administration en console
$ sudo apt install mysql-server $ sudo mysql $ mysql -u root -p mysql> CREATE DATABASE mabase; CREATE USER 'bert'@'localhost' IDENTIFIED BY 'mot_de_passe_solide'; GRANT ALL ON mabase.* TO 'bert'@'localhost'; mysql> exit; byeMySQL gère une base de données information_schema qui contient la liste des tables de toutes les bases de données.
Ainsi si on découvre une installation,
on peut obtenir la liste des bases de données avec SHOW DATABASES,
s'y connecter avec USE,
et sortir la liste des tables d'une base avec SHOW TABLES:
$ mysql -u bert -p (saisir le passe) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | mabase | | information_schema | +--------------------+ 2 rows in set (0,12 sec) mysql> SELECT table_name FROM information_schema.tables -> WHERE table_schema = 'mabase'; +---------------+ | TABLE_NAME | +---------------+ | cab_elements | | cab_projets | | car_appareils | | car_elements | | table_test | +---------------+ 5 rows in set (0,02 sec) mysql> USE mabase; mysql> SHOW TABLES; mysql> SELECT * FROM cab_projets; mysql> exit; Bye $
DDL
Il faut préciser la liste de champs entre parenthèses, suivi du type et des attributs optionnels, en séparant les champs par des virgules.Chaque champ a un type qui lui est le plus adapté, pour garantir les performances. En effet, il est plus judicieux de stocker un age dans un champ qui n'occupe qu'un octet (puisque un âge est forcément compris entre 0 et 255 qui est la plage de valeurs d'un char non signé) que dans un int qui lui est stocké sur 4 octets!
En mémoire et dans le fichier, chaque table est une succession d'enregistrements composés de cases ayant la taille de leur type.
les types de données MySQL
DCL
Le DCL (Data Control Language) est le langage de contrôle des données: qui peut faire quoi sur les données. Il permet d'attribuer des droits à un utilisateur avec les verbes suivants Autoriser un utilisateur d'effectuer certaines tâches (lui autoriser de faire un SELECT, et/ou un drop etc...) :Attention à cette requête SQL: l'utilisateur Dubois a TOUS les droits. Dans un cadre d'utilisation normal on restreint au maximum les droits des utilisateurs pour limiter les dégats en cas d'usurpation d'identité ou hacking du serveur.
Est plus prudent: accorder à Dubois d'effectuer des requêtes SELECT sur la table réservations.
Supprimer les droits et limitations précédemment accordées à un utilisateur. C'est la révocation des privilèges:
Dubois ne peut plus effacer d'enregistrements de la table réservations.
Référence DCL (fr)
DML
Langage de Manipulation des Données: manipule les enregistrements, le contenu des tables.Instruction SELECT
Afficher des enregistrements d'une table:L'étoile signifie tous les champs. Le mot ALL est équivalent: Afficher les valeurs de quelques champs d'une table: Sans doublons: Le langage est dit de requête structurée car il y a un ordre:
- Restriction: WHERE
- Connecteurs logiques:
AND, OR, NOR
- Opérateurs arithmétiques
- +
- -
- *
- /
- ^
- Comparateurs arithmétiques
- =
- != ou <> (différent)
- <
- >
- <= (inférieur ou égale)
- >= (supérieur ou égale)
- BETWEEN ... AND
La requête aurait pu se noter ainsi: - IN
- LIKE
- IS NULL, IS NOT NULL
- fonction agrégats
- COUNT permet de compter le nombres de valeurs d'un ensemble.
- SUM permet de faire la somme des valeurs d'un ensemble.
- AVG permet de calculer la moyenne des valeurs d'un ensemble.
- MAX permet d'obtenir la valeur maximale d'un ensemble.
- MIN permet d'obtenir la valeur minimale d'un ensemble.
- COUNT permet de compter le nombres de valeurs d'un ensemble.
- Fonctions Mathématiques et trigonométriques
Référence
- GROUP BY
- HAVING
- ORDER BY
Cette clause sert à classer par ordre croissant ou décroissant le résultat d'une requête.
ASC par défaut. Pour Classer par ordre décroissant - UNION
Concatène les résultats de deux requêtes (en DISTINCT par défaut) Sans DISTINCT: - LIMIT
LIMIT limite le nombre de résultats.
Jointures
PostgreSQL 5 jointures:- PostgreSQL INNER JOIN (or sometimes called simple join)
- PostgreSQL LEFT OUTER JOIN (or sometimes called LEFT JOIN)
- PostgreSQL RIGHT OUTER JOIN (or sometimes called RIGHT JOIN)
- PostgreSQL FULL OUTER JOIN (or sometimes called FULL JOIN)
- PostgreSQL Jointure implicite (possible mais déconseillé)
- MySQL Jointure implicite
- MySQL INNER JOIN (Équivalent syntaxique à JOIN et CROSS JOIN)
- MySQL LEFT OUTER JOIN (Équivalent syntaxique à LEFT JOIN)
- MySQL RIGHT OUTER JOIN (Équivalent syntaxique à RIGHT JOIN)
Afin de garder la taille de la table minimale donc plus rapide,
au lieu de répéter la chaîne du nom du département à chaque enregistrement,
stocke l'index du nom du département (qui lui n'est pas un string mais un chiffre qui occupe moins de place en mémoire donc plus rapide à parcourir).
Ainsi avec une table de clients et une table de détails du département, le champ `departement` correspond au champ `id` de la table département.
Type de relation de 1 à n.
au lieu de répéter la chaîne du nom du département à chaque enregistrement,
stocke l'index du nom du département (qui lui n'est pas un string mais un chiffre qui occupe moins de place en mémoire donc plus rapide à parcourir).
Ainsi avec une table de clients et une table de détails du département, le champ `departement` correspond au champ `id` de la table département.
Type de relation de 1 à n.
Table clients | |||
id | nom | prenom | departement |
1 | De Niro | Robert | 2 |
2 | Dugron | Charles | 1 |
3 | Bruni | Carla | 2 |
4 | Brandon | Jean-Michel | 2 |
5 | Dupont | Jean | 3 |
6 | Hendrix | Jimi | 3 |
Table departement | |||
id | code | nom | |
1 | 06 | Alpes Maritimes | |
2 | 13 | Bouches du Rhône | |
3 | 83 | Var | |
4 | 2A | Corse nord |
Cette jointure implicite produira ce jeu de données:
De Niro | Bouches du Rhône |
Dugron | Alpes Maritimes |
Bruni | Bouches du Rhône |
Brandon | Bouches du Rhône |
Jointures explicites
-
La jointure interne (INNER JOIN).
Ne sont incluses dans le résultat final que les lignes qui se correspondent dans les deux tables.
Appelée jointure d'égalité elle crée une relation de correspondance entre des tables. La requête précédente aurait pu s'écrire:
Ici on joint deux tables. Pour joindre une table supplémentaire rajouter un Avec un alias Avec un alias sans AS -
La jointure externe gauche, dans laquelle INNER JOIN est remplacé par
LEFT OUTER JOIN. Toutes les lignes de la première table sont incluses dans le
résultat de la requête, même s'il n'existe pas de ligne correspondante dans la
seconde table.
- La jointure externe droite, dans laquelle INNER JOIN est remplacé par RIGHT OUTER JOIN. Toutes les lignes de la seconde table sont incluses dans le résultat de la requête, même s'il n'existe pas de ligne correspondante dans la première table.
Doc MySQL8 JOIN
Wikipedia join