• Aucun résultat trouvé

| article | dealer | price | +---+---+---+

| 0001 | B | 3.99 |

| 0002 | A | 10.99 |

| 0003 | C | 1.69 |

| 0004 | D | 19.95 | +---+---+---+

Le dernier exemple peut, bien sûr, être amélioré en découpant les colonnes concaténées dans le client.

e) Utiliser les variables utilisateur

Vous pouvez utiliser les variables utilisateur de mySQL pour garder des résultats en mémoire sans avoir à les enregistrer dans des variables temporaires du client. Par exemple, pour trouver l'article avec le plus haut et le plus bas prix, vous pouvez faire :

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;

mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;

+---+---+---+

| article | dealer | price | +---+---+---+

| 0003 | D | 1.25 |

| 0004 | D | 19.95 | +---+---+---+

f) Recherche sur deux clefs

mySQL n'optimise pas encore quand vous effectuez des recherches sur deux clefs différentes combinées avec OR (la recherche sur une clef avec différentes parties OR est elle pas mal optimisée) : SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1' OR champ2_index = '1'

La raison est que nous n'avons pas trouvé le temps suffisant pour parvenir à un moyen efficace de gérer cela dans un cas général. (En comparaison, la gestion de AND est maintenant complètement générale et fonctionne très bien.) Pour le moment, vous pouvez résoudre ce problème efficacement en utilisant une table temporaire (TEMPORARY). Ce type d'optimisation est très utile si vous utilisez des requêtes très complexes et que le serveur SQL fait une optimisation dans le mauvais ordre.

CREATE TEMPORARY TABLE tmp

SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1';

INSERT INTO tmp

SELECT champ1_index, champ2_index FROM test_table WHERE champ2_index = '1';

SELECT * from tmp;

DROP TABLE tmp;

La méthode ci-dessus pour résoudre cette requête est en effet une UNION de deux requêtes.

g) Calculer les visites par jour

Ce qui suit donne une idée d'une utilisation des fonctions de bits pour calculer le nombre de jours par mois où un utilisateur a visité une page web.

CREATE TABLE t1 (annee YEAR(4), mois INT(2) UNSIGNED ZEROFILL, jour INT(2) UNSIGNED ZEROFILL);

INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2), (2000,2,23),(2000,2,23);

SELECT annee,mois,BIT_COUNT(BIT_OR(1<<jour)) AS jours FROM t1 GROUP BY annee,mois;

Qui retourne :

+---+---+---+

| annee | mois | jours | +---+---+---+

| 2000 | 01 | 3 |

| 2000 | 02 | 2 | +---+---+---+

Ce qui précède calcule le nombre de jours différents qui a été utilisé pour une combinaison année/mois, avec suppression automatique des doublons.

h) Utiliser

AUTO_INCREMENT

L'attribut AUTO_INCREMENT peut être utilisé pour générer un identifiant unique pour les nouvelles lignes :

CREATE TABLE animals (

id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL,

PRIMARY KEY (id) );

INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"), ("lax"),("whale");

SELECT * FROM animals;

Qui retourne : +----+---+

| id | name | +----+---+

| 1 | dog |

| 2 | cat |

| 3 | penguin |

| 4 | lax |

| 5 | whale | +----+---+

Vous pouvez obtenir la valeur utilisée de la clef AUTO_INCREMENT avec la fonction SQL LAST_INSERT_ID() ou la fonction d'API mysql_insert_id(). Note : pour une insertion multi-lignes, LAST_INSERT_ID()/mysql_insert_id() retourneront la clef AUTO_INCREMENT de la première ligne insérée. Cela permet de reproduire les insertions multi-lignes sur d'autres services.

Pour les tables MyISAM et BDB vous pouvez spécifier AUTO_INCREMENT sur une colonne secondaire d'une clef multi-colonnes. Dans ce cas, la valeur générée pour la colonne auto-incrementée est calculée de la façon suivante : MAX(auto_increment_column)+1) WHERE prefix=given-prefix. C'est utile lorsque vous voulez placer des données dans des groupes ordonnés.

CREATE TABLE animals (

grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL,

PRIMARY KEY (grp,id) );

INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale");

SELECT * FROM animals ORDER BY grp,id;

Qui retourne :

+---+----+---+

| grp | id | name | +---+----+---+

| fish | 1 | lax |

| mammal | 1 | dog |

| mammal | 2 | cat |

| mammal | 3 | whale |

| bird | 1 | penguin | +---+----+---+

Notez que dans ce cas, la valeur d'AUTO_INCREMENT sera réutilisée si vous effacez la ligne avec la plus grande valeur d'AUTO_INCREMENT tous groupes confondus.

VI) Utilisation de mysql en mode batch

Dans les sections précédentes, vous avez utilisé mysql inter activement pour entrer vos requêtes et voir les résultats. Vous pouvez aussi utiliser mysql en mode batch. Pour ce faire, placez les commandes que vous voulez exécuter dans un fichier, puis dites à mysql de lire les entrées à partir de celui-ci :

shell> mysql < fichier-batch

Si vous utilisez mysql sous windows et que vous avez des caractères spéciaux dans le fichier qui posent problèmes, vous pouvez faire :

dos> mysql -e "source fichier-batch"

Si vous devez spécifier les paramètres de connexion en ligne de commande, la commande ressemblera à ca :

shell> mysql -h hôte -u utilisateur -p < fichier-batch Enter password: ********

Lorsque vous utilisez mysql de cette façon, vous créez un fichier de script, puis vous l'exécutez. Si vous voulez que le script continue, même si il y a des erreurs, vous devez utiliser l'option --force de la ligne de commande. Pourquoi utilisez un script ? Voici quelques raisons :

• si vous utilisez une requête de façon répétitive (c'est à dire, chaque jour, ou chaque semaine), en faire un script vous évitera de la réécrire chaque fois ;

• vous pouvez générer de nouvelles requêtes à partir de requêtes existantes et similaires en copiant et éditant des fichiers de scripts ;

• ce mode peut aussi être utile lors du développement d'une requête, particulièrement pour les commandes sur plusieurs lignes ou plusieurs séquences de commandes. Si vous commetez une erreur, vous n'avez pas à tout récrire. Editez juste votre script pour corriger l'erreur et dites à mysql de l'exécuter à nouveau ;

• si vous avez une requête qui produit beaucoup d'affichage, vous pouvez le rediriger vers un visionneur plutôt que de le regarder défiler sur votre écran :

shell> mysql < fichier-batch | more

• vous pouvez capturer l'affichage dans un fichier pour un traitement ultérieur : shell> mysql < fichier_batch > mysql.out

• vous pouvez distribuer votre script à d'autres personnes pour qu'elles l'exécutent ;

• quelques situations ne permettent pas une utilisation interactive, par exemple, quand vous exécutez une requête à partir d'une tâche cron. Dans ce cas, vous devez utiliser le mode batch.

Le format d'affichage par défaut est différent (plus concis) lorsque vous exécutez mysql en mode batch de celui utilisé inter activement. Par exemple, le résultat de SELECT DISTINCT espece FROM animal ressemble à cela interactivement :

+---+

| espece | +---+

| oiseau |

| chat |

| chien |

| hamster |

| serpent | +---+

mais à cela en mode batch : espece

oiseau chat chien hamster serpent

Si vous voulez le format d'affichage interactif en mode batch, utilisez mysql -t. Pour écrire les commandes exécutées dans la sortie, utilisez mysql -vvv. Vous pouvez aussi utiliser un script à partir de l'invite mysql en utilisant la commande source :

mysql> source nom_fichier;

B) Référence du langage mySQL

mySQL possède une interface SQL assez complexe, mais facile à apprendre. Ca chapitre décrit les différentes commandes, types, et fonctions que vous aurez besoin de connaître pour utiliser mySQL de façon optimale. Ce chapitre sert aussi de référence pour toutes les fonctionnalités incluses au sein de mySQL. Afin d'utiliser ce chapitre efficacement, vous pourrez trouver utile de vous reporter aux différents index.

I) Structure du langage