<?xml version="1.0"?>
<rss version="2.0"><channel><title>SQL Latest Topics</title><link>https://melinyel.net/forum/41-sql/</link><description>SQL Latest Topics</description><language>en</language><item><title>Interroger les donn&#xE9;es (SELECT)</title><link>https://melinyel.net/topic/1345-interroger-les-donn%C3%A9es-select/</link><description><![CDATA[<p>Bonjour à vous,<br>
On se retrouve pour le deuxième tutoriel sur le SQL et aujourd’hui, on va s'intéresser au SELECT.<br><br>
Je vous invite vivement à lire le premier chapitre, qui constitue une petite introduction sur ce qu'est le SQL ici : <iframe src="https://melinyel.net/applications/core/interface/js/spacer.png" frameborder="0" data-embedcontent="" data-embed-src="https://melinyel.net/topic/1343-introduction-au-sql/?do=embed"></iframe><br><br>
Revenons à nos moutons, voici de quoi sera composé ce cours :</p>
<ul><li>Projection</li>
<li>Restriction/Sélection</li>
<li>Jointures</li>
</ul><p>De plus, pendant ce cours, il se peut que je fasse référence à l'algèbre relationnelle. Ce n'est pas obligatoire, je ne m'attarderai pas dessus, mais si vous connaissez, ça ne peut être qu'un plus pour vraiment bien visualiser ce que vous voulez récupérer comme données.<br>
En ayant vu ça, nous aurons déjà fait pas mal le tour des possibilités offertes par le SELECT.<br><br><strong><u><span style="font-size:18px;">I - Cas général :</span></u></strong><br><br>
Le SELECT est donc une requête SQL. En faisant un SELECT, on réalise une projection des données de la base de données, en fonction de différents critères.<br><br>
On l'écrit de la forme suivante :<br>
 </p>
<pre class="ipsCode prettyprint">
SELECT &lt;liste des attributs projetés&gt;
FROM &lt;liste des relations touchées par la projection&gt;

[ WHERE &lt;liste des critères de restriction&gt;
GROUP BY &lt;liste des attributs d'agrégation&gt;
HAVING &lt;liste des critères de restriction des agrégats&gt;
ORDER BY &lt;liste des attributs du tri du résultat&gt; ]
</pre>
<p>Pour ceux qui connaissent l'algèbre relationnelle, il est facile d'établir une correspondance avec un SELECT dans les requêtes simples.<br><br>
Si vous n'avez pas compris grand chose de ce que je viens d'expliquer, pas de panique, il s'agit juste de la structure de la requête. Les éléments entre crochets sont facultatifs.<br><br>
Tout au long de ce tutoriel, j'utiliserai le schéma de base de données suivant :</p>
<ul><li>DEPT(<u>DEPTNO</u>, DNAME, LOC)</li>
<li>EMP(<u>EMPNO</u>, ENAME, JOB, #MGR, HIREDATE, SAL, COMM, #DEPTNO)</li>
</ul><p>Les tables soulignées sont des clés primaires, et celles avec un #devant sont des clés étrangères. Pour mieux comprendre, je vous invite à jeter un coup d'oeil par ici : <a href="http://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/cles-primaires-et-etrangeres" rel="external nofollow">http://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/cles-primaires-et-etrangeres</a><br><br><strong><u><span style="font-size:18px;">II - Projection :</span></u></strong><br><br>
On va sélectionner les données à l'aide de la commande SELECT.<br>
Comme vu plus haut, dans un SELECT, il faut au minimum un FROM afin de dire dans quelle table on se situe. L'ordre s'écrit donc :</p>
<pre class="ipsCode prettyprint">
SELECT &lt;liste des attributs&gt;
FROM &lt;nom des tables&gt;
</pre>
<p>Pour prendre un exemple, mettons que je veuille récupérer toutes les entrées de la table DEPT, la requête sera la suivante :</p>
<pre class="ipsCode prettyprint">
SELECT *
FROM dept
</pre>
<p>J'utilise le joker <strong>*</strong> afin de dire que je veux tous les attributs de la table. Cependant, il est préférable de ne garder que ce dont on a vraiment besoin lorsque l'on effectue la requête, c'est une question d'optimisation.<br>
 </p>
<pre class="ipsCode prettyprint">
SELECT deptno, dname
FROM dept
</pre>
<p>Ici, je sélectionne uniquement les attributs <em>deptno</em> et <em>dname</em> de la table dept.<br><br>
Ce qui nous embête ici, et contrairement à l'algèbre relationnelle, C'est que cette requête n'élimine pas les doublons. On va donc ajouter un mot-clé juste après le SELECT, il s'agit de DISTINCT.<br><br>
On obtient donc ;</p>
<pre class="ipsCode prettyprint">
SELECT DISTINCT job
FROM emp
</pre>
<p>Voila la différence :<br>
Sans DISTINCT :<br></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler="">
<pre class="ipsCode prettyprint">
mysql&gt; SELECT job FROM emp;
+-----------+
| job |
+-----------+
| EMPLOYE |
| VENDEUR |
| VENDEUR |
| MANAGER |
| EMPLOYE |
| PRESIDENT |
+-----------+
6 rows in set
</pre>
<p></p></blockquote><p><br><br>
Avec Distinct :<br></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler="">
<pre class="ipsCode prettyprint">
SELECT DISTINCT job FROM emp;
+-----------+
| job       |
+-----------+
| EMPLOYE   |
| VENDEUR   |
| MANAGER   |
| PRESIDENT |
+-----------+
4 rows in set
</pre>
<p></p></blockquote><p><br><br></p><hr><br><br>
Intéressons nous maintenant au FROM, l'utilisation est très simple, mais on va voir comment créer un alias de table.<br>
Concrètement, on va renommer la table <strong>provisoirement</strong> (le temps de la requête). C'est pour plus de lisibilité et plus de simplicité.<br><br>
Comment on fait ? Il suffit d'écrire ça :
<pre class="ipsCode prettyprint">
FROM nomdelatable alias
</pre>
<p>Ainsi, nous pourrons écrire des requêtes qui ressemblent à ça :<br>
 </p>
<pre class="ipsCode prettyprint">
SELECT d.deptno
FROM dept d
</pre>
<p>Le "d.deptno" peut se traduire par "la colonne deptno de la table d".<br>
Simple non ?<br>
Aller, au suivant !<br><br></p><hr><br><br>
Maintenant qu'on a renommé une table, on va chercher comment renommer une colonne, toujours provisoirement ! C'est un peu plus subtil, mais rien de bien compliqué.<br>
Ca va se passer comme ça :
<pre class="ipsCode prettyprint">
SELECT deptno AS Service, dname AS "Nom Service"
FROM dept;
</pre>
<p>On fait suivre le nom de la table par le mot clé "AS" et ensuite, si c'est un seul mot, pas de guillemets, sinon, on en met.<br>
Note : Le AS est optionnel, on peut uniquement séparer le nom de table de l'alias par un espace.<br><br>
Regardons le résultat :</p>
<pre class="ipsCode prettyprint">
mysql&gt; SELECT deptno AS Service, dname AS "Nom Service"
FROM dept;
+---------+--------------+
| Service | Nom Service  |
+---------+--------------+
|       1 | Juridique    |
|       2 | Recherche    |
|       3 | Comptabilité |
|       4 | Support      |
+---------+--------------+
4 rows in set
</pre>
<p>On a bien les colonnes qui sont renommées dans le résultat.<br><br></p><hr><br><br>
On peut aussi faire des opérations directement dans un SELECT. Attention, on ne modifie pas le contenu de la table, on affiche juste des valeurs !<br><br>
On retrouve les 4 opérateurs bien connus :
<ul><li>+ : Addition</li>
<li>- : Soustraction</li>
<li>* : Multiplication</li>
<li>/ : Division</li>
</ul><p>Ces opérateurs sont utilisables pour tout <strong>attribut numérique</strong> ! N'essayez pas de jouer avec les chaînes de caractères.<br><br>
Exemple :</p>
<pre class="ipsCode prettyprint">
mysql&gt; SELECT (sal*1.1)+comm FROM emp;
+----------------+
| (sal*1.1)+comm |
+----------------+
|            880 |
|           2060 |
|           2200 |
|         3372.5 |
|           1430 |
|          16000 |
+----------------+
6 rows in set
</pre>
<p></p><hr><br><br>
On va maintenant s'intéresser à comment trier les résultats d'une requête, avec la clause ORDER BY :
<ul><li>Le classement par défaut est ascendant (ASC). Pour inverser, on rajoutera DESC (comme descendant).</li>
<li><strong>Une seule</strong> clause ORDER BY et <strong>TOUJOURS</strong> à la fin du SELECT</li>
<li>Les éléments de tri ne figurent pas forcément dans le SELECT</li>
<li>Les valeurs NULL se trouvent à la fin si on a un tri ASC, où au début en cas de tri DESC</li>
<li>Les éléments de tri peuvent être le nom des colonnes, le numéro des colonnes ou même une expression.</li>
</ul><p>Quelques exemples :<br></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><br>
Premier exemple, on trie les résultats par numéro de département, puis par salaire.
<pre class="ipsCode prettyprint">
mysql&gt; SELECT ename, sal, deptno FROM emp ORDER BY deptno, sal;
+---------+-------+--------+
| ename   | sal   | deptno |
+---------+-------+--------+
| JONES   |  2975 |      2 |
| FORD    |  1300 |      3 |
| SMITH   |   800 |      4 |
| ALLEN   |  1600 |      4 |
| RICARDO |  2000 |      6 |
| KING    | 10000 |      6 |
+---------+-------+--------+
6 rows in set
</pre>
<p></p></blockquote><p><br><br></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><br>
Deuxième exemple, on trie par salaire (du plus petit au plus grand).
<pre class="ipsCode prettyprint">
mysql&gt; SELECT ename, sal, deptno FROM emp ORDER BY 2;
+---------+-------+--------+
| ename   | sal   | deptno |
+---------+-------+--------+
| SMITH   |   800 |      4 |
| FORD    |  1300 |      3 |
| ALLEN   |  1600 |      4 |
| RICARDO |  2000 |      6 |
| JONES   |  2975 |      2 |
| KING    | 10000 |      6 |
+---------+-------+--------+
6 rows in set
</pre>
<p>2 est le numéro de colonne de sal dans le SELECT (il est a la seconde position)<br></p></blockquote><p><br><br><strong><u><span style="font-size:18px;">III - Restriction/sélection :</span></u></strong><br><br>
On commence directement par la clause WHERE. Avec le WHERE, on va réduire le nombre de lignes concernées par la recherche.<br>
Par exemple, on sélectionne tous les employés du service 1 :</p>
<pre class="ipsCode prettyprint">
SELECT ename, sal
FROM emp
WHERE deptno = 10
</pre>
<p>Les conditions de recherche sont des expressions logiques vraies ou fausses, en fonction des enregistrements de la table. Une condition peut aussi être appelée prédicat.<br>
Une condition est toujours composée de 3 membres : deux expressions encadrant un opérateur de comparaison.<br>
On peut comparer un attribut avec une valeur constante (comme dans l'exemple), mais aussi deux attributs entre eux.<br><br>
On retrouve les opérateurs de comparaison usuels à savoir :</p>
<ul><li>Comparaison : =, !=, &lt;&gt;, &gt;, &gt;=, &lt;, &lt;=</li>
<li>Intervalles : BETWEEN</li>
<li>Concordance de caractères : LIKE avec les jokers _ et %</li>
<li>Gestion des colonnes "NULL" : IS NULL</li>
<li>Enumération : IN</li>
<li>Négation : NOT IN, NOT LIKE, NOT BETWEEN, IS NOT NULL</li>
</ul><p></p><hr><br><br>
Intéressons-nous aux opérateurs de comparaison suivants : &lt;, &gt;, &lt;= et &gt;=<br>
On peut les utiliser avec les types suivants :
<ul><li>numérique</li>
<li>Alphabétique</li>
<li>Chronologique (avec les dates)</li>
</ul><p>Exemple avec les dates :</p>
<pre class="ipsCode prettyprint">
SELECT ename, hiredate
FROM emp
WHERE hiredate &lt; '1981-01-01'
-- Le format de la date depend du SGBD
</pre>
<p>Pour les comparaisons de chaînes de caractères, les lettres majuscules et minuscules sont supérieures aux nombres et la casse peut importer, tout dépend de comment le SGBD est réglé.<br><br>
Exemple avec les chaînes :</p>
<pre class="ipsCode prettyprint">
SELECT ename
FROM emp
WHERE ename &gt; 'MARTIN'
</pre>
<p></p><hr><br><br>
Passons au LIKE :<br>
Il est très utilisé, notamment pour tout ce qui est scripts de recherche, le tout est de bien savoir l'utiliser !<br>
Comme vous l'avez vu un peu plus haut, on utilise deux jokers :
<ul><li>_ qui remplace une lettre</li>
<li>% qui remplace tout chaîne de caractère</li>
</ul><p>Peu compréhensible n'est-ce pas ?<br>
Regardons un exemple pour mieux comprendre :</p>
<pre class="ipsCode prettyprint">
SELECT ename
FROM emp
WHERE ename LIKE ('_AR%')
</pre>
<p>Que demande cette requête ? On cherche les noms d'employés qui ont pour deuxième lettre A et troisième lettre R dans leur nom de famille. soit :</p>
<pre class="ipsCode prettyprint">
SELECT ename
FROM emp
WHERE ename LIKE ('_AR%');
+--------+
| ename  |
+--------+
| WARD   |
| MARTIN |
+--------+
2 rows in set
</pre>
<p>Déjà un peu plus compréhensible non ? C'est en jouant avec ces deux jokers qu'on arrive à trouver ce qu'on veut.<br><br></p><hr><br><br>
On va maintenant s'intéresser au IN :<br>
Il s'agit en fait d'une énumération. Seulement, on peut l'utiliser avec différents types.<br>
Par exemple, on sélectionne les employés travaillant dans les services 3 et 4 :<br><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler="">
<pre class="ipsCode prettyprint">
SELECT ename, deptno
FROM emp
WHERE deptno IN (3,4);
+--------+--------+
| ename  | deptno |
+--------+--------+
| SMITH  |      4 |
| ALLEN  |      4 |
| FORD   |      3 |
| WARD   |      3 |
| MARTIN |      3 |
+--------+--------+
5 rows in set
</pre>
<p></p></blockquote><p><br>
Les membres sont entre parenthèses et séparés par une virgule, on peut mettre autant de termes qu'on veut.<br>
Le fonctionnement pour le NOT IN est le même. Seulement, on ne prendra que les données dont la valeur du champ n'est pas dans les parenthèses.<br>
 <br></p><hr><br>
 <br><strong>BETWEEN</strong> et <strong>NOT BETWEEN</strong><br>
 <br>
On recherche un champ dont la valeur est entre deux valeurs. Il faut savoir que les bornes du BETWEEN sont inclues dans la recherche.<br>
 <br><strong>Exemple :</strong> On recherche les employés qui ont un salaire compris entre 1600 et 3000 :<br><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler="">
<pre class="ipsCode prettyprint">
SELECT ename, sal
FROM emp
WHERE sal BETWEEN 1600 AND 3000;
+---------+------+
| ename   | sal  |
+---------+------+
| ALLEN   | 1600 |
| RICARDO | 2000 |
| JONES   | 2975 |
| MARTIN  | 1650 |
+---------+------+
4 rows in set
</pre>
<p></p></blockquote><p><br><br></p><hr><br>
 <br>
On passe maintenant à l'opérateur de comparaison <strong>IS NULL</strong><br>
Il faut savoir quelques petites choses avant de commencer :
<ul><li>Une valeur NULL est une valeur inconnue
<ul><li>NULL &lt;&gt; 0</li>
<li>NULL = valeur non renseignée</li>
<li>On teste par IS NULL et non = NULL</li>
</ul></li></ul><p>Exemple : Les employés et leur département qui ont une commission NULL<br></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler="">
<pre class="ipsCode prettyprint">
SELECT ename, deptno FROM emp WHERE comm IS NULL;
+--------+--------+
| ename  | deptno |
+--------+--------+
| WARD   |      3 |
| MARTIN |      3 |
+--------+--------+
2 rows in set
</pre>
<p> </p></blockquote><p><br>
Seulement, une colonne NULL n'est pas très pratique pour faire des calculs. C'est pourquoi chaque SGBD permet de remplacer NULL par une autre valeur. Seulement, cette fonction dépend des SGBD :</p>
<ul><li>Pour Oracle : NVL()</li>
<li>Pour SQL Server : ISNULL()</li>
<li>Pour PostgreSQL : COALESCE()</li>
<li>Pour MySQL : IFNULL()</li>
</ul><p>Dans ce tutoriel, j'utilise MySQL donc je prendrai pour exemple IFNULL().<br>
Regardons :</p>
<pre class="ipsCode prettyprint">
SELECT ename, sal, comm, sal + comm, sal + IFNULL(comm,0) FROM emp;
+---------+-------+------+------------+----------------------+
| ename   | sal   | comm | sal + comm | sal + IFNULL(comm,0) |
+---------+-------+------+------------+----------------------+
| SMITH   |   800 | NULL | NULL       |                  800 |
| ALLEN   |  1600 | 300  |       1900 |                 1900 |
| RICARDO |  2000 | NULL | NULL       |                 2000 |
| JONES   |  2975 | 100  |       3075 |                 3075 |
| FORD    |  1300 | NULL | NULL       |                 1300 |
| KING    | 10000 | 5000 |      15000 |                15000 |
| WARD    |  1500 | NULL | NULL       |                 1500 |
| MARTIN  |  1650 | NULL | NULL       |                 1650 |
+---------+-------+------+------------+----------------------+
8 rows in set
</pre>
<p>Pratique non ?<br>
Passons à la suite !<br>
 <br></p><hr><br>
 <br><strong>Les opérateurs logiques</strong><br>
Dans une requête SQL, on pourra utiliser des opérateurs logiques afin de lier deux prédicats. Cela permet d'avoir un résultat plus précis avec des conditions simples.<br>
Les principaux opérateurs logiques sont (par ordre d'évaluation) :
<ul><li>NOT</li>
<li>AND</li>
<li>OR</li>
</ul><p>Ils s'utilisent comme cela :</p>
<pre class="ipsCode prettyprint">
SELECT * FROM emp WHERE deptno = 1 AND sal &gt; 1000;
</pre>
<p>Il est plus que conseillé d'utiliser des parenthèses pour "imposer" l'ordre d'exécution des opérateur logiques.<br>
 <br></p><hr><br>
 <br>
On arrive à la fin de ce chapitre sur la restriction et la sélection des données. Le prochain chapitre sur les jointures sera plus pointu, et plus complet. N'hésitez pas à relire plusieurs fois certains points, quitte à demander un éclaircissement sur quelque chose que vous n'auriez pas compris.<br>
 <br>
Avant de passer au prochain chapitre, je vais ajouter un dernier point :<br>
Le résultat d'un SELECT est en fait une relation. On pourra donc utiliser le résultat d'un SELECT dans plusieurs cas :
<ul><li>Sous requête</li>
<li>Jointures</li>
<li>UNION (et opérations ensemblistes)</li>
</ul><p>Voila, le chapitre est terminé, on passe à la suite !<br>
 <br><strong><u><span style="font-size:18px;">IV - Jointures</span></u></strong><br>
 <br>
Passons au point le plus marrant de ce tutoriel, et ce sera le dernier. Écoutez bien, les jointures sont des notions importantes pour bien manipuler une base de données !</p>
<p>En effet, les jointures vont nous permettre de mettre en corrélation plusieurs tables au sein d'une même requête, donc en économisant (si c'est bien fait) des ressources système et sans avoir besoin de traitement dans un autre langage (tel que PHP, par exemple).</p>
<p> </p>
<p>Il existe trois "grandes familles" de jointures :</p>
<ul><li>Le produit cartésien</li>
<li>Les jointures naturelles</li>
<li>Les théta-jointures (ou équi-jointures)</li>
</ul><p>Je vais tous vous les présenter, mais celui qui nous intéresse est bien évidemment le dernier.</p>
<p> </p>
<ul><li><strong>Le produit cartésien : </strong>Il s'agit d'une opération entre les relations qui combine toutes les occurrences. C'est à dire que le nombre de lignes du résultat est égal au produit du nombre de lignes de chacune des relations. Autrement dit, si on a une table qui contient 3 entrées, et qu'on fait un produit cartésien avec une autre table qui en contient 4, le résultat fera 12 lignes.</li>
</ul><p style="margin-left:40px;">Exemple :</p>
<pre class="ipsCode prettyprint">
mysql&gt; SELECT *
    -&gt; FROM lettre,chiffre;
+--------+---------+
| lettre | chiffre |
+--------+---------+
| a      | 1       |
| b      | 1       |
| c      | 1       |
| a      | 2       |
| b      | 2       |
| c      | 2       |
| a      | 3       |
| b      | 3       |
| c      | 3       |
| a      | 4       |
| b      | 4       |
| c      | 4       |
+--------+---------+
12 rows in set
</pre>
<p style="margin-left:40px;">Vous avouerez que, quand on manipule de grandes bases de données, cette méthode est très gourmande en ressources et en plus, il est très probable que nous n'utilisions pas tous les résultats.</p>
<ul><li><strong>La jointure naturelle : </strong>En fait, ce que nous allons appeler jointure peut s'apparenter à un produit cartésien suivi d'une restriction, puis d'une projection. On va combiner des relations ayant des valeurs en commun. Dès maintenant, nous allons beaucoup utiliser les alias afin de simplifier un petit peu nos requêtes. Ne soyez donc pas étonnés lorsque j'en utilise, c'est devenu une habitude.</li>
</ul><p style="margin-left:40px;">Dès maintenant, nous utiliserons aussi la syntaxe SQL 2 qui introduit justement ces différents types de jointures. Avant, les jointures n'étaient en fait que des produits cartésiens.</p>
<p style="margin-left:40px;">Trêve de papotages futiles, voici comment s'écrit une jointure naturelle :</p>
<pre class="ipsCode prettyprint">
SELECT deptno, ename
FROM dept
NATURAL JOIN emp
-- Fonctionne sous MySQL, Oracle et PostgreSQL mais pas sous MS SQL Server
</pre>
<p style="margin-left:40px;">En fait, une jointure naturelle cherche des champs avec le même nom afin de les mettre en commun. C'est dangereux à utiliser si des colonnes portant le même nom ne se réfèrent pas aux mêmes données. Je vous déconseille de l'utiliser, sauf si vous êtes surs de la base de données que vous utilisez et qu'elle est bien modélisée.</p>
<p style="margin-left:40px;"> </p>
<ul><li><strong>La thêta-jointure :</strong> C'est le type de jointure le plus souvent utilisé. Nous sommes vraiment maîtres de ce que l'on recherche. La syntaxe est simple à comprendre :</li>
</ul><pre class="ipsCode prettyprint">
-- Nom et salaire des employés gagnant plus que l'employé 7566
SELECT e1.ename, e1.sal
FROM emp e1
JOIN emp e2 ON e1.sal &gt; e2.sal -- On fait la jointure avec la condition
WHERE e2.empno = 7566
</pre>
<p style="margin-left:40px;">Plutôt simple non ? <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"></p>
<p style="margin-left:40px;">Pour l'équi-jointure, c'est le même principe, juste la condition change !</p>
<pre class="ipsCode prettyprint">
-- On cherche le nom de chaque employé avec le nom de son département
SELECT e.ename, d.dname
FROM emp e
JOIN dept d ON e.deptno=d.deptno
</pre>
<p style="margin-left:40px;">Alors, convaincus ? Ne vous inquiétez pas, j'ai bientôt fini ! Je vous présente juste une dernière notion</p>
<ul><li><strong>Left/right join : </strong>En fait,<strong> </strong>une jointure élimine par défaut les résultats ou il n'y a pas de correspondance (exemple, si un employé n'a pas de département, il ne sera pas affiché). Pour pallier ce problème, il faut dire à SQL de garder les champs à gauche, même si il n'y a pas de correspondance.</li>
</ul><p style="margin-left:40px;">Exemple :</p>
<pre class="ipsCode prettyprint">
mysql&gt; SELECT ename, e.deptno, dname
    -&gt; FROM emp e
    -&gt; LEFT JOIN dept d ON e.deptno=d.deptno;
+---------+--------+--------------+
| ename   | deptno | dname        |
+---------+--------+--------------+
| JONES   |      2 | Recherche    |
| FORD    |      3 | Comptabilité |
| WARD    |      3 | Comptabilité |
| MARTIN  |      3 | Comptabilité |
| SMITH   |      4 | Support      |
| ALLEN   |      4 | Support      |
| KING    |      6 | HeadOffice   |
| RICARDO | NULL   | NULL         |
+---------+--------+--------------+
8 rows in set
</pre>
<p style="margin-left:40px;">Ici, on a dit : "Même si il n'y a pas de correspondance, tu gardes les membres étant à gauche (LEFT) de la jointure" et Ricardo est apparu. C'est exactement le même principe pour RIGHT, tout dépend de comment vous construisez vos requêtes.</p>
<p style="margin-left:40px;"> </p>
<p> </p>
<p> </p>
<p>Voilà, je pense avoir fait le tour pour ce tutoriel. N'hésitez pas à réagir, contester, demander des éclaircissements...</p>
<p>Bon courage dans vos requêtes SQL <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=";)" data-src="https://melinyel.net/uploads/emoticons/default_wink.png"><br><br>
Merci d'avoir lu,<br>
Pirkoa</p>]]></description><guid isPermaLink="false">1345</guid><pubDate>Sun, 23 Nov 2014 17:15:18 +0000</pubDate></item><item><title>Introduction au SQL</title><link>https://melinyel.net/topic/1343-introduction-au-sql/</link><description><![CDATA[<p>Bonjour à vous,</p>
<p>Je me lance dans une petite série de plusieurs tutoriels qui, je l'espère, serviront à beaucoup d'entre vous.</p>
<p> </p>
<p>Pour ne rien vous cacher, j'utilise mes cours comme support en essayant de rester clair, et concis dans tout ce que j'explique.</p>
<p>Dans ce sujet, je vais vous présenter le SQL en général, ses principes, son historique, et aussi les SGBD, nous verrons ce que c'est, et à quoi ça sert. De plus, je vous donnerai des pistes afin de choisir le SGBD qui vous correspond.</p>
<p> </p>
<p>Vous êtes prêts ? C'est parti !</p>
<p> </p>
<p><u><strong><span style="font-size:18px;">I - Définition</span></strong></u> :</p>
<p> </p>
<p>SQL signifie <strong>Structured Query Language</strong>, ou <em>langage structuré de requêtes</em>.</p>
<p>C'est un langage pseudo-informatique (de type requête) standard et normalisé. C'est à dire que l'on peut l'utiliser sur plusieurs systèmes différents, la syntaxe sera toujours (à peu près) la même.</p>
<p> </p>
<p>Le SQL est destiné à interroger où à manipuler une <a href="http://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle" rel="external nofollow">base de données relationnelle</a>.</p>
<p> </p>
<p><strong><u><span style="font-size:18px;">II - Principes</span></u></strong> :</p>
<p> </p>
<p>Le SQL est fondé sur la logique des prédicats, et le modèle relationnel. De plus, c'est un langage non procédural, il permet d'avoir un résultat sans spécifier l'ordre d'exécution des différentes opérations, comme on pourrait le faire en PHP par exemple. C'est un langage ensembliste, c'est à dire qu'il travaille sur des ensembles de données.</p>
<p>Au final, une requête SQL est équivalente à une suite d'opérations qui sont en relation.</p>
<p>Il faut aussi noter que SQL est une norme depuis 1986.</p>
<p> </p>
<p>Pour rentrer un peu plus dans le sujet, le SQL se compose de 5 parties :</p>
<ul><li>Les <strong>ordres LDD</strong> (langage de définition des données) : Ce sont tous les ordres qui permettent de modifier la structure de la base de données.</li>
<li>Les <strong>ordres LMD</strong> (langage de manipulation des données) : Ce sont les ordres qui permettent de consulter, ou de modifier le contenu de la base de données</li>
<li>Les <strong>ordres LCD</strong> (langage de contrôle des données) : Ce sont tous les ordres qui servent à gérer les utilisateurs et les privilèges, ainsi que les actions qu'ils peuvent entreprendre</li>
<li>Les <strong>ordres LCT</strong> (langage de contrôle des transactions) : C'est ce qui permet de gérer les transactions, c'est à dire rendre automatiques certains ordres enchaînés (des séquences, si vous préférez)</li>
<li>Le <strong>SQL procédural</strong> : Ensemble d'outils pour que le SQL s'interface correctement avec des langages hôtes (PSM , CLI, Embedded SQL, ... )</li>
</ul><p><strong><u><span style="font-size:18px;">III - Historique :</span></u></strong></p>
<p>Je ne vous aurai pas laissé filer dans un petit bout d'historique voyons !</p>
<p>Voici les différents stades du langage SQL, qui sont importants à connaître :</p>
<ul><li><strong>SQL86 - SQL89 ou encore SQL1</strong> :  C'est la référence de base,
<ul><li>Requêtes compilées puis exécutées depuis un programme d'application</li>
<li>4 types de données simples (entiers, réels, chaînes de taille fixes)</li>
<li>Opérations ensemblistes restreintes (uniquement le UNION)</li>
</ul></li><li><strong>SQL92 ou SQL2</strong> : Le standard actuel
<ul><li>Requêtes dynamiques</li>
<li>Types de données plus riches (intervalles, dates, chaînes de traille variables, ...)</li>
<li>Différents types de jointures (naturelle et externe) contre le produit cartésien uniquement en SQL1</li>
<li>Opérations ensemblistes : différence (EXCEPT), Intersection (INTERSECT)</li>
<li>Renommage des attributs dans un SELECT</li>
</ul></li><li><strong>SQL99 ou SQL3</strong> : SQL devient un langage de programmation
<ul><li>Extensions orientées-objet</li>
<li>Types structurés</li>
<li>BLOB, CLOB</li>
<li>Récusrivité</li>
</ul></li></ul><p>Il faut savoir que je parlerai dans mes différents tutos uniquement de SQL2, qui reste le SQL le plus utilisé (non orienté-objet).</p>
<p> </p>
<p>Maintenant que nous savons tout ça, c'est bien, mais comment choisir le système qui gérera ma base de données ?</p>
<p> </p>
<p><strong><u><span style="font-size:18px;">IV - Les SGBD :</span></u></strong></p>
<ul><li>Un <strong>SGBD</strong> (Système de Gestion de Bases de Données) est un outil informatique permettant de définir, stocker, consulter, modifier et protéger les données de la base.</li>
</ul><p>Il existe de nombreux SGBD, comment choisir le bon ? Que peut-on attendre d'un bon SGBD ?</p>
<ul><li>Assurer un accès simple, rapide et uniforme aux données de chaque utilisateur</li>
<li>Faciliter les tâches d'administration des données</li>
<li>Garantir l'intégrité, la sécurité, la confidentialité des données stockées</li>
<li>Diminuer le temps de développement des applications qui utilisent ces données</li>
<li>Être tolérant aux pannes matérielles et logicielles</li>
</ul><p>Voila les principaux points. Je vais vous donner maintenant les principaux SGBD relationnels :</p>
<ul><li>MySQL (libre)</li>
<li>Oracle (payant, mais beaucoup utilisé)</li>
<li>PostgreSQL (libre)</li>
<li>Microsoft SQL Server</li>
<li>Ingres</li>
<li>IBM DB2 (Un peu vieux)</li>
<li>SQLite (libre)</li>
<li>Microsoft Access (Soyons fous !)</li>
<li>...</li>
</ul><p>Pour donner mon avis perso sur quel est le meilleur SGBD, je dirai que tout dépend de votre besoin.</p>
<p>Beaucoup se précipitent sur MySQL, pensant que c'est LA solution. A ceux-ci, je leur dirai que non, car MySQL est loin d'être le plus complet des SGBD, il y a beaucoup d'instrucitons que MySQL ne gère pas directement (il faut réfléchir un petit peu pour avoir ce qu'on veut). PostgreSQL est très bien et très complet. Il a aussi l'avantage d'être gratuit et fidèle à SQL2.</p>
<p> </p>
<p>Sinon, si vous êtes une entreprise (sait-on jamais), Oracle reste la meilleure solution.</p>
<p> </p>
<p>Voila, j'ai fini cette petite introduction au SQL relationnel, n'hésitez pas à réagir, commenter, critiquer...</p>
<p>Le prochain chapitre portera sur le SELECT, sous toutes les formes (en passant par les jointures ! <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"> )</p>
<p>A très vite,</p>
<p>Pirkoa !</p>]]></description><guid isPermaLink="false">1343</guid><pubDate>Sat, 22 Nov 2014 20:53:48 +0000</pubDate></item><item><title>Sauvegarder sa base donn&#xE9;e MySQL en ligne de commande</title><link>https://melinyel.net/topic/958-sauvegarder-sa-base-donn%C3%A9e-mysql-en-ligne-de-commande/</link><description><![CDATA[<p>Bonjour, ce guide très court pour vous expliquer comment sauvegarder vos bases de données MySQL en ligne de commandes, pour les stocker dans un fichier. <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"><br>
Tout simplement :</p>
<pre class="ipsCode prettyprint lang-sql">
mysqldump -u root --password=mot_de_passe bdd &gt; dump.sql 
</pre>
<p>Vous l'aurez compris, il suffit de remplacer <strong>root </strong>par son nom d'utilisateur, <strong>mot_de_passe</strong> par son mot de passe, <strong>bdd </strong>par sa base de donnée existante et <strong>dump.sql</strong> sera le nom de votre fichier.</p>]]></description><guid isPermaLink="false">958</guid><pubDate>Tue, 29 Jul 2014 18:50:26 +0000</pubDate></item><item><title>Les commandes de base table mySQL</title><link>https://melinyel.net/topic/198-les-commandes-de-base-table-mysql/</link><description><![CDATA[<p>Salut all,</p><p>j'avais fais un beau tuto bien long et bien expliqué mais je me suis fail et tout a disparu en enfer... D:</p><p></p><p>Donc je fais une version abrégée, le mySQL est différent des autres oui, par exemple cette saloperie de SQLite ne prend pas le caractère " ` " pour isoler les variables même si il n'est pas obligatoire de plus certaines fonctions ne sont pas disponible. bref mySQL c'est bien et gratuit. ^-^</p><p></p><p>je vais pas refaire tout un truc sur la structure... il était tellement bien mon autre tuto disparu :'(</p><p></p><p>la structure de la commande se compose d'une action, une cible, de valeur(s)(optionnel), de condition(s)(optionnel), d'un ordre(optionnel) et une limite(optionnel).</p><p></p><p>exemple pour un ajout on utilise: une action, une cible et des valeurs::</p><p></p><pre class="ipsCode prettyprint lang-auto">#syntaxe: INSERT INTO [CIBLE] ([VARIABLE(S)]) VALUES([VALEURS]);
INSERT INTO `ma_table` (`texte`, `chiffre`) VALUES('Coucou', 123);
</pre>Donc:<p>- la "cible" c'est la table que vous voulez affecter vous pouvez la sélectionner aussi à travers une db (ex: `db_forum`.`ma_table`).</p><p>- les variables sont les noms des colonnes dans votre table.</p><p>- les valeurs sont les valeurs (._.) que vous donnez aux variables.</p><p>&gt; <a href="http://dev.mysql.com/doc/refman/5.0/fr/insert.html" rel="external nofollow">Documentation Mysql::INSERT</a></p><p></p><p>si la valeur est un chiffre vous n'êtes pas obligé de mettre de guillemets mais si vous désirez mettre un guillemet dans une phrase vous devait mettre un anti-slash devant (ex: 'C\'est bon le chocolat!').</p><p></p><p>il existe une syntaxe où vous n'êtes pas obligé de donner le nom des variables mais alors vous devez donner les valeurs pour toutes les variables dans l'ordre.</p><p></p><pre class="ipsCode prettyprint lang-auto">#dans le contexte il y a une variable guid qui sert d'index et l'ordre est: guid, texte, chiffre
INSERT INTO `ma_table` VALUES(NULL, 'Coucou', 123);
</pre>"NULL" retourne la valeur par défaut (ou une case vide) si la variable est un index avec une AI (auto-incrémentation) la valeur sera égale à l’incrémentation actuel de l'index de l'IA ._.<p></p><p>EDIT: je viens de me relire après ~8mois et je viens de voir que je n'ai pas indiqué comment ajouter plusieurs lignes en une commande, c'est simple il suffit de mettre une virgule entre les paquets de valeurs (les parenthèses).</p><p>Ce qui donne:</p><p></p><pre class="ipsCode prettyprint lang-auto">#syntaxe: INSERT INTO [CIBLE] ([VARIABLE(S)]) VALUES([VALEURS]);
INSERT INTO `ma_table` (`texte`, `chiffre`) VALUES('Coucou', 123), ('tu veux?', 456);
</pre>vous pouvez en mettre plus mais je ne connais pas la limite <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":(" data-src="https://melinyel.net/uploads/emoticons/default_sad.png"><p></p><p></p><p>maintenant pour modifier des variables: action, cible, variables, nouvelles valeurs, limite (non obligatoire mais c'est une petite sécurité)::</p><p></p><pre class="ipsCode prettyprint lang-auto">#syntaxe: UPDATE [CIBLE] SET [VARIABLES] = [VALEURS] WHERE [CONDITION] LIMIT 1
#dans le contexte notre commande précédente, a affecté la valeur 58 à `guid`
UPDATE `ma_table` SET `texte` = 'Au revoir', `chiffre` = (`chiffre` + 250) WHERE `guid`= 58 LIMIT 1;
</pre>quand vous avez plusieurs variables à mettre à jour vous n'avez cas les séparer par une virgule et vous pouvez aussi réutiliser les variables dans votre ligne comme par exemple pour augmenter la valeur d'un chiffre de 250. Vous pouvez appliquez une modification à toutes lignes en supprimant "WHERE [CONDITION]" et la limite.<p>&gt; <a href="http://dev.mysql.com/doc/refman/5.0/fr/update.html" rel="external nofollow">Documentation Mysql::UPDATE</a></p><p></p><p>pour bien illustrer le "WHERE" dans mon exemple précédent je vais vous expliquer le "SELECT" (la sélection, impressionnant non?), la syntace:</p><p></p><pre class="ipsCode prettyprint lang-auto">SELECT [COLONNE] FROM [CIBLE] WHERE [CONDITION] ORDER BY [ORDRE] LIMIT [LIMIT];
</pre>-[COLONNE] : Les informations que vous souhaites récupérer, j'aurais pu aussi mettre [VARIABLES]comme au dessus mais bon ça reste une légende.<p>-[CIBLE] : La table dans la quelle vous désirez faire votre recherche.</p><p>-[CONDITION] : La condition pour que la donnée soit sélectionnée.</p><p>-[ORDRE] : Ordre croissant (ASC) ou décroissant (DESC).</p><p>-[LIMIT] : La limite de la sélection.</p><p>&gt; <a href="http://dev.mysql.com/doc/refman/5.0/fr/select.html" rel="external nofollow">Documentation Mysql::SELECT</a></p><p></p><p>Premier exemple, nous allons sélectionner l'utilisateur dont l' "ID" est 169 dans une table du nom de "users":</p><p></p><pre class="ipsCode prettyprint lang-auto">SELECT * FROM `users` WHERE `ID` = 169 LIMIT 1;
</pre>Comme vous avez pu le constater j'ai mis un * dans les colonnes que je veux récupérer, celà signifie que je veux récupérer tout les colonnes de la ligne mais attention il n'est pas disponible dans toute les variantes SQL, le "LIMIT 1" est optionnel et inutile mais je le mets par hygiène de code <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":P" data-src="https://melinyel.net/uploads/emoticons/default_tongue.png"><p></p><p>maintenant nous allons faire un truc un peu plus compliqué, nous allons chercher dans une table du nom de "news" si le mot "patate" est présent dans la colonne "title" (titre) ou "content" (le contenu) et nous allons récupérer que le titre, le contenu et sont "guid" (qui correspond à son numéro d'index dans la table) dans l'ordre croissant selon le titre, mais vous vous dites pour trouver le mot ça va être compliqué <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":(" data-src="https://melinyel.net/uploads/emoticons/default_sad.png"> non en faite regardez :</p><p></p><pre class="ipsCode prettyprint lang-auto">SELECT `guid`, `title`, `content` FROM `news` WHERE (`title` LIKE '%patate%') OR (`cotent` LIKE '%patate%`) ORDER BY `title` ASC;
</pre>Comme vous pouvez le voir le "LIKE" est apparu, il est utilisé au même titre que le caractère "=", et il est complémenté par le caractère "%" qui dans la recherche signifie qu'il peut s'agir de n'importe quel caractère ou même de plusieurs mais vous désirez avoir qu'une possibilité que de 1 caractère il suffit de mettre un "_" à la place du "%".<p>il y a aussi l’apparition du "OR" qui signifie "ou", je dis donc à la requête que c'est ça <u>ou</u> ça pour être sélectionné, je mets des parenthèses pour bien séparer les conditions, vous pouvez aussi mettre un "AND" ("et" en français) si vous désirez que les deux conditions soient remplies.</p><p></p><p>pour un peu mieux illustrer l'exemple au dessus je vais le "traduite" dans un langage plus un langage plus "humain":</p><p></p><pre class="ipsCode prettyprint lang-auto">Sélectionne le `guid`, `title`, `content` dans les `news` où dans le `title` ressemble à '[n'importe]patate[n'importe]' ou dans le `content` si il y a une ressemblance à '[n'importe]patate[n'importe]' dans l'ordre de `title` en croissant.
</pre>c'est moche et pire à comprendre mais bon il existe des langages en français... ^-^<p></p><p>maintenant la suppression &lt;3</p><p>rien de plus simple de mettre fin aux jours de sa création,</p><p>comme exemple je vais reprendre l'exemple de l'users 169 ci-dessus et vu qu'il est méchant on va le supprimer:</p><p></p><pre class="ipsCode prettyprint lang-auto">#content: l'user (utilisateur) dont le `guid` (numéro index unique donné) est 169 est méchant donc on le supprime.
#syntaxe: DELETE FROM [CIBLE] WHERE [CONDITION];
DELETE FROM `users` WHERE `guid`= 169 LIMIT 1;
</pre>/!\ Attention, avec les commandes il n'est jamais possible de revenir en arrière sauf si vous avez une bonne mémoire ou une sauvegarde.<p>Le "LIMIT 1" est présent non pas pour hygiène mais par sécurité car une faute de syntaxe et vous risquez de grave perte si vous ne mettez pas de conditions c'est tout le mode qui disparait.</p><p>&gt; <a href="http://dev.mysql.com/doc/refman/5.0/fr/delete.html" rel="external nofollow">Documentation Mysql::DELETE</a></p><p></p><p>La remise à zéro, la commande "DELETE" c'est bien mais la commande "TRUNCATE" c'est mieux, quand vous utilisez la commande "DELETE" si votre table à un ou plusieurs index il(s) reste(nt) marqué(s) donc si vous voulez tout effacer et repartir à zéro (0) vous devez utiliser la commande "TRUNCATE":</p><p></p><pre class="ipsCode prettyprint lang-auto">#context: vous avez un vieux site et vous désire l'utiliser avec ses dbs mais ils y a plein de vieux users à supprimer.
#syntaxe: TRUNCATE TABLE [CIBLE]
TRUNCATE TABLE `cible`;
</pre>une raison de plus de ne pas avoir de faille sql dans son serveur...<p>&gt; <a href="http://dev.mysql.com/doc/refman/5.0/fr/truncate.html" rel="external nofollow">Documentation Mysql::TRUNCATE</a></p><p></p><p>Je pense avoir expliquer les commandes le plus utilisés, je ferais un autre topic sur la gestion des tables elle même, les comptes mysql et autre si j'en ai le courage x')</p><p></p><p>Bonne programmation à tous même si je considère par le SQL comme de la prog,</p><p>Mars073. <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":P" data-src="https://melinyel.net/uploads/emoticons/default_tongue.png"></p>]]></description><guid isPermaLink="false">198</guid><pubDate>Mon, 17 Mar 2014 21:41:01 +0000</pubDate></item><item><title>[Partage] Cours et tutoriels sur le langage SQL</title><link>https://melinyel.net/topic/555-partage-cours-et-tutoriels-sur-le-langage-sql/</link><description><![CDATA[<p>Bonjour,</p>
<p> </p>
<p>Je viens de découvert ce site : <a href="http://sql.sh/" rel="external nofollow">http://sql.sh/</a>. Jetez un coup d’œil, c'est vraiment sympa. <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"></p>
<p> </p>
<p>Pour info, voici les objectifs de l'équipe administrant ce site :</p>
<p> </p>
<blockquote data-ipsquote="" class="ipsQuote"><div>Les objectifs sont multiples. L'idéal serait que SQL.sh devienne la référence française pour apprendre le SQL. Pour cela, l'objectif primaire consiste à étoffer le contenu en particulier sur les fonctions SQL et sur quelques commandes SQL assez spécifiques (exemple : la commande EXPLAIN ). Le second objectif consistera à proposer non plus des fiches pour comprendre une commande de SQL, mais des cours avancés pour résoudre une problématique bien précise ou mieux pour apprendre comment bien paramétrer un serveur afin d'améliorer les performances du Système de Gestion de Base de Données (SGBD).
<p> </p>
</div></blockquote>
<p> </p>
<p>Voilà. <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"></p>]]></description><guid isPermaLink="false">555</guid><pubDate>Sun, 20 Apr 2014 18:24:14 +0000</pubDate></item><item><title>Les commandes de gestion table mySQL</title><link>https://melinyel.net/topic/526-les-commandes-de-gestion-table-mysql/</link><description><![CDATA[<p>Bonjour à tous,</p><p>je vais vous faire cette fois un topic sur les tables en elle même.</p><p>Commençons par la création (le début des temps lulz), connaître ces scripts devient presque obsolète vu les programmes et api disponiblent maintenant mais bon ça peut toujours servir:</p><p></p><pre class="ipsCode prettyprint lang-auto">#syntaxe: CREATE TABLE [NOM] ([VARIABLES+TYPE+PARAMÈTRES])[PARAMÈTRES SUPPLEMENTAIRES];
CREATE TABLE `ma_table` (
	`texte` text NOT NULL,
	`chiffre` int(10) unsigned NOT NULL,
);
</pre>Donc: <a href="http://dev.mysql.com/doc/refman/5.0/fr/create-table.html" rel="external nofollow">&gt;doc</a><p>- [NOM] = `ma_table` : C'est simplement le nom que vous voulez donner à votre table</p><p>- [VARIABLES] : Vous devez donner le nom de la variable/colonne, sont type (chiffre, texte, date, ..) la longueur qu'il doit faire, etc.</p><p>- [PARAMÈTRES SUPP] : paramètre de la table j'en montrerais dans les exemples suivants</p><p></p><p>au niveau des type de variables vous avez: <a href="http://dev.mysql.com/doc/refman/5.0/fr/column-types.html" rel="external nofollow">&gt;doc</a></p><p>- tinyint : chiffre entier (de -128 à 127)</p><p>- smallint : chiffre entier (de -32768 à 32767)</p><p>- mediumint : chiffre entier (de -8388608 à 8388607)</p><p>- int : chiffre entier (de -2147483648 à 2147483647)</p><p>- bigint : chiffre entier (de -9223372036854775808 à 9223372036854775807)</p><p></p><p>- float, decimal, double: pour faire simple on va dire chiffre à virgule <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":)" data-src="https://melinyel.net/uploads/emoticons/default_smile.png"></p><p></p><p>- bit: chiffre en binaire (ex: 10110010110100100100...)</p><p>- binary et varbinary : un peut comme bit sauf que la limite attribuée maximale est de 255 bits</p><p></p><p>- date : Attention c'est la date dans le format mysql uniquement (AAAA-MM-JJ), c'est la norme rfc-machin, ex: 1996-06-21</p><p>- time : une heure dans le format standard (HH:MM:SS), ex: 20:32:51</p><p>- datetime : le format de "date" et "time" séparé par un espace, ex: 199-06-21 20:32:51</p><p>- year : l'année en 4 chiffres, ex: 1996 ou 0666</p><p></p><p>- char : chaîne de caractères de maximum de 255 caractères (ex: "blsdkngki jsngkj rn1121 dgd")</p><p>- varchar : similaire à "char" sauf dans le fait que "char" considère les cratères vides comme un espaces jusqu'au comment où il arrive à la limite et oui char peut être avantageux au niveau d'utilisation de fonction par exemple</p><p>- text (tinytext, text, mediumtext et longtext) : simplement de text, je pense que la limite est dynamique malgré ses autres types qui peut changer la consommation de mémoire à mon avis, je regarderais quand j'aurais le temps.</p><p></p><p>- enum : liste de possibilité définie à la place de la limite.</p><p>- set : similaire à "enum" sauf que plusieurs possibilités peuvent être attribuées à la varible.</p><p></p><p>normalement toute on utilise pour toutes ses variables un limite de caractère (sauf text), on définie celle-ci entre parenthèses à la suite du type, exemple un "int" a une limite par défaut de 10:</p><p></p><pre class="ipsCode prettyprint lang-auto">`chiffre` int(10) ...
</pre>les types à virgules (float, decimal, ..) peuvent avoir un second paramètre qui est la limite après la virgule exemple avec une limite de 3 avant et 2 après la virgule:<p></p><pre class="ipsCode prettyprint lang-auto">`chiffre2` float(3, 2) ...
</pre>et la dernières exception je pense est "enum", sa limite sont les choix possibles, exemple la variable fruit peut être 3 fruits différents:<p></p><pre class="ipsCode prettyprint lang-auto">`fruit` enum("fraise", "pomme", "cranberrys") ...
</pre>vous vous demandez peut-être pourquoi ne pas utiliser toujours "text" pour du texte par exemple, c'est simple ça évite de bouffer de la mémoire pour rien bien que maintenant les machines sont si puissantes que la perte se compte en nano-secondes (ns) mais bon dans certaines entreprises grattent jusqu'à la plus infime nano-seconde surtout dans les infrastructure réseau...<p></p><p>maintenant on va ajouter des paramètres à nos variables avec une valeur par défaut, une auto-incrémentation (A_I), ou déclarer comme</p><p></p><p></p><p>... en cours de rédaction, c'est long et chiant <img src="https://melinyel.net/applications/core/interface/js/spacer.png" alt=":D" data-src="https://melinyel.net/uploads/emoticons/default_biggrin.png"> ...</p>]]></description><guid isPermaLink="false">526</guid><pubDate>Thu, 17 Apr 2014 18:19:41 +0000</pubDate></item></channel></rss>
