Introduction au langage SQL

Transcription

Introduction au langage SQL
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
- Séance 6 -
Introduction au langage SQL
1. Description
SQL est un acronyme pour “Structured Query Language” qui a été conçu par IBM, et a
succédé au langage SEQUEL. C’est maintenant le langage le plus utilisé dans les SGBD
commerciaux. Le langage SQL est un langage de définition (LDD) et de manipulation
(LMD) de bases de données relationnelles, développé par IBM dans les années soixante.
Il est a évolué de manière à pouvoir être utilisé en mode interactif (comme un langage
de script), en mode procédural (on crée des programmes effectuant plusieurs taches
dans un même traitement. Ex : un script Shell), ou intégré à un autre langage (librairies
SQL pour python, C, Java,…). SQL est un langage déclaratif { savoir qu’il permet {
l’utilisateur de spécifier le résultat qu’il attend, c’est au SGBD de trouver, ensuite, le
moyen d’aboutir { ce résultat.
L’interpréteur SQL existe en de nombreuses versions, du fait que chaque éditeur de
SGBD-R adapte la norme SQL à son propre système (mySQL, pSQL (de PostgreSQL),
PL\SQL (d’Oracle), etc...).
SQL permet de :
 définir les données (CREATE, ALTER, DROP)
 interroger la base et formuler des requêtes (SELECT)
 manipuler les données (INSERT, UPDATE, DELETE)
 contrôler l’accès aux données (GRANT, REVOKE)
SQL ne distingue pas majuscules ou minuscules et n’accepte pas d’accents.
Dans le cadre de ce cours nous manipulons le langage MySQL1.
2. Se connecter à mySQL
Pour vous connecter { mySQL, la première condition est qu’un client/serveur mySQL
soit installé sur votre machine. A partir de là deux possibilités s’offrent { vous :
- Accéder à une base existante : une base nécessite une autorisation d’accès avec
un login et un mot de passe.
La commande dans ce cas est :
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor.
Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a-log
Type 'help' for help.
1
http://dev.mysql.com/doc/refman/5.0/fr/
1
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
- Séance 6 -
mysql>
-
Accéder à mySQL de manière anonyme au serveur sans avoir à une quelconque
base en particulier.
shell> mysql
Welcome to the MySQL monitor.
Commands end with ; or \g.
Your MySQL connection id is 29 to server version: XXX
mysql>
3. Utiliser mySQL
Si vous êtes connectés à une base, dans ce cas vous avez accès aux informations
contenues dans cette dernière comme les tables qui y sont définies. Vous pouvez donc
faire des requêtes d’interrogation de ces tables ou de modification.
Sinon, vous êtes dans un environnement hors base de données. Vous ne pouvez créer, ou
manipuler les tables qu’en environnement base de données. Pour cela il vous faut en
créer une.
Vous pouvez cependant utiliser les commandes d’environnement ou requêtes. Toute
requête se termine par un ″;″. Si le ; est omis, l’interprète mySQL ne va exécuter votre
requête que lorsque vous aurez saisi ce caractère. Voici quelques requêtes et
commandes non liées à une base de données :
 Commande pour connaitre la version de votre client mySQL et la date du jour.
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| VERSION()
| CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19
|
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
Le résultat de cette requête renvoie une table avec en première ligne le nom de
l’information demandée, et les lignes suivantes contiennent les informations
correspondantes. Ici une seule version de mySQL et une seule date du jour.
La dernière ligne affichée (1 row in set(0.01 sec)) correspond au nombre de résultats
trouvés (ici 1) et le temps pour exécuter cette requête. Ce temps est imprécis, car il
indique le temps calculé par le logiciel et ne prend pas en compte le temps processeur ou
matériel.
 Ou une opération de calcul mathématique :
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
2
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
- Séance 6 -
+-------------+---------+
|
0.707107 |
25 |
+-------------+---------+

Plusieurs requêtes sur une même ligne :
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION()
|
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW()
|
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

Une seule requête sur plusieurs lignes :
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER()
| CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18
|
+--------------------+--------------+

Pour quitter l’environnement MySQL, il faut saisir la commande :
mysql> quit
Bye
Attention : pas de ; pour la commande quit.

Pour annuler une requête pendant sa saisie, il faut taper la commande \c :
mysql> SELECT
-> USER()
-> \c
mysql>
L’erreur la plus fréquente est d’oublier le ; en fin de requête ou de fermer une chaine de
caractères. Voici les différentes invites mysql pour ces cas d’erreur :
3
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
Invite
mysql>
- Séance 6 -
Signification
Prêt pour une nouvelle commande.
->
En attente de la ou des lignes terminant la commande.
'>
En attente de la prochaine ligne collectant une chaîne
commencée par un guillemet simple (‘'’).
">
En attente de la prochaine ligne collectant une chaîne
commencée par un guillemet double (‘"’).
`>
En attente de la prochaine ligne collectant une chaîne
commencée par un guillemet oblique (‘`’).
Il suffit alors de saisir le caractère omis, pour que mysql exécute la requête.
Voici quelques méta-commandes utiles :
Méta-commandes
Description
\?
Affiche toutes les méta-commandes
\h
Idem
\h <commande>
Affiche le man d’une commande
\q
Quit
\W
Affiche les warnings
\w
Désactive l’affichage des warnings
\ ! <shell commande>
Exécute une commande shell
\u <nom-de-bdd>
Utilise une base de données
4. Voir et créer une base de données
Avant de pouvoir manipuler des données stockées dans tes tables, il nous faut créer une
base de données en déterminant les droits d’accès { cette base. Il faut ensuite accéder {
la base nouvellement créée, pour y définir des tables. On insèrera alors dans ces tables
des données. Une fois ces données insérées, nous pourront les manipuler.
L’intérêt d’une base de données est qu’elle peut être définie sur un serveur, et ainsi être
partagée par plusieurs utilisateurs (clients). Chaque utilisateur aura un accès soit total à
la base, soit un accès limité. Comme pour un compte unix, les utilisateurs ont des droits
limités alors que l’administrateur { des droits absolus lui permettant entre autre de
supprimer une base.
4.1.

Voir le contenu d’une base de données
Pour voir les tables déjà existantes dans votre environnement vous aurez besoin
de la commande suivante :
mysql> SHOW DATABASES;
+-----------------------+
| Database
|
+-----------------------+
4
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
| information_schema
- Séance 6 -
|
+-----------------------+
La base trouvée ici est information_schema, elle peut être nommée différemment
(ex : mysql). Cette base contient les accès et les privilèges.
 Pour accéder à une base on fait :
mysql> USE information_schema
Database changed
Attention ; la commande USE, tout comme QUIT s’utilise sans ; à la fin.
 Pour voir l’ensemble des tables de cette base, il faut faire :
mysql> SHOW TABLES;
+---------------------------------------+
| Tables_in_information_schema
|
+---------------------------------------+
| CHARACTER_SETS
|
| …
|
+---------------------------------------+
/!\Attention/!\ Contrairement aux noms des tables et aux noms des commandes SQL, le
nom des bases de données est sensible à la casse.
Pour changer de base de données, il suffit de faire de nouveau appel à USE nom_bdd.
4.2.

Créer une base de données
Pour créer votre base de données il faut faire appel à la commande CREATE
DATABASE (ou en minuscules) comme suit :
mysql> CREATE DATABASE test;
Nous créons ici la base dont le nom est ‘test’.
Une fois créée, il faut y accéder, par la commande USE test.
 Puis nous créons les tables qu’elle va contenir :
mysql> CREATE TABLE personne (nom VARCHAR(20), prenom VARCHAR(20),
-> sexe CHAR(1), naissance DATE);
Nom, prenom sexe, et naissance sont les attributs du type-entité PERSONNE dans le
modèle E/A. Mais dans le langage SQL ce sont les colonnes de la table personne.
Lorsque l’on définit une table de données, chaque colonne doit avoir un type qui permet
de représenter correctement les données qui y seront stockées. Par exemple la colonne
nom a pour type VARCHAR(20) ce qui correspond à une chaine de caractères de
longueur 20. Les différentes longueurs possibles pour un type VARCHAR sont de 1 à 255
5
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
- Séance 6 -
caractères. A vous de choisir la bonne longueur afin que votre chaine de caractères ne
soit pas tronquée lors de l’insertion des données.
Si vous vous êtes trompé dans le choix d’un type ou de sa longueur il vous est possible
de la modifier par la suite grâce à la commande ALTER TABLE nomtable.
Quelques types de données :
Type
Entier signé codé sur 8 octets
Syntaxe
Entier signé codé sur 4 octets
INT[(length)] [UNSIGNED]
idem
INTEGER[(length)] [UNSIGNED]
Entier signé codé sur 2 octets
SMALLINT[(length)] [UNSIGNED]
Reels comportant 6 chiffres sur 8
octets
Flottant sur 4 octets
REAL[(length,decimals)] [UNSIGNED]
Flottant stocké sous forme de
caractères. Seuls 5 chiffres sont
représentables dont deux décimales.
Le signe – peut apparaitre dans la
chaine.
Date au format ‘aaaa-mm-jj’
Jj et mm peuvent etre à 0. Utile
lorsqu’on ne connait pas la date
exacte
Temps au format ‘00:00:00’
NUMERIC[(length[,decimals])][UNSIGNED]
Année au format aaaa
YEAR
chaine de caractères de taille fixe
CHAR[(length)]
chaine de caractères de taille
variable
Enumération
(ex: male : m, femelle : f)
VARCHAR(length)

BIGINT[(length)] [UNSIGNED]
FLOAT[(length,decimals)] [UNSIGNED]
DATE
TIME
ENUM(value1,value2,value3,...)
Pour voir le format des données définies dans une table existante, il suffit de faire
appel à la commande DESCRIBE comme suit:
mysql> DESCRIBE personne;
+-----------+-------------+------+-----+---------+-------+
| Field
| Type
| Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| nom
| varchar(20) | YES
|
| NULL
|
|
6
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
| prenom
| varchar(20) | YES
| sexe
| char(1)
| naissance | date
- Séance 6 -
|
| NULL
|
|
| YES
|
| NULL
|
|
| YES
|
| NULL
|
|
+-----------+-------------+------+-----+---------+-------+
Pour insérer des données dans la table, il existe deux méthodes :
 Insérer { partir d’un fichier de données (au format .txt par exemple) grâce à la
commande LOAD DATA :
Soit le fichier de données suivant (data.txt) à insérer dans la table personne :
Fourt Lisa F
Juny Carole\N
Fidus \N
F
2004-05-12
1968-07-02
1994-04-24
Remarques :
- \N désigne une valeur NULL
- Les données d’un même
enregistrement sont séparés par une
tabulation.
mysql> LOAD DATA LOCAL INFILE "data.txt" INTO TABLE personne;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM personne;
+-------+--------+------+------------+
| nom
| prenom | sexe | naissance
|
+-------+--------+------+------------+
| Fourt | Lisa
| Juny
| F
| 2004-05-12 |
| Carole | NULL | 1968-07-02 |
| Fidus | NULL
| F
| 1994-04-24 |
+-------+--------+------+------------+

Insérer grâce à la requête INSERT :
mysql> INSERT INTO personne
-> VALUES ('Choupy','Emma', 'F','1999-03-30');

Pour supprimer une table il faut faire appel à la commande DROP TABLE :
mysql> CREATE TABLE personne;

Pour renommer une table il faut faire :
mysql> ALTER TABLE personne RENAME TO pers;
7
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
4.3.

- Séance 6 -
Manipuler les données d’une base
Sélectionner des données
mysql> SELECT nom, prenom FROME personne WHERE nom=‘Fourt’;
Sélectionne les colonnes nom et prénom des enregistrements vérifiant la
condition du WHERE. Pour sélectionner toutes les colonnes d’une table il suffit de
replacer les noms des colonnes par *.
mysql> SELECT * FROME personne WHERE nom=‘Fourt’;

Modifier
mysql> UPDATE personne SET nom=’Chaplin’ WHERE nom=’Fourt’;
Soit la table module qui contient une liste d’étudiants ainsi que leur note. Nous voulons
par exemple rajouter un point aux notes entre 0 et 9. Nous réalisons cela grâce à la
requête qui suit :
mysql> UPDATE module SET note=note+1 WHERE note>=0 AND note<=9;

Supprimer
Si nous voulons supprimes tous les enregistrements dont la note est entre 5 et 7, alors
nous lançons la requête suivante :
mysql> DELETE module WHERE note>=5 AND note<=7;
5. Scripts mySQL
Tout comme en Shell, il est possible d’exécuter des commandes et requêtes SQL
dans un script. Imaginons par exemple que votre base a été détruite par mégarde.
Heureusement, vous avez sauvegardé votre base auparavant (structure et données).
Soit restore.sql votre script de restauration de la base. Pour l’exécuter vous avez
deux possibilités :
- Vous êtes dans l’invite de commande mysql, dans ce cas il vous suffit de
lancer votre script comme suit :
mysql> source restore.sql;
-
Vous êtes sous shell, dans ce cas vous exécutez votre script comme suit :
$ mysql < restore.sql
Notez que l’extension du fichier ici est superflue, elle ne sert qu’à distinguer les
fichiers contenant des scripts MySQL des autres fichiers.
8
L3-Informatique Paris 8
Base de données
Rim Chaabane – [email protected]
- Séance 6 -
Si votre script effectue des requêtes d’interrogation ou de modification de tables,
n’oubliez pas d’utiliser la commande USE nombase avant, pour vous positionner sur
la bonne base de données.
Si l’accès à la base de données nécessite une identification vous pouvez lancer votre
script de cette façon :
shell> mysql nombase -h hôte -u utilisateur -p < fichier-batch
Enter password: ********
9