Tests

Quelques notes sur MySQL


Ce qui suit a été mis en oeuvre sous Mandrake 8.0 et s'inspire largement des instructions officielles.


Installation

Récupérer les paquetages RPM de mysql.

Mise en route

Le démon mysqld se lancera à chaque démarrage de linux. Si vous voulez le lancer immédiatement, allez en tant que root dans le dossier /etc/rc.d/init.d et lancez ./mysql start. Le démon étant lancé, vous pouvez exécuter mysql en tapant simplement mysql (il est aussi possible de saisir un nom d'utilisateur et un mot de passe : mysql -u moi -p motdepasse).
Pour quitter, il suffira de taper quit (ou CTRL D).

Tapez alors les requètes suivantes (suivies de la touche Entrée à chaque fois) :

Remarque : La fin d'une commande est indiquée par le ; et pas par le retour à la ligne : le prompt se change alors en -> au lieu de mysql> tant que la commande n'est pas achevée. Si vous voulez mettre fin à la commande en cours, tapez \c (nouvelle commande.
Pour permettre à un utilisateur nommé "custom" de se connecter à une base de donnée.

     shell> mysql --user=root mysql
     mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
                ON nomdelabase.*
                TO custom@localhost
                IDENTIFIED BY 'stupid';


Création d'une base

Voir les bases existantes

SHOW DATABASES;
 

Accèder à une base

USE nomdelabase
 

Création d'une base

                mysql>GRANT ALL ON nomdelabase.* TO yeb_sql;                 CREATE DATABASE nomdelabase;

Remarques :
- sous linux, le nom "Mabase" est différent de "mabase"
- après création, il faut accèder à la base (voir plus haut)
- on peut ouvrir mysql avec une table existante (par exemple "mysql -u yeb_sql -p mabase").
 
 

Création d'une table

Voir les tables existantes

SHOW TABLES;
 

Créer une table

Saisissez :
        CREATE TABLE shop (
        article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
        dealer CHAR(20) DEFAULT '' NOT NULL,
        price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
        PRIMARY KEY(article, dealer));
 

On peut alors utiliser
        DESCRIBE shop;
pour afficher une description de cette base.
 
 
 

INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), (3,'D',1.25),(4,'D',19.95);

puis

mysql> SELECT * FROM shop;

donne

    +-----+----+----+
     | article | dealer | price |
     +-----+----+----+
     |    0001 | A      |  3.45 |
     |    0001 | B      |  3.99 |
     |    0002 | A      | 10.99 |
     |    0003 | B      |  1.45 |
     |    0003 | C      |  1.69 |
     |    0003 | D      |  1.25 |
     |    0004 | D      | 19.95 |
     +-----+---+----+




Plus grande valeur d'une colonne :

SELECT MAX(article) AS article FROM shop
 

Récupérer les informations sur l'article le plus cher :

          SELECT article, dealer, price
          FROM   shop
          WHERE  price=19.95

Autre solution : trier les lignes par ordre décroissant et ne prendre que la première ligne :

     SELECT article, dealer, price
     FROM   shop
     ORDER BY price DESC
     LIMIT 1
 

Donner les prix les plus chers de chaque article


     SELECT article, MAX(price) AS price
     FROM   shop
     GROUP BY article

donne :

     +----+----+
     | article | price |
     +----+----+
     |   0001 |  3.99 |
     |   0002 | 10.99 |
     |   0003 |  1.69 |
     |   0004 | 19.95 |
     +----+----+


Pour chaque article, donner le(s) vendeur(s) proposant les prix les plus chers

     CREATE TEMPORARY TABLE tmp (
             article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
             price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);
      LOCK TABLES shop read;
      INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
      SELECT shop.article, dealer, shop.price FROM shop, tmp
     WHERE shop.article=tmp.article AND shop.price=tmp.price;
     UNLOCK TABLES;
     DROP TABLE tmp;

ou encore

     SELECT article,
     SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
       0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
     FROM   shop
     GROUP BY article;

qui donneront

     +----+-----+----+
     | article | dealer | price |
     +----+-----+----+
     |    0001 | B      |  3.99 |
     |    0002 | A      | 10.99 |
     |    0003 | C      |  1.69 |
     |    0004 | D      | 19.95 |
     +----+----+----+




Utilisation de variables

Par exemple, pour trouver l'article le plus cher et l'article le moins cher :

     select @min_price:=min(price),@max_price:=max(price) from shop;
     select * from shop where price=@min_price or price=@max_price;

donne

     +-----+----+----+
     | article | dealer | price |
     +-----+----+----+
     |    0003 | D      |  1.25 |
     |    0004 | D      | 19.95 |
     +-----+---+-----+