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
$ 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;
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_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:


Jointures

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