Fondamentaux
SQL
SQL est le langage standard pour interagir avec les bases de données relationnelles. Beaucoup d'applications web l'utilisent pour stocker et consulter leurs données.
Base relationnelle
Une base relationnelle est composée de tables.
| CustomerID | CustomerName | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.com |
Une table contient des colonnes et des lignes.
SGBD courants :
- MySQL
- PostgreSQL
- Microsoft SQL Server
- SQLite
Un schéma décrit l'organisation des tables, les colonnes, les types, les contraintes et les relations entre données.
Types courants
| Type | Description |
|---|---|
| INT | Nombre entier |
| FLOAT | Nombre décimal |
| TEXT | Texte |
| DATE | Date |
| NULL | Valeur inconnue ou absente |
| BOOLEAN | Vrai ou faux |
| UUID | Identifiant unique |
Clés et relations
Une clé primaire identifie une ligne de façon unique. Une clé étrangère relie une table à une autre.
Users
id
email
Orders
id
user_id → Users.id
total
Ces relations permettent de représenter des comptes, commandes, rôles, permissions ou journaux.
Commandes essentielles
Lire :
SELECT * FROM Customers;
SELECT CustomerName, Email FROM Customers;
Ajouter :
INSERT INTO Customers
(CustomerName, Email)
VALUES
('Alice', 'alice@email.com');
Modifier :
UPDATE Customers
SET Email = 'new@email.com'
WHERE CustomerName = 'Alice';
Supprimer :
DELETE FROM Customers
WHERE CustomerName = 'Alice';
Filtrer et trier :
SELECT *
FROM Customers
WHERE Email LIKE '%@example.com'
ORDER BY CustomerName ASC;
Attention
Sans clause WHERE, un UPDATE ou DELETE peut impacter toute la table.
Jointures
Une jointure permet de croiser plusieurs tables.
SELECT Customers.CustomerName, Orders.total
FROM Customers
JOIN Orders ON Orders.customer_id = Customers.CustomerID;
C'est indispensable pour comprendre comment une application relie utilisateurs, rôles, sessions, achats ou droits d'accès.
Transactions
Une transaction regroupe plusieurs opérations qui doivent réussir ou échouer ensemble.
BEGIN;
UPDATE Accounts SET balance = balance - 100 WHERE id = 1;
UPDATE Accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
Si une erreur arrive avant COMMIT, la base peut annuler les changements avec ROLLBACK.
SQL et cybersécurité
Comprendre SQL aide à comprendre les injections SQL. Une SQLi apparaît quand une application laisse des données utilisateur modifier une requête SQL.
La prévention repose notamment sur :
- requêtes préparées
- validation des entrées
- moindre privilège côté base
- messages d'erreur peu bavards
- comptes applicatifs séparés
- sauvegardes testées
- journalisation des actions sensibles
Exemple de mauvaise idée
Construire une requête avec une valeur utilisateur directement concaténée est dangereux.
const query = "SELECT * FROM users WHERE email = '" + email + "'"
La bonne approche consiste à utiliser des paramètres préparés avec la bibliothèque ou l'ORM choisi.
À retenir
SQL sert à lire et modifier des données critiques. En sécurité, le sujet n'est pas seulement l'injection SQL, mais aussi les droits, les sauvegardes, les journaux et la qualité du modèle de données.
