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:

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):

Administration en console

$ sudo apt install mysql-server

Sur de nombreuses distributions Linux (comme Debian/Ubuntu avec MariaDB),
l'utilisateur root peut se connecter sans mot de passe via la commande sudo mysql en utilisant l'authentification par socket Unix.
$ sudo mysql

Sinon -u root et -p demande le mot de passe
$ 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;
bye
MySQL 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_projets   |
| table_test    |
+---------------+
5 rows in set (0,02 sec)

mysql> USE mabase;
mysql> SHOW TABLES;
mysql> SELECT * FROM cab_projets;
mysql> exit;
Bye
$
	

Clés et contraintes

Clé primaire

Une clé primaire est une contrainte qui identifie de manière unique chaque enregistrement d'une table,
en imposant que les valeurs soient à la fois uniques et non nulles. Chaque table ne peut posséder qu'une seule clé primaire,
qui peut être composée d'une ou plusieurs colonnes.

Lorsqu'une clé primaire est définie, le système de gestion de base de données crée automatiquement un index unique pour optimiser
les recherches et appliquer la contrainte. Les colonnes participant à la clé primaire sont implicitement marquées NOT NULL,
garantissant ainsi l'intégrité de l'entité des données.

Les principales caractéristiques de cette contrainte incluent :

Clé étrangère

La clé primaire identifie de manière unique chaque ligne de sa propre table, tandis que
la clé étrangère crée un lien entre deux tables en référençant la clé primaire d'une autre table.
Aspect Clé primaire Clé étrangère
Rôle Identifie une ligne de sa tableRéférence une ligne d'une autre table
Unicité Toujours unique Peut contenir des doublons
Valeurs NULL Jamais autorisées Autorisées (sauf NOT NULL)
Nombre par table Une seule Plusieurs possibles
Index Créé automatiquement Pas toujours automatique (à ajouter manuellement sur PostgreSQL/SQL Server)
Intégrité assurée Intégrité de l'entité Intégrité référentielle
En résumé : la clé primaire est l'identité d'une ligne ; la clé étrangère est le lien qui rattache cette ligne à une autre.
Une même colonne peut être à la fois les deux (par exemple dans une relation un-à-un).

Clé primaire composée (ou composite)

Une clé primaire composée (ou composite) est une contrainte de base de données qui utilise deux colonnes ou plus pour identifier de manière unique chaque enregistrement d'une table.
Contrairement à une clé simple, aucune colonne individuelle n'est nécessairement unique, mais la combinaison de toutes les colonnes de la clé doit l'être.

Exemple concret
Dans une table reliant des étudiants à des cours,
une clé composite (etudiant_id, cours_id) garantit qu'un étudiant ne peut s'inscrire qu'une seule fois à un cours donné,
tout en permettant des inscriptions multiples pour le même étudiant dans différents cours.

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:


Jointures

types de jointures SQL

PostgreSQL 5 jointures: MySQL8: 4 jointures notées de 8 façons différentes
Jointure implicite
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.
Table clients
idnomprenomdepartement
1De NiroRobert2
2DugronCharles1
3BruniCarla2
4BrandonJean-Michel2
5DupontJean3
6HendrixJimi3
Table departement
idcodenom
106Alpes Maritimes
213Bouches du Rhône
383Var
42ACorse nord

Cette jointure implicite produira ce jeu de données:
De NiroBouches du Rhône
DugronAlpes Maritimes
BruniBouches du Rhône
BrandonBouches du Rhône



Jointures explicites Si aucune instruction de jointure n'est fournie dans une requête de sélection, alors cette dernière renverra la totalité des lignes présentes dans les tables concernées.
Doc MySQL8 JOIN
Wikipedia join