8.2 Soumettre une requête

Assurez vous que vous êtes correctement connecté. Dans le cas contraire, reportez vous à la section précédente. Ce faisant, vous ne vous êtes en fait connecté à aucune base de données, mais c'est bien comme ça. A ce stade ; il est important de savoir comment envoyer une requête, avant de savoir créer une table, charger des données, et interroger la base. Cette section décrit les principes de base de saisie des commandes, en utilisant des commandes qui vous familiariseront avec le fonctionnement de MySQL.

Voici une commande simple qui demande au serveur la version et la date courante. Saisissez la comme ci-dessous, puis appuyez sur la touche entrée.

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

Cette première requête montre beaucoup de caractéristiques de mysql

Une commande consiste généralement d'une commande SQL, suivie d'un point-virgule (Il y a quelques exceptions, ou les point-virgules ne sont pas nécessaires, comme la commande QUIT , vue précédement. Nous y reviendrons plus loin).

Quand une requête a été saisie, mysql l'envoie au serveur pour qu'il l'exécute, puis affiche le résultat, et repropose une nouvelle invite de commande : mysql>.

Mysql> affiche la réponse du serveur sous forme de table (lignes et colonnes). La première ligne contient les titres des colonnes. Les lignes suivantes présentent les résultats de la requête. Généralement, les noms de colonnes sont les noms des colonnes des tables utilisées. Si la valeur retournée est une expression plutôt qu'une table, (comme dans l'exemple ci-dessus), mysql crée une colonne avec comme titre l'expression évaluée.

mysql affiche le nombre de ligne retourné, et le temps de traitement de la requête, ce qui donne une idée de la performance globale du serveur. Ces valeurs sont imprécises, car elle représente le temps passé entre l'envoi de la commande et la réception de la réponse, et ne montre pas quelle quantité de processeur a été utilisée. Cela ne permet pas de connaître la charge du serveur, ou les retards du réseau.

Par un souci de concision, la ligne ``rows in set'' ne sera plus affichée dans les exemples ultérieurs.

Les mots clés du langage peuvent être en majuscule ou minuscule, au choix. Les lignes suivantes sont équivalentes :

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Voici une autre requête qui montre que mysql peut être utilisé comme une simple calculatrice.

mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+

Les commandes que nous venons de voir sont relativement courtes, et tiennent sur une seule ligne. Il est possible de saisir plusieurs commandes sur une seule ligne, il suffit de toujours les terminer par des points-virgules.

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+

+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

Une commande n'est pas obligatoirement sur une seule ligne : les commandes les plus longues peuvent tenir sur plusieurs lignes. Ce n'est pas un problème, car mysql détermines la fin de la commandes grce au point-virgule, et non pas en cherchant la fin de la ligne (en d'autres termes, mysql accepte n'importe quel format de colonne, mais ne les exécute que si il trouve un point-virgule à la fin de la commande).

Voici une commande simple, et multi-lignes :

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

Dans cet exemples, vous avez pu remarquer que l'invite passe de mysql> à -> dès que la commande devient multi-lignes. C'est par ce biais que mysql indique qu'il n'a pas trouvé une commande complète, et qu'il attend un complément d'information. En observant bien l'invite de commande, vous saurez toujours ce que mysql attend de vous.

Pour annuler une commande qui est partiellement saisie, il suffit de taper '\c' (slash-c)

mysql> SELECT
    -> USER()
    -> \c
mysql>

Ici, l'invite de commande reprend son aspect initial. Cela indique que mysql est prêt pour une nouvelle commande.

La table suivante montre les différentes formes de l'invite de commande, et sa signification :

Une commande peut s'étendre sur plusieurs lignes si, par accident, vous oubliez de terminer votre ligne par un point-virgule. Dans ce cas, mysql attend plus d'informations :

mysql> SELECT USER()
    ->

Si cela vous arrive (vous pensez avoir entré une commande, mais la seule réponse est cette désespérante invite -> ) ; le plus souvent mysql attends le point-virgule. Si vous ne comprenez pas que mysql attend la suite de votre commande, vous risquez d'attendre un bon moment. Il suffit alors de compléter la commande avec un point-virgule, pour valider la commande.

mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@localhost |
+--------------------+

Les formes '> et "> d'invite de commande apparaissent lors de la saisie de chaînes. Avec MySQL, vous pouvez écrire des chaînes avec les guillemets simples et doubles : ``''' ou ``"' ; 'comme par exemple 'bonjour' ou "au revoir". '> et "> signifie donc que vous avez commencé à saisir une chaîne de caractères, mais que vous n'avez pas encore fini. Si vous saisissez une chaîne de plusieurs lignes, c'est une indication judicieuse, mais est-ce souvent le cas? En général, ces deux invites de commande indiquent que vous avez oublié de refermer les guillemets :

mysql> SELECT * FROM my_table WHERE nom = "Smith AND age < 30;
    ">

Si vous saisissez cette commande SELECT , puis tapez ENTREE, il ne va rien se passer. Plutôt que de se demander " mais qu'est ce qui prend tant de temps ", il vaut mieux remarquer que l'invite a pris la forme particulière de "> . Cela signifie que mysql s'attend ce que vous complétiez votre chaîne et la commande. En effet, la chaîne "Smith n'a pas de deuxième guillemet.

A ce moment, que faire ? La chose la plus simplet d'annuler la commande. Cependant, vous ne pouvez pas taper \c , car mysql l'interprétera comme un caractère de chaîne. A la place, il faut clore la chaîne, puis taper \c .

mysql> SELECT * FROM my_table WHERE nom = "Smith AND age < 30;
    "> "\c
mysql>

L'invite de commande redevient mysql>, ce qui indique que mysql est prêt pour une nouvelle commande.

Il est important que les invites de commande de la forme signifie '> et "> que vous n'avez pas terminé une chaîne, et que toutes les lignes suivantes seront ignorées par l'analyseur de mysql – y compris la commande QUIT! Cela peut être déroutant, surtout si vous ne savez pas qu'il faut absolument fournir un guillemet de fin, même pour annuler la saisie