FAQ MySQLConsultez toutes les FAQ

Nombre d'auteurs : 16, nombre de questions : 155, dernière mise à jour : 22 avril 2014  Ajouter une question

 

Cette FAQ a été conçue à partir des questions fréquemment posées sur le forum MySQL de Developpez.com. Elle ne prétend pas à être exhaustive et peut contenir des erreurs occasionnelles. Si vous relevez une coquille, n'hésitez pas à nous le faire savoir.

Pour participer à cette FAQ, veuillez envoyer vos réponses sur le forum.


SommaireSyntaxe SQL et structure des donnéesInstructions SQL particulières (17)
précédent sommaire suivant
 

Avec l'instruction LIMIT X placée en fin de requête.

Ex :

Code sql : Sélectionner tout
SELECT * FROM la_table LIMIT 10
retourne les 10 premiers enregistrements.

Mis à jour le 16 juin 2004

Si l'identifiant est un champ auto-incrémenté : voir ici.

Autre possibilité :

Code sql : Sélectionner tout
SELECT * from la_table ORDER BY champ_numero desc LIMIT 1

Mis à jour le 16 juin 2004 ced

L'opérateur LIKE permet de comparer deux chaînes de caractères. Le joker % représente n'importe quel nombre de caractères dans une chaîne. Le joker _ représente exactement un caractère dans une chaîne.

Code sql : Sélectionner tout
SELECT nom FROM la_table WHERE nom LIKE '%toto%'
Code sql : Sélectionner tout
SELECT nom FROM la_table WHERE nom LIKE 'toto%'
Code sql : Sélectionner tout
SELECT nom FROM la_table WHERE nom LIKE 'toto_'
Code sql : Sélectionner tout
SELECT nom FROM la_table WHERE nom REGEXP 'pattern'
Ainsi que les index et fonctions full-text pour une approche plus « moteur de recherche » avec gestion de la pertinence des résultats. Voir le tutoriel d'Olivier Miossec : http://omiossec.developpez.com/mysql/fulltext/.

Mis à jour le 16 juin 2004

Les fonctions ENCODE(), DECODE(), AES_ENCRYPT() et AES_DECRYPT() permettent un cryptage réversible d'une chaine de caractères.

Les données cryptées par MD5() et PASSWORD() ne sont pas décodables. Pour un test de validité de mot de passe par exemple, il faudra tester si : PASSWORD('passe_a_tester') = 'passe_crypté'

http://dev.mysql.com/doc/mysql/fr/En...functions.html

Mis à jour le 16 juin 2004

Les INSERT sont de cette forme :

Code sql : Sélectionner tout
INSERT INTO ma_table (mes_champs) VALUES (mes_valeurs)
Mais vous pouvez le faire a la forme UPDATE

Code sql : Sélectionner tout
INSERT ma_table SET (mes_champs = mes valeurs)
Attention ceci est propre à MySQL et ne fait pas partie de la Norme SQL

Mis à jour le 17 septembre 2006 berceker united

La requête suivante permet d'obtenir la liste des doublons sur une colonne identifiant (ID1) d'une table (TABLE1):

Code sql : Sélectionner tout
1
2
3
4
SELECT COUNT(*) AS nb_doubles, ID1 
FROM   TABLE1 
GROUP  BY ID1 
HAVING nb_doubles > 1

Ce tutoriel explique comment éradiquer les doublons détectés par cette requête, ainsi que d'autres types de doublons.

Mis à jour le 6 février 2008 ced

Prenons deux tables Objet et Categorie avec le schéma suivant:

  • Objet(ID, categorie, couleur)
  • Categorie(id, nom)

Pour supprimer les objets qui n'ont pas de catégorie référencée dans la table Categorie, la requête est la suivante:

Code sql : Sélectionner tout
1
2
3
4
DELETE o 
FROM Objet o 
LEFT JOIN Categorie c ON o.categorie = c.id 
WHERE c.id IS NULL

Mis à jour le 6 février 2008 ced

En créant une colonne supplémentaire, fictive, donnant la table d'origine de chaque ligne.

Supposons que vous ayez 3 tables avec des colonnes de même type (condition indispensable pour que la clause UNION puisse fonctionner) : table1, table2 et table3. Vous souhaitez ramener les champs de même type (par exemple champ1 integer, champ2 varchar(10), champ3 date) dans une seule requête.
Mais vous voulez, pour chaque ligne renvoyée, savoir de quelle table elle provient.

Pour cela, créez une colonne "origine" dans chaque sous-requête, contenant le nom de la table d'origine des données. Ce qui donne le code suivant :

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
SELECT champ1, champ2, champ3, 'table1' AS origine 
FROM table1 
UNION ALL 
SELECT champ1, champ2, champ3, 'table2' AS origine 
FROM table2 
UNION ALL 
SELECT champ1, champ2, champ3, 'table3' AS origine 
FROM table3
Vous avez donc une quatrième colonne qui prend 3 valeurs : 'table1', 'table2' ou 'table3' en fonction de la table d'origine pour chaque ligne.

Mis à jour le 1er juin 2008 ced

Pour afficher un enregistrement aléatoirement, il est possible d'utiliser la fonction MySQL RAND() qui génère des nombres aléatoires.
Pour sélectionner un enregistrement aléatoirement dans la table "nom_table", il suffit d'utiliser la requête suivante :

Code sql : Sélectionner tout
1
2
3
4
SELECT * 
FROM nom_table 
ORDER BY RAND() 
LIMIT 1
L'instruction "ORDER BY RAND()" permet de trier aléatoirement tous les enregistrements.
L'instruction "LIMIT 1" permet de ne sélectionner que le premier enregistrement renvoyé par la requête.

Mis à jour le 1er juin 2008 ced

Supposons que vous ayez une table avec un champ de type chaîne de caractères, et que vous souhaitiez trier les résultats d'une requête selon ce champ, mais dans un ordre différent de l'ordre alphabétique.
Par exemple, une table "ma_table" contient un champ "ma_chaine", de type chaîne de caractères, pouvant prendre les valeurs 'UN', 'DEUX' et 'TROIS'.

Vous souhaitez faire une requête dont les lignes sont triées selon le champ "ma_chaine", mais dans l'ordre 'UN', 'DEUX' puis 'TROIS'.
Ce tri n'est pas possible par un simple "ORDER BY ma_chaine", qui donnerait un résultat trié dans l'ordre 'DEUX', 'TROIS' puis 'UN'.

Pour cela, il faut utiliser la fonction FIELD() de MySQL dans la clause ORDER BY, comme suit :

Code sql : Sélectionner tout
1
2
3
SELECT * 
FROM ma_table 
ORDER BY FIELD(ma_chaine, 'UN', 'DEUX', 'TROIS')
Les paramètres passés à la fonction FIELD() sont : le nom du champ de type chaîne de caractère sur lequel effectuer le tri, puis les occurences de cette chaîne dans l'ordre de tri souhaité.

Mis à jour le 1er juin 2008 ced

En utilisant la syntaxe INSERT INTO table_cible SELECT...
Prenons un exemple : à partir d'une table nommée table1 et composée des champs id, categorie et valeur, vous voulez insérer dans une table nommée table2 et composée des champs id_categorie et val_max la catégorie et la valeur maximale de chaque catégorie issues de table1.
Les scripts de création de ces tables sont :

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `test`.`table1` ( 
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
  `categorie` INTEGER UNSIGNED NOT NULL, 
  `valeur` INTEGER UNSIGNED NOT NULL, 
  PRIMARY KEY (`id`) 
) 
  
CREATE TABLE `test`.`table2` ( 
  `id_categorie` INTEGER UNSIGNED NOT NULL, 
  `val_max` INTEGER UNSIGNED NOT NULL, 
  PRIMARY KEY (`id`) 
)
La requête est donc :

Code sql : Sélectionner tout
1
2
3
4
INSERT INTO table2 (id_categorie, val_max) 
SELECT categorie, MAX(valeur) 
FROM table1 
GROUP BY categorie
Bien sûr, les types des champs doivent être compatibles entre les 2 tables.

Mis à jour le 9 juin 2008 ced

La division d'une valeur par elle-même donne 1 s'il s'agit d'un nombre et NULL dans le cas contraire.
Pour trouver les valeurs non-numériques, il suffit alors de faire :

Code sql : Sélectionner tout
1
2
3
4
  
SELECT * 
FROM maTable 
WHERE (NomColonne / NomColonne) IS NULL

Mis à jour le 29 septembre 2008 CinePhil

Oui, il suffit d'utiliser une variable et de l'incrémenter à chaque projection de la manière suivante :

Code sql : Sélectionner tout
1
2
3
4
5
6
  
SET @currentRow=0; 
SELECT @currentRow:=@currentRow+1 AS num_ligne, colonne1, colonne2, ... 
FROM nom_table 
WHERE ... 
ORDER BY colonne1, colonne2, ...

Mis à jour le 28 décembre 2008 Alain Defrance ced

L'opérateur <=>, également appelé NULL-safe equal to operator, fonctionne exactement comme l'opérateur d'égalité =, sauf qu'il considère que NULL est égal à NULL. Autrement dit, la condition suivante :

Code : Sélectionner tout
1
2
 
a <=> b
est identique à :

Code : Sélectionner tout
1
2
 
(a = b OR a IS NULL AND b IS NULL)
Cet opérateur est spécifique à MySQL, et rendra donc tout code où il est utilisé non importable vers un autre SGBD. Le symbole <=> rappelle celui de l'équivalence mathématique ?. Pour d' obscures raisons, certains préfèrent l'appeler spaceship operator, notamment dans Perl (où toutefois sa signification est différente). Enfin, un bug référencé fait que <=> ne se comporte pas normalement avec les colonnes DATE ou DATETIME.

Mis à jour le 29 septembre 2008 Antoun

' (apostrophe ou single quote) sert à entourer une valeur de format alphanumérique.

` (accent grave ou backtick, touches Alt Gr + 7) sert à entourer les noms des objets de la BDD (base, table, colonne), surtout lorsque ces noms peuvent être mal interprétés par MySQL :

  • Noms en plusieurs mots ;
  • Mots réservés de MySQL.

" (guillemet ou double quote) est une alternative (propre à MySQL) à ' ; elle est déconseillée, car seul ' est normalisé.

Exemple :

Code sql : Sélectionner tout
1
2
3
4
  
SELECT `Nom utilisateur` 
FROM `table` 
WHERE statut = 'actif'
Remarques :

  • Il est fortement déconseillé de nommer des objets avec des espaces et des mots réservés, justement pour des problèmes d'interprétation si le ` est oublié.
  • Les ' sont inutiles, voire déconseillés, autour des valeurs numériques en rapport avec une colonne numérique.
  • phpMyAdmin a tendance à ajouter les ` systématiquement autour des noms d'objets, mais aussi des ' autour des valeurs si vous utilisez sa fonction de recherche.

Mis à jour le 28 décembre 2008 CinePhil

GROUP_CONCAT est une fonction d'agrégation (comme COUNT, MAX, etc.) permettant de concaténer tous les enregistrements des groupes définis par la clause la clause GROUP BY.
En d'autres termes, GROUP_CONCAT est à CONCAT ce que SUM est à l'opérateur +.

Exemple :

Code sql : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  
CREATE TABLE groupe_utilisateur ( 
     ID_GROUPE INT AUTO_INCREMENT NOT NULL, 
     LIBELLE_GROUPE VARCHAR(50), 
     PRIMARY KEY (ID_GROUPE) 
); 
CREATE TABLE utilisateur ( 
     ID_USER INT AUTO_INCREMENT NOT NULL, 
     NOM_USER VARCHAR(50) NOT NULL, 
     ID_GROUPE INT NOT NULL, 
     PRIMARY KEY (ID_USER), 
     FOREIGN KEY (ID_GROUPE) REFERENCES groupe_utilisateur (ID_GROUPE) 
); 
INSERT INTO groupe_utilisateur (LIBELLE_GROUPE) VALUES 
('utilisateurs'), ('administrateurs'); 
INSERT INTO utilisateur (NOM_USER, ID_GROUPE) VALUES 
('bob', 1), ('toto', 1), ('bibi', 1), ('superuser', 2), ('directeur', 2);
Utilisation de la fonction GROUP_CONCAT (avec ses deux options SEPARATOR et ORDER BY) :

Code sql : Sélectionner tout
1
2
3
4
5
  
SELECT LIBELLE_GROUPE, GROUP_CONCAT(NOM_USER SEPARATOR ':' ORDER BY NOM_USER) AS LIST_USERS 
FROM utilisateur 
INNER JOIN groupe_utilisateur USING (ID_GROUPE) 
GROUP BY (utilisateur.ID_GROUPE)
On obtient alors :

Code : Sélectionner tout
1
2
3
4
5
6
7
 
+-----------------+---------------------+ 
| LIBELLE_GROUPE  | LIST_USERS          | 
+-----------------+---------------------+ 
| utilisateurs    | bibi:bob:toto       | 
| administrateurs | directeur:superuser | 
+-----------------+---------------------+
GROUP_CONCAT est spécifique à MySQL. La plupart des SGBD n'ont pas d'équivalent direct.

Mis à jour le 28 décembre 2008 Alain Defrance

CONCAT_WS (with separator) ajoute un séparateur à la concaténation. Autrement dit, la formule suivante :

Code sql : Sélectionner tout
CONCAT('pommes', ' - ', 'bananes', ' - ', 'noix')
peut s'écrire plus simplement :

Code sql : Sélectionner tout
CONCAT_WS(' - ', 'pommes', 'bananes', 'noix')
Outre la gestion du séparateur de la part de CONCAT_WS, ces deux fonctions se comportent différemment en présence de NULL.
CONCAT retournera NULL si un des termes à concaténer est NULL, alors que CONCAT_WS l'ignorera.
CONCAT se conforme ainsi à la règle de propagation des NULL, tandis que CONCAT_WS a un comportement spécifique.

Exemple :

Code sql : Sélectionner tout
1
2
SELECT CONCAT('rouge', NULL, 'bleu') -- Retourne NULL 
SELECT CONCAT_WS(',', 'rouge', NULL, 'bleu') -- Retourne 'rouge,bleu'

Mis à jour le 28 décembre 2008 Alain Defrance

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2016 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique MySQL