* Majuscules et Minuscules :
Le SQL n'est pas sensible à la casse (je parle uniquement de la syntaxe de la requête, pas des valeurs en base). Une bonne habitude à prendre est donc de mettre en majuscule les mots clés SQL et de garder en minuscule les noms de champ ou de table. La requête est ainsi beaucoup plus claire et lisible :
Code : Tout sélectionner
SELECT champ1, champ2 FROM table1 WHERE champ1 = 1 AND champ2 = 'xxx'* Apostrophes (') ou Guillemets (") ? :
En SQL les chaines de caractères sont délimitées par des apostrophes. MySQL tolère les guillemets, mais pas les autres bases de données pour qui elles ont une signification totalement différente. Prenez donc l'habitude d'utiliser les premières :
Code : Tout sélectionner
SELECT ... FROM ... WHERE champ = 'xxx';* Quotes Inversées (`) :
Cette syntaxe est propre à MySQL. Elle permet de protéger les noms des champs et des tables afin que le parseur SQL ne les confonde pas avec des mots clés réservés SQL. En effet, dans MySQL, on peut nommer un champ "FROM" et une table "SELECT" et faire la requête suivante :
Code : Tout sélectionner
"SELECT `from` FROM `select` WHERE `from` = 'select'Il vaut évidemment mieux choisir des libellés qui ne sont pas des mots clés protégés. Il n'y a ainsi aucune confusion possible pour le parseur, et vous n'aurez pas de mauvaise surprise lorsque vous développerez ou migrerez sur un autre SGBD.
Attention : il est très tentant d'utiliser le libellé 'date' pour désigner un champ de ce type. Je rappelle que 'date' est un mot clé SQL (tout comme 'varchar', 'int'). Préférez donc un nom du style 'date_insertion' ou 'date_update' qui sera également plus précis quant à la nature des données.
* Eviter le " SELECT * " :
Précisez le nom des champs que vous souhaitez récupérer pour éviter les risques d'erreur (lorsqu'un même nom se trouve dans plusieurs table), avoir des requêtes plus optimisées et un code php facilement maintenable.
Lister les champs en détail permet d'une part de ne récupérer que ce qui est nécessaire (inutile de ramener 12 champs mediumtext de 500Ko quand tout ce qui nous interesse c'est un id et un titre). De plus, le nombre de colonnes et l'ordre des champs pouvant avoir un impact sur le traitement qui va suivre (si l'on utilise mysql_fetch_row() par exemple), il est préférable de pouvoir les maîtriser.
Cela permet aussi de connaître les noms des colonnes retournés par la requête, et donc le noms des index utilisables.
* Compter les enregistrements
La fonction COUNT(*) qui permet de compter le nombre d'enregistrements d'une table, est la commande SQL la plus optimisée. Elle retourne forcément un résultat et ne ramène pas d'enregistrements inutiles. Si vous souhaitez uniquement connaître le nombre d'enregistrements que ramène une requête, et que vous n'avez pas besoin de récupérer le contenu de ceux-ci préferez le COUNT(*) à un "SELECT * " qui va inutilement charger toutes les valeurs pour ensuite compter le nombre d'enregistrements retournés avec mysql_num_rows() .
* Retour à la ligne
Le langage SQL permet d'insérer des retours à la ligne dans vos instructions, n'hésitez pas à les utiliser pour aérer vos requêtes et augmenter leur lisibilité :
Code : Tout sélectionner
SELECT ...
FROM ...
WHERE ...
ORDER BY ...Tout dépend de ce que vous voulez faire. Si vous connaissez la valeur exacte de la chaine que vous recherchez, le "=" s'impose. Le LIKE n'a d'intérêt que si vous ignorez une partie de la chaine recherchée. Il s'utilise alors avec des jokers (caractère "%") qui remplacent la ou les parties de la chaine que vous ne connaissez pas.
Attention : les recherches de chaines commençant par un joker (LIKE '%xxx') sont assez gourmandes en ressources et seront plus longues à exécuter, à utiliser avec parcimonie !
* Utiliser des alias
Les alias permettent de renommer certaines colonnes et ainsi pouvoir les utiliser facilement dans un GROUP BY, ORDER BY ou HAVING (mais pas dans le WHERE) de la requête SQL, ou même en PHP avec la fonction mysql_fetch_assoc()
Code : Tout sélectionner
SELECT champ1, champ2 + champ3 AS cumul, SUM(champ4) AS total
FROM table WHERE ...
ORDER BY cumulCode : Tout sélectionner
SELECT s.champ1, e.champ1, e.champ2
FROM societe s, employe e
WHERE s.champ1 = e.champ1* GROUP BY
La clause GROUP BY permet de regrouper par champs les données retournés par une requête. Elle ne s'utilise que lorsque vous faites appel à des fonctions de regroupements (telles que AVG(), COUNT(), SUM() ...). Elle doit porter sur l'ensemble des champs présents dans le select qui n'ont pas été groupés par une fonction.
Code : Tout sélectionner
SELECT idForum, nomForum, COUNT(idSujet) AS nbSujet, MAX(idMessage) AS lastPostId
FROM ...
WHERE ...
GROUP BY idForum, nomForumAttention : N'utilisez pas cette spécificité de MySQL si les colonnes que vous omettez dans le GROUP BY ne sont pas unique dans le groupe, vous auriez des résultats inattendus.