<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://mediawiki.gallaisivan.com/index.php?action=history&amp;feed=atom&amp;title=Mysql</id>
	<title>Mysql - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.gallaisivan.com/index.php?action=history&amp;feed=atom&amp;title=Mysql"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.gallaisivan.com/index.php?title=Mysql&amp;action=history"/>
	<updated>2026-07-28T07:42:56Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.gallaisivan.com/index.php?title=Mysql&amp;diff=1036&amp;oldid=prev</id>
		<title>172.17.0.1 : Page créée avec « &lt;noinclude&gt;{{MySQL}}&lt;/noinclude&gt;  == SELECT == La syntaxe de sélection est la suivante (chaque clause fera l&#039;objet d&#039;un paragraphe explicatif ensuite) : &lt;syntaxhighlight lang=sql&gt;  SELECT *  FROM nom_table  WHERE condition  GROUP BY champ1, champ2  HAVING groupe condition  ORDER BY champ  LIMIT limite, taille; &lt;/syntaxhighlight&gt;  === Liste de champs === Il faut spécifier les données à récupérer avec &lt;code&gt;SELECT&lt;/code&gt; : &lt;syntaxhighlight lang=sql&gt;  SELECT D... »</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.gallaisivan.com/index.php?title=Mysql&amp;diff=1036&amp;oldid=prev"/>
		<updated>2024-01-08T15:01:36Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « &amp;lt;noinclude&amp;gt;{{MySQL}}&amp;lt;/noinclude&amp;gt;  == SELECT == La syntaxe de sélection est la suivante (chaque clause fera l&amp;#039;objet d&amp;#039;un paragraphe explicatif ensuite) : &amp;lt;syntaxhighlight lang=sql&amp;gt;  SELECT *  FROM nom_table  WHERE condition  GROUP BY champ1, champ2  HAVING groupe condition  ORDER BY champ  LIMIT limite, taille; &amp;lt;/syntaxhighlight&amp;gt;  === Liste de champs === Il faut spécifier les données à récupérer avec &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; : &amp;lt;syntaxhighlight lang=sql&amp;gt;  SELECT D... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;{{MySQL}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SELECT ==&lt;br /&gt;
La syntaxe de sélection est la suivante (chaque clause fera l&amp;#039;objet d&amp;#039;un paragraphe explicatif ensuite) :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM nom_table&lt;br /&gt;
 WHERE condition&lt;br /&gt;
 GROUP BY champ1, champ2&lt;br /&gt;
 HAVING groupe condition&lt;br /&gt;
 ORDER BY champ&lt;br /&gt;
 LIMIT limite, taille;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Liste de champs ===&lt;br /&gt;
Il faut spécifier les données à récupérer avec &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT DATABASE();      -- renvoie le nom de la base courante&lt;br /&gt;
 SELECT CURRENT_USER();  -- l&amp;#039;utilisateur courant&lt;br /&gt;
 SELECT 1+1; -- 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;étoile permet d&amp;#039;obtenir tous les champs d&amp;#039;une table :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page`;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mais il est plutôt conseillé de nommer chaque champ (projection) pour accélérer la requête.&lt;br /&gt;
&lt;br /&gt;
=== Noms des tables ===&lt;br /&gt;
Pour récupérer les champs d&amp;#039;une table ou d&amp;#039;une vue, il faut la placer dans la clause &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 USE wiki1;&lt;br /&gt;
 SELECT page_id FROM `wiki1_page`;  -- renvoie les valeurs du champ &amp;quot;page_id&amp;quot; de la table &amp;quot;wiki1_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 SELECT `wiki1`.`wiki1_page`.`page_id`;     -- idem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autres exemples :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT MAX(page_id) FROM `wiki1_page`; -- le nombre le plus élevé&lt;br /&gt;
 SELECT page_id*2 FROM `wiki1_page`;    -- le double de chaque identifiant&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== WHERE ===&lt;br /&gt;
Cette clause permet de filtrer les enregistrements. Prenons pas exemple celui ou ceux dont le champ identifiant est égal à 42 :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` WHERE `page_id`=42;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou bien ceux qui ne sont pas nuls :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` WHERE page_id IS NOT NULL;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{attention|Il est impossible d&amp;#039;utiliser le résultat d&amp;#039;une fonction calculée dans le &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; dans le &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, car ce résultat n&amp;#039;est trouvé qu&amp;#039;à la fin de l&amp;#039;exécution, donc &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; ne peut pas s&amp;#039;en servir au moment prévu. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire il convient d&amp;#039;utiliser &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; (voir-ensuite)}}&lt;br /&gt;
&lt;br /&gt;
=== GROUP BY ===&lt;br /&gt;
Quand plusieurs enregistrements sont identiques dans le résultat, qu&amp;#039;ils ont les mêmes valeurs dans leurs champs sélectionnés, ils peuvent être groupés en une seule ligne.&lt;br /&gt;
&lt;br /&gt;
Par exemple, en regroupant les enregistrements de la table utilisateurs sur le champ de date d&amp;#039;inscription au wiki, on peut obtenir pour chacune le nombre d&amp;#039;édition maximum, minimum et leurs moyennes :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT user_registration, MAX(user_editcount), MIN(user_editcount), AVG(user_editcount)&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY `user_registration`;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Idem mais classé par nom et prénom d&amp;#039;utilisateur :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT user_registration, user_real_name, MAX(user_editcount), MIN(user_editcount), AVG(user_editcount) &lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY `user_registration`, `user_real_name`;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette instruction permet donc de réaliser des transpositions lignes en colonnes. Par exemple pour afficher les utilisateurs connus comme ayant le même e-mail :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT user_email,&lt;br /&gt;
        MAX(CASE WHEN user_id = 1 THEN user_name ELSE NULL END) AS User1,&lt;br /&gt;
        MAX(CASE WHEN user_id = 2 THEN user_name ELSE NULL END) AS User2,&lt;br /&gt;
        MAX(CASE WHEN user_id = 3 THEN user_name ELSE NULL END) AS User3&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY `user_email`;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{attention|Si on place le MAX dans le CASE la transposition ne s&amp;#039;effectue pas.}}&lt;br /&gt;
&lt;br /&gt;
Voir aussi &amp;lt;code&amp;gt;GROUP_CONCAT()&amp;lt;/code&amp;gt; pour transposer les colonnes en lignes.&lt;br /&gt;
&lt;br /&gt;
==== WITH ROLLUP ====&lt;br /&gt;
Ajouter cette clause à un GROUP BY permet d&amp;#039;ajouter le résultat d&amp;#039;une super-agrégation reprenant l&amp;#039;ensemble des résultats&amp;lt;ref&amp;gt;https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HAVING ===&lt;br /&gt;
&amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; déclare un filtre valable uniquement pour les enregistrements de la clause &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, ce qui le distingue de &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; qui lui opère avant &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; n&amp;#039;est pas optimisé et ne peut pas utiliser les index.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple d&amp;#039;erreur d&amp;#039;optimisation classique : l&amp;#039;ordonnancement des opérations ne filtre le gros des résultats (valeur &amp;#039;&amp;#039;admin&amp;#039;&amp;#039;) qu&amp;#039;à la fin de la requête (utilisant plus de mémoire, donc plus de temps qu&amp;#039;avec un &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;) :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT MAX(user_editcount), MIN(user_editcount), AVG(user_editcount)&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY user_real_name&lt;br /&gt;
 HAVING user_real_name = &amp;#039;admin&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par contre, cet exemple ne peut pas être optimisé car le &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; utilise le résultat du &amp;lt;code&amp;gt;MAX()&amp;lt;/code&amp;gt; calculé après le &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT MAX(user_editcount), MIN(user_editcount), AVG(user_editcount)&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY user_real_name&lt;br /&gt;
 HAVING MAX(user_editcount) &amp;gt; 500;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ORDER BY ===&lt;br /&gt;
Il est possible de classer les résultat, par ordre croissant ou décroissant, des nombres ou des lettres.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY `page_id`;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Par défaut, l&amp;#039;ordre est &amp;lt;code&amp;gt;ASCENDING&amp;lt;/code&amp;gt; (croissant). Pour le décroissant il faut donc préciser &amp;lt;code&amp;gt;DESCENDING&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY `page_id` ASC;   -- ASC est facultatif&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY `page_id` DESC;  -- ordre inversé&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les valeurs NULL sont considérées comme inférieures aux autres.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de nommer la colonne à classer par son numéro :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT `page_title`, `page_id` FROM `wiki1_page` ORDER BY 1;  -- nom&lt;br /&gt;
 SELECT `page_title`, `page_id` FROM `wiki1_page` ORDER BY 2;  -- id&lt;br /&gt;
 SELECT `page_title`, `page_id` FROM `wiki1_page` ORDER BY 1 DESC;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les expressions SQL sont autorisées :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT `page_title` FROM `wiki1_page` ORDER BY REVERSE(`page_title`)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;RAND()&amp;lt;/code&amp;gt; classe de façon aléatoire :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT `page_title` FROM `wiki1_page` ORDER BY RAND()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quand un &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; est spécifié, les résultats sont classés selon les champs qui y sont nommés, sauf avant un &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt;. Donc l&amp;#039;ordre décroissant peut aussi être précisé depuis le &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT user_registration, user_real_name, MAX(user_editcount)&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY `user_registration` ASC, `user_real_name` DESC;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour éviter ce classement automatique du &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, utiliser &amp;lt;code&amp;gt;ORDER BY NULL&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT user_registration, user_real_name, MAX(user_editcount)&lt;br /&gt;
 FROM wiki1_user&lt;br /&gt;
 GROUP BY `user_registration`, `user_real_name` ORDER BY NULL;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LIMIT ===&lt;br /&gt;
Le nombre maximum d&amp;#039;enregistrements dans le résultat est facultatif, on l&amp;#039;indique avec le mot &amp;lt;code&amp;gt;LIMIT&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 10;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ce résultat retourne donc entre 0 et 10 lignes.&lt;br /&gt;
&lt;br /&gt;
Généralement cela s&amp;#039;emploie après un &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; pour avoir les maximums et minimums, mais voici un exemple pour en avoir trois au hasard : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY rand() LIMIT 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il est possible de définir une plage d’enregistrements, sachant que le premier est le numéro zéro :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 10;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 0, 10; -- synonyme&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
On peut donc paginer les requêtes dont les résultats peuvent saturer le serveur :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 0, 10;  -- première page&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 10, 10; -- seconde page&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 20, 10; -- troisième page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La seconde commande est équivalente à celle-ci :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM `wiki1_page` ORDER BY page_id LIMIT 10 OFFSET 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une astuce consiste à déboguer la syntaxe de sa requête rapidement en lui demandant un résultat vide, et observer ainsi s&amp;#039;il y a des messages d&amp;#039;erreur sans attendre :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT ... LIMIT 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Conseils d&amp;#039;optimisation :&lt;br /&gt;
* &amp;lt;code&amp;gt;SQL_CALC_FOUND_ROWS&amp;lt;/code&amp;gt; peut accélérer les requêtes&amp;lt;ref&amp;gt;http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://dev.mysql.com/doc/refman/5.0/en/information-functions.html&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;LIMIT&amp;lt;/code&amp;gt; est particulièrement pratique dans des &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; avec &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, car leurs calculs n&amp;#039;impliquent pas toutes les lignes.&lt;br /&gt;
* Si la requête est résolue par le serveur en copiant les résultats dans une table temporaire, &amp;lt;code&amp;gt;LIMIT&amp;lt;/code&amp;gt; aide MySQL à calculer combien de mémoire est requise par la table.&lt;br /&gt;
&lt;br /&gt;
=== DISTINCT ===&lt;br /&gt;
Le mot &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt; peut être utilisé pour supprimer les doublons des lignes du résultat :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT DISTINCT * FROM `wiki1_page`    -- aucun doublon&lt;br /&gt;
 SELECT DISTINCTROW * FROM `wiki1_page` -- synonyme&lt;br /&gt;
 SELECT ALL * FROM `wiki1_page`         -- doublons (comportement par défaut)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cela permet par exemple de récupérer la liste de toutes les valeurs différentes d&amp;#039;un champ :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT DISTINCT `user_real_name` FROM `wiki1_page` ORDER BY `user_real_name`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
On peut également en sortir les différentes combinaisons de valeurs :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT DISTINCT `user_real_name`, `user_editcount` FROM `wiki1_page` ORDER BY `user_real_name`&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{remarque|si une clé primaire ou un index unique fait partie de la sélection, le &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt; devient inutile. C&amp;#039;est également le cas avec &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{attention|La fonction &amp;lt;code&amp;gt;COUNT()&amp;lt;/code&amp;gt; a un comportement différent du &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT COUNT(*) FROM maTable GROUP BY monChamp)&amp;lt;/code&amp;gt; : renvoie une ligne pour chaque valeur du champ, avec le nombre d&amp;#039;occurrences dans la table de chacune.&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT COUNT(monChamp) FROM maTable GROUP BY monChamp)&amp;lt;/code&amp;gt; : idem mais sans compter les NULL (ils apparaissent avec un total à 0).&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT COUNT(DISTINCT monChamp) FROM maTable&amp;lt;/code&amp;gt; : le nombre de valeurs différentes du champ (c&amp;#039;est-à-dire le nombre de lignes des requêtes précédentes).&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT DISTINCT COUNT(*) FROM maTable&amp;lt;/code&amp;gt; : le nombre de lignes dans la table.&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT DISTINCT COUNT(monChamp) FROM maTable&amp;lt;/code&amp;gt; : le nombre de lignes dans la table sans compter celles où monChamp est NULL.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===IN and NOT IN===&lt;br /&gt;
Équivalent du signe &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;, qui ne nécessite pas d&amp;#039;être répété quand il concerne plusieurs valeurs :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT page_id&lt;br /&gt;
 FROM wiki1_page&lt;br /&gt;
 WHERE page_namespace IN (0, 1);&lt;br /&gt;
&lt;br /&gt;
-- Liste des pages qui ont des propriétés plus celles qui n&amp;#039;ont aucun hyperlien&lt;br /&gt;
 SELECT page_id&lt;br /&gt;
 FROM wiki1_page as p, wiki1_user as u WHERE p.page_id = u.user_id&lt;br /&gt;
UNION&lt;br /&gt;
 SELECT page_id&lt;br /&gt;
 FROM wiki1_page WHERE page_id NOT IN (SELECT pp_page FROM wiki1_page_props);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{attention|Pour améliorer les performances du &amp;lt;code&amp;gt;NOT IN (1, 2)&amp;lt;/code&amp;gt;, il est généralement préférable d&amp;#039;utiliser &amp;lt;code&amp;gt;NOT EXISTS (select 1, 2)&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;https://stackoverflow.com/questions/173041/not-in-vs-not-exists&amp;lt;/ref&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== EXISTS ===&lt;br /&gt;
Fonction disponible depuis MySQL 4.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 -- N&amp;#039;affiche la première sélection que si la seconde n&amp;#039;est pas nulle&lt;br /&gt;
 SELECT page_title&lt;br /&gt;
 FROM wiki1_page&lt;br /&gt;
 WHERE EXISTS (SELECT * FROM wiki1_page_props WHERE pp_propname = &amp;#039;noindex&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ALL ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 -- Ne renvoie que les pages dont le numéro est le seul de la seconde sélection&lt;br /&gt;
 SELECT page_title&lt;br /&gt;
 FROM wiki1_page&lt;br /&gt;
 WHERE page_id = ALL (SELECT pp_page FROM wiki1_page_props WHERE pp_propname = &amp;#039;defaultsort&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UNION et UNION All===&lt;br /&gt;
Compatible MySQL 4 et plus. L&amp;#039;union de sélections nécessite qu&amp;#039;elles aient le même nombre de colonnes.&lt;br /&gt;
&lt;br /&gt;
La requête suivante renvoie tous les enregistrements de deux tables :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT page_title FROM wiki1_page&lt;br /&gt;
 UNION ALL&lt;br /&gt;
 SELECT user_name FROM wiki1_user;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UNION&amp;lt;/code&amp;gt; est équivalent à &amp;lt;code&amp;gt;UNION DISTINCT&amp;lt;/code&amp;gt;, ce qui le distingue de &amp;lt;code&amp;gt;UNION ALL&amp;lt;/code&amp;gt; qui ne filtre pas les doublons.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT page_id FROM wiki1_page&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT page_id FROM wiki1_page;&lt;br /&gt;
-- égal&lt;br /&gt;
 (SELECT page_id FROM wiki1_page)&lt;br /&gt;
 UNION DISTINCT&lt;br /&gt;
 (SELECT page_id FROM wiki1_page)&lt;br /&gt;
 ORDER BY page_id;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JOIN ==&lt;br /&gt;
[[Image:SQL Joins.svg|class=transparent]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les relations entre les tables permettent de joindre intelligemment leurs résultats. La jointure naturelle est la plus rapide sur la plupart des plateformes SQL.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;exemple suivant compare les nombres en anglais et en hindi.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 CREATE TABLE english (Tag int, Inenglish varchar(255));&lt;br /&gt;
 CREATE TABLE hindi (Tag int, Inhindi varchar(255));&lt;br /&gt;
&lt;br /&gt;
 INSERT INTO english (Tag, Inenglish) VALUES (1, &amp;#039;One&amp;#039;);&lt;br /&gt;
 INSERT INTO english (Tag, Inenglish) VALUES (2, &amp;#039;Two&amp;#039;);&lt;br /&gt;
 INSERT INTO english (Tag, Inenglish) VALUES (3, &amp;#039;Three&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
 INSERT INTO hindi (Tag, Inhindi) VALUES (2, &amp;#039;Do&amp;#039;);&lt;br /&gt;
 INSERT INTO hindi (Tag, Inhindi) VALUES (3, &amp;#039;Teen&amp;#039;);&lt;br /&gt;
 INSERT INTO hindi (Tag, Inhindi) VALUES (4, &amp;#039;Char&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;select * from english&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;select * from hindi&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Tag&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Inenglish &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;	Tag &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Inhindi &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;One &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;	Do &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Two &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; 4 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Char &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== INNER JOIN ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT hindi.Tag, english.Inenglish, hindi.Inhindi&lt;br /&gt;
 FROM english, hindi&lt;br /&gt;
 WHERE english.Tag = hindi.Tag&lt;br /&gt;
 -- égal&lt;br /&gt;
 SELECT hindi.Tag, english.Inenglish, hindi.Inhindi&lt;br /&gt;
 FROM english INNER JOIN hindi ON english.Tag = hindi.Tag&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Tag &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Inenglish&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Inhindi &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Two &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Do &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{remarque|Le comportement d&amp;#039;un &amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt; seul est &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt;, qui est aussi synonyme de &amp;lt;code&amp;gt;CROSS JOIN&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;https://dev.mysql.com/doc/refman/5.7/en/join.html&amp;lt;/ref&amp;gt; ({{wt|jointure cartésienne}}).}}&lt;br /&gt;
&lt;br /&gt;
La jointure cartésienne décrit le cas où chaque ligne d&amp;#039;une table est jointe à toutes celles d&amp;#039;une autre.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT * FROM english, hindi&lt;br /&gt;
 -- égal &lt;br /&gt;
 SELECT * FROM english CROSS JOIN hindi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
3*3 = 9 lignes :&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Tag&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Inenglish&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Tag &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Inhindi &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;One &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Do &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Two &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;	Do &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Do &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 1 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; One &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Two &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 1 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; One &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 4 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Char &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 2 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Two  &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 4 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Char &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt; 3 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 4 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Char &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NATURAL JOIN ===&lt;br /&gt;
La {{wt|jointure naturelle}} équivaut à &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; sur toutes les colonnes communes des deux tables. &lt;br /&gt;
&lt;br /&gt;
=== USING ===&lt;br /&gt;
Le mot &amp;lt;code&amp;gt;USING&amp;lt;/code&amp;gt; est compatible MySQL 4, mais change avec MySQL 5. La requête suivante est équivalente à celles &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; ci-dessus :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT hindi.tag, hindi.Inhindi, english.Inenglish&lt;br /&gt;
 FROM hindi NATURAL JOIN english&lt;br /&gt;
 USING (Tag)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OUTER JOIN ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT hindi.Tag, english.Inenglish, hindi.Inhindi&lt;br /&gt;
 FROM english OUTER JOIN hindi ON english.Tag = hindi.Tag&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt; Tag &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Inenglish &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Tag &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Inhindi&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; One   &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp; &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;		&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;2 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; Two   &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 2   &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Do    &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;3 &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt; Three &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 3   &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Teen &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; 4 &amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; Char &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LEFT JOIN / LEFT OUTER JOIN ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT field1, field2 FROM table1 LEFT JOIN table2 ON field1=field2&lt;br /&gt;
&lt;br /&gt;
 SELECT e.Inenglish as English, e.Tag, h.Inhindi as Hindi&lt;br /&gt;
 FROM english AS e&lt;br /&gt;
 LEFT JOIN hindi AS h ON e.Tag=h.Tag &lt;br /&gt;
 WHERE h.Inhindi IS NULL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 English  tag   Hindi&lt;br /&gt;
 One      1     &amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{{remarque|Naturellement comme pour le &amp;lt;code&amp;gt;inner join&amp;lt;/code&amp;gt;, s&amp;#039;il y a plusieurs lignes non NULL à droite, on les retrouve toutes en résultat.}}&lt;br /&gt;
&lt;br /&gt;
=== RIGHT OUTER JOIN ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT e.Inenglish AS English, h.tag, h.Inhindi AS Hindi&lt;br /&gt;
 FROM english AS e RIGHT JOIN hindi AS h&lt;br /&gt;
 ON e.Tag=h.Tag&lt;br /&gt;
 WHERE e.Inenglish IS NULL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 English   tag     Hindi&lt;br /&gt;
 &amp;#039;&amp;#039;NULL&amp;#039;&amp;#039;       4      Char&lt;br /&gt;
&lt;br /&gt;
* S&amp;#039;assurer que le type des clés de jointes est le même dans les deux tables.&lt;br /&gt;
* Les mots clés &amp;lt;code&amp;gt;LEFT&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;RIGHT&amp;lt;/code&amp;gt; ne sont pas absolus, ils opèrent selon le contexte : en intervertissant les tables le résultat sera identique.&lt;br /&gt;
* La jointure par défaut est &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; (pas &amp;lt;code&amp;gt;OUTER&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== FULL OUTER JOIN ===&lt;br /&gt;
MySQL et MariaDB n&amp;#039;ont pas de jointure &amp;lt;code&amp;gt;FULL OUTER JOIN&amp;lt;/code&amp;gt;. Voici comment l&amp;#039;émuler :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
     (SELECT a.*, b* &lt;br /&gt;
         FROM tab1 a LEFT JOIN tab2 b&lt;br /&gt;
         ON a.id = b.id)&lt;br /&gt;
 UNION&lt;br /&gt;
     (SELECT a.*, b* &lt;br /&gt;
         FROM tab1 a RIGHT JOIN tab2 b&lt;br /&gt;
         ON a.id = b.id)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Jointures multiples ===&lt;br /&gt;
Il est possible de joindre plus de deux tables :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT ... FROM a JOIN (b JOIN c on b.id=c.id) ON a.id=b.id&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 mysql&amp;gt; SELECT group_type.type_id, group_type.nom, COUNT(people_job.job_id) AS count &lt;br /&gt;
        FROM group_type&lt;br /&gt;
         JOIN (groups JOIN people_job ON groups.group_id = people_job.group_id) &lt;br /&gt;
         ON group_type.type_id = groups.type&lt;br /&gt;
        GROUP BY type_id ORDER BY type_id&lt;br /&gt;
 +---------+--------------------------------------+-------+&lt;br /&gt;
 | type_id | nom                                  | count |&lt;br /&gt;
 +---------+--------------------------------------+-------+&lt;br /&gt;
 |       1 | Official GNU software                |   148 |&lt;br /&gt;
 |       2 | non-GNU software and documentation   |   268 |&lt;br /&gt;
 |       3 | www.gnu.org portion                  |     4 |&lt;br /&gt;
 |       6 | www.gnu.org translation team         |     5 |&lt;br /&gt;
 +---------+--------------------------------------+-------+&lt;br /&gt;
 4 rows in set (0.02 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sous requêtes ==&lt;br /&gt;
Compatible MySQL 4.1 et plus.&lt;br /&gt;
&lt;br /&gt;
* Les {{wt|sous-requête}}s SQL permettent aux résultats d&amp;#039;une requête d&amp;#039;être utilisés par une autre. &lt;br /&gt;
* Elles apparaissent toujours comme une partie de clause &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Seul un champ peut être dans la sous-requête &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Les &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt; ne sont donc pas autorisés (inutiles sur une seule colonne).&lt;br /&gt;
&lt;br /&gt;
Par exemple, la &amp;quot;table&amp;quot; &amp;#039;&amp;#039;RepOffice = OfficeNbr from Offices&amp;#039;&amp;#039;, liste les bureaux où le quota de vente excède la somme des quotas des vendeurs individuels :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT ville FROM Offices WHERE Target &amp;gt; ???&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
??? est la somme des quotas des vendeurs.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT SUM(Quota)&lt;br /&gt;
 FROM SalesReps &lt;br /&gt;
 WHERE RepOffice = OfficeNbr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En combinant ces deux requêtes, les points d&amp;#039;interrogations disparaissent :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
 SELECT ville FROM Offices &lt;br /&gt;
 WHERE Target &amp;gt; (SELECT SUM(Quota) FROM SalesReps &lt;br /&gt;
 WHERE RepOffice = OfficeNbr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, tous les clients avec des commandes ou limites de crédits &amp;gt; 50000 €. En utilisant le mot &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt; pour ne lister les clients qu&amp;#039;une seule fois :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=mysql&amp;gt;&lt;br /&gt;
 SELECT DISTINCT CustNbr &lt;br /&gt;
 FROM Customers, Orders &lt;br /&gt;
 WHERE CustNbr = Cust AND (CreditLimit &amp;gt; 50000 OR Amt &amp;gt; 50000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{remarque|il y a donc trois types de filtre.&lt;br /&gt;
* &amp;lt;code&amp;gt;ON&amp;lt;/code&amp;gt; : filtre les lignes d&amp;#039;une seule table.&lt;br /&gt;
* &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; : filtre les lignes de toutes les tables.&lt;br /&gt;
* &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; : filtre les lignes de toutes les tables après regroupements.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{attention|1=Les sous-requêtes ne peuvent pas faire référence à un élément de la requête qui les contient. Si c&amp;#039;est nécessaire, il faut les transformer en jointures : ... &amp;lt;code&amp;gt;JOIN (SELECT...) q ON q.id = ...&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{remarque|Dans MySQL 8.0 et MariaDB 10.2.1, le mot &amp;lt;code&amp;gt;WITH&amp;lt;/code&amp;gt; permet de se référer aux sous-requêtes récurrentes, récursives ou pas&amp;lt;ref&amp;gt;https://mariadb.com/kb/en/with/&amp;lt;/ref&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=mysql&amp;gt;&lt;br /&gt;
 WITH&lt;br /&gt;
   sub_request1 AS (SELECT field1, field2 FROM table1),&lt;br /&gt;
   sub_request2 AS (SELECT field2, field3 FROM table2)&lt;br /&gt;
 SELECT field1, field3&lt;br /&gt;
 FROM sub_request1 INNER JOIN sub_request2&lt;br /&gt;
 WHERE sub_request1.field1 = sub_request2.field1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Références}}&lt;br /&gt;
* [http://dev.mysql.com/doc Official MySQL documentation]&lt;/div&gt;</summary>
		<author><name>172.17.0.1</name></author>
	</entry>
</feed>