Requête SQL : trucs et astuces

Requête SQL : Trucs et astuces

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.

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

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.

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.

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.