Le langage SQL est un langage spécifique permettant de communiquer avec des bases de données.
Je l’utilise le SQL depuis des années, et j’ai eu l’occasion de le tester sur plusieurs projets PHP.
J’ai découvert plein de trucs et astuces intéressant que j’aimerai partager avec vous.
Sommaire
- Schéma complet de la requête de base
- Trucs et astuces
- Comment trouver la version de MySQL ?
- Obtenir les noms de toutes les colonnes d’une table
- Compter le nombre de colonnes d’une table
- Enlever les conditions OR avec SQL IN
- Copier le contenu d’une table dans une autre
- Trouver et supprimer des doublons
- Comparer 2 tables SQL et lister les différences
- Faire une suppression multiple (niveau 1)
- Faire une suppression multiple (niveau 2)
- Gérer les colonnes d’une table entre elles
- Déplacer des colonnes dans une table
- Changer la configuration de sql_mode pour une session
- Comment trouver la version de MySQL ?
- Conclusion
Schéma complet de la requête de base
Ce qu’il faut savoir dès le début en SQL, c’est le schéma de la requête de base. Que ce soit pour MySQL, PosgreSQL ou autre, elle ne change pas.
La voici ci-dessous. vous pouvez la garder en exemple bien au chaud.
SELECT *
FROM table
WHERE condition
GROUP BY expression
HAVING condition
{ UNION | INTERSECT | EXCEPT }
ORDER BY expression
LIMIT count
OFFSET start
Trucs et astuces
Comment trouver la version de MySQL ?
Il existe différentes méthodes, en SQL, pour trouver la version de votre MySQL.
La première méthode se fait via les requêtes :
SELECT @@version;
SELECT VERSION();
La deuxième méthode se fait via les variables. Il suffit de filtrer via le bon nom de variable
SHOW VARIABLES LIKE 'version';
La dernière méthode se fait avec la commande suivante. La version de MySQL fait partie des informations listées.
STATUS;
Obtenir les noms de toutes les colonnes d’une table
Vous n’avez pas un accès direct à votre base de donnée, et vous devez savoir qu’elles sont les colonnes d’une table. Voici la requête qu’il vous faut.
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='triggers'
L’exemple ci-dessus affichera les colonnes de la table triggers qui se situe dans la base de donnée INFORMATION_SCHEMA.
Compter le nombre de colonnes d’une table
Dans la même logique que la requête précédente, il vous faut le nombre de colonnes d’une table. On ne sais jamais, cela peut servir.
SELECT count(*)
FROM information_schema.COLUMNS
WHERE table_name='triggers';
L’exemple ci-dessous me retournera la réponse 22.
Enlever les conditions OR avec SQL IN
IN est un opérateur en SQL qui est utilisé dans la commande WHERE. Il peut être utilisé en remplacement d’une liste d’opérateur OR.
Je m’explique avec une requête utilisant l’opérateur OR :
SELECT langage
FROM technologie
WHERE langage = 'PHP'
OR langage = 'Javascript'
OR langage = 'CSS'
En utilisant l’opérateur IN, nous nous retrouvons avec la requête ci-dessous, qui est beaucoup plus réduite
SELECT langage
FROM technologie
WHERE langage IN ( 'PHP', 'Javascript', 'CSS' )
Copier le contenu d’une table dans une autre
La requête suivante permet de copier l’entièreté d’une table dans une deuxième. Elle créé cette deuxième table au passage.
Très intéressant lors de la sauvegarde de table.
CREATE TABLE old_post AS (SELECT * from post)
Il est possible aussi de copier partiellement une table, et d’enregistrer les infos dans une autre table. Voici la requête qu’il vous faut :
INSERT INTO old_post(a, b, c)
SELECT x, y, z FROM post ...
Trouver et supprimer des doublons
J’ai trouvé cette paire d’astuces sur le site sql.sh, qui contient deux articles complet sur ce sujet.
- Requêtes SQL pour trouver les doublons : https://sql.sh/55-requete-trouver-doublon
- Méthode pour supprimer les doublons dans la BDD SQL : https://sql.sh/138-methode-supprimer-doublons
Le premier article traite des 3 cas de doublons de l’on peut avoir en BDD (Doublon absolu, Doublon relatif et Quasi-doublon), et montre les requêtes adéquates pour chaque cas.
Le deuxième article montre les 2-3 requêtes pour supprimer ces doublons.
Comparer 2 tables SQL et lister les différences
Voici une requête qui permet d’afficher les lignes de la table table_1 qui ne sont pas dans la table table_2
SELECT * FROM table_1 WHERE `colonne_1` NOT IN(
SELECT `colonne_1` FROM table_2
);
Vous pouvez aussi faire la comparaison inverse entre la table_2 et la table_1.
SELECT * FROM table_2 WHERE `colonne_1` NOT IN(
SELECT `colonne_1` FROM table_1
);
Faire une suppression multiple (niveau 1)
Dans certaines conditions, il nous faut faire des suppressions multiple d’éléments.
Il est possible de faire simplement, avec la condition IN que l’on a déjà vu auparavant.
DELETE FROM nom_de_la_table WHERE id IN (id1, id2, id3);
Cela nous évite de créer une boucle sur un ensemble de suppression simple.
Faire une suppression multiple (niveau 2)
Il est possible de faire des suppressions multiples d’éléments. Les éléments étant SELECT dans le WHERE
DELETE FROM nom_de_la_table WHERE id IN (SELECT id FROM nom_de_la_table);
Gérer les colonnes d’une table entre elles
Dans une table quelconque, il est possible d’ajouter une colonne avant (ou après) d’autres colonnes.
la requête est assez simple.
ALTER TABLE nom_de_la_table ADD nom_de_la_colonne_2 type_de_donnée AFTER nom_de_la_colonne;
Voici la technique quand vous devez ajouter une colonne en tant que première colonne dans une table.
ALTER TABLE nom_de_la_table
ADD id INT NOT NULL FIRST;
Déplacer des colonnes dans une table
Dans de rare cas, il y a besoin de changer l’ordre des colonnes dans une table SQL.
Dans les interfaces des applications comme PhpMyAdmin, ce n’est pas possible de le faire directement.
Voici les 2 requêtes qui vont bien :
ALTER TABLE nom_de_la_table
MODIFY COLUMN nom_colonne_2 type_de_donnée
AFTER nom_colonne_1
ALTER TABLE nom_de_la_table
MODIFY COLUMN colonne_a_deplacer type_donnees FIRST
Changer la configuration de sql_mode pour une session
Si vous ne savez pas ce qu’est le sql_mode, j’ai déjà écrit un article sur ce sujet.
Pour vider la valeur de votre sql_mode, il suffit de taper :
SET sql_mode='';
Autres exemple, pour stocker 0 comme valeur dans certaines colonnes.
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"
Ce mode contient beaucoup d’autres valeurs. Voici les liens vers différentes documentation :
Conclusion
Site français sur le langage SQL – sql.sh
D’autres astuces en SQL sql.sh/categorie/astuces
N’hésitez pas à me proposer des trucs et astuces intéressantes sur ce thème. Je les partagerai dans cette article.
Ping : Logs Prestashop et Requête SQL - Portfolio Guillaume RICHARD