MySQL/Syntaxe

Un livre de Wikilivres.
Aller à : navigation, rechercher


Principe[modifier | modifier le wikicode]

  • Le LDD est composé de CREATE, ALTER et DROP. Il permet d'ajouter, modifier et supprimer les structures logiques qui contiennent les données, ou autorisent les utilisateurs à y accéder ou à les maintenir (bases, MaTables, vues, clés...). le LDD concerne les métadonnées.
  • Le LMD est constitué de INSERT, UPDATE et DELETE. Pour ajouter, modifier et supprimer les données stockées dans les bases.
  • Le LCD représente GRANT et REVOKE. Il s'agit de la sécurité de la base, des permissions des utilisateurs.


On peut aussi distinguer deux autres catégories :

  • Le DQL (Data Query Language : langage de requête de données), comme SELECT, SHOW et HELP. Ils sont rattachés au LMD dans le modèle traditionnel.
  • Le DTL (Data Transaction Language : langage de transaction de données) avec START TRANSACTION, SAVEPOINT, COMMIT et ROLLBACK [TO SAVEPOINT]. Affiliable au LCD dans le modèle à trois catégories.

Visualisation[modifier | modifier le wikicode]

 SELECT * FROM MaTable
 SELECT * FROM MaTable1, MaTable2, ...
 SELECT champ1, champ2, ... FROM MaTable1, MaTable2, ...
 SELECT ... FROM ... WHERE condition
 SELECT ... FROM ... WHERE condition GROUPBY champ
 SELECT ... FROM ... WHERE condition GROUPBY champ HAVING condition2
 SELECT ... FROM ... WHERE condition ORDER BY champ1, champ2
 SELECT ... FROM ... WHERE condition ORDER BY champ1, champ2 DESC
 SELECT ... FROM ... WHERE condition LIMIT 10
 SELECT DISTINCT champ1 FROM ...
 SELECT DISTINCT champ1, champ2 FROM ...

Jointures[modifier | modifier le wikicode]

 SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition
 SELECT ... FROM t1, t2 WHERE t1.id1 = t2.id2 AND condition
 SELECT ... FROM t1 INNER JOIN t2 ON (t1.id1 = t2.id2) WHERE condition
 SELECT ... FROM t1 NATURAL JOIN t2 WHERE condition
 SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition
 SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ...

Conditions[modifier | modifier le wikicode]

 champ1 = valeur1
 champ1 <> valeur1
 champ1 LIKE 'valeur _ %'
 champ1 IS NULL
 champ1 IS NOT NULL
 champ1 IS IN (valeur1, valeur2)
 champ1 IS NOT IN (valeur1, valeur2)
 champ1 BETWEEN valeur1 AND valeur2
 condition1 AND condition2
 condition1 OR condition2

Modification du contenu[modifier | modifier le wikicode]

 INSERT INTO MaTable1 (champ1, champ2, ...) VALUES (valeur1, valeur2, ...)

 DELETE FROM MaTable1 / TRUNCATE MaTable1
 DELETE FROM MaTable1 WHERE condition
 -- jointure :
 DELETE FROM MaTable1, MaTable2 WHERE MaTable1.id1 = MaTable2.id2 AND condition

 UPDATE MaTable1 SET champ1=nouvelle_valeur1 WHERE condition
 -- jointure :
 UPDATE MaTable1, MaTable2 SET champ1=nouvelle_valeur1, champ2=nouvelle_valeur2, ... WHERE MaTable1.id1 = MaTable2.id2 AND condition

Naviguer dans MySQL[modifier | modifier le wikicode]

 SHOW DATABASES
 SHOW TABLES
 SHOW INDEX FROM MaTable
 SHOW FIELDS FROM MaTable / DESCRIBE MaTable
 SHOW CREATE TABLE MaTable
 SHOW PROCESSLIST
 KILL numero
 USE ma_bdd

Créer / supprimer une base[modifier | modifier le wikicode]

 CREATE DATABASE MaBase
 CREATE DATABASE MaBase CHARACTER SET utf8
 DROP DATABASE `MaBase`

 ALTER DATABASE MaBase CHARACTER SET utf8

Créer/supprimer/modifier une table[modifier | modifier le wikicode]

 CREATE TABLE MaTable (champ1 type1, champ2 type2, ...)
 CREATE TABLE MaTable (champ1 type1, champ2 type2, ..., INDEX (champ))
 CREATE TABLE MaTable (champ1 type1, champ2 type2, ..., PRIMARY KEY (champ1))
 CREATE TABLE MaTable (champ1 type1, champ2 type2, ..., PRIMARY KEY (champ1, champ2))
 CREATE TABLE MaTable1 (fk_champ1 type1, champ2 type2, ...,
   FOREIGN KEY (fk_champ1) REFERENCES MaTable2 (t2_champA))
     [ON UPDATE|ON DELETE] [CASCADE|SET NULL]
 CREATE TABLE MaTable1 (fk_champ1 type1, fk_champ2 type2, ...,
   FOREIGN KEY (fk_champ1, fk_champ2) REFERENCES MaTable2 (t2_champA, t2_champB))
 CREATE TABLE MaTable IF NOT EXISTS (...)
 CREATE TABLE MaTable (champ1 type1, champ2 type2, ...) SELECT ...

 CREATE TEMPORARY TABLE MaTable (...)

 DROP TABLE MaTable
 DROP TABLE IF EXISTS MaTable
 DROP TABLE MaTable1, MaTable2, ...

 ALTER TABLE MaTable ADD (champ1 type1, champ2 type2, ...)
 ALTER TABLE MaTable MODIFY champ1 type1 
 ALTER TABLE MaTable MODIFY champ1 type1 NOT NULL ... 
 ALTER TABLE MaTable CHANGE ancien_nom_champ1 nouveau_nom_champ1 type1
 ALTER TABLE MaTable CHANGE ancien_nom_champ1 nouveau_nom_champ1 type1 NOT NULL ...
 ALTER TABLE MaTable ALTER champ1 SET DEFAULT ...
 ALTER TABLE MaTable ALTER champ1 DROP DEFAULT
 ALTER TABLE MaTable ADD INDEX (champ);
 DROP INDEX champ ON MaTable;

 ALTER TABLE ancien_nom RENAME nouveau_nom;

Clés primaires et étrangères[modifier | modifier le wikicode]

Lecture[modifier | modifier le wikicode]

Pour lister les clés d'une table :

SHOW CREATE TABLE MaTable

ou

SELECT *
FROM  `information_schema`.`TABLE_CONSTRAINTS`
WHERE `TABLE_NAME` = 'MaTable'

Création[modifier | modifier le wikicode]

 CREATE TABLE MaTable (..., PRIMARY KEY (champ1, champ2))
 CREATE TABLE MaTable (..., FOREIGN KEY (champ1, champ2) REFERENCES MaTable2 (t2_champ1, t2_champ2))

Pour ajouter une clé étrangère à une table existante :

ALTER TABLE MaTable ADD CONSTRAINT fk_maTable2_id FOREIGN KEY (maTable2_id) REFERENCES maTable2(id);

Suppression[modifier | modifier le wikicode]

Pour désactiver les contraintes le temps d'une session :

 SET foreign_key_checks = 0;

Pour le faire globalement :

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

Pour faire supprimer définitivement une contrainte :

ALTER TABLE MaTable1
DROP FOREIGN KEY FK_MaTable1_MaTable2

Créer/supprimer une vue[modifier | modifier le wikicode]

  CREATE VIEW nomvue AS SELECT champ1, champ2 FROM MaTable1               -- ou
  CREATE VIEW nomvue (champ1, champ2...) AS SELECT champ1, champ2 FROM MaTable1

  ALTER VIEW nomvue (champ1, champ2...) AS SELECT champ2 FROM MaTable1;
  DROP VIEW nomvue;

Il est impossible d'ajouter un index à une vue[1].

Permissions[modifier | modifier le wikicode]

 GRANT ALL PRIVILEGES ON base.* TO 'utilisateur'@'localhost' IDENTIFIED BY 'password';
 GRANT SELECT, INSERT, DELETE ON base.* TO 'utilisateur'@'localhost' IDENTIFIED BY 'password';
 REVOKE ALL PRIVILEGES ON base.* FROM 'utilisateur'@'hôte'; -- une seule permission
 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'utilisateur'@'hôte'; -- toutes les permissions

 SET PASSWORD = PASSWORD('nouveau_pass')
 SET PASSWORD FOR 'utilisateur'@'hôte' = PASSWORD('nouveau_pass')
 SET PASSWORD = OLD_PASSWORD('nouveau_pass')

 DROP USER 'utilisateur'@'hôte'

Types de données principaux[modifier | modifier le wikicode]

Voici les valeurs acceptées avant débordement[2] :

 TINYINT (1o : -127+128)
 SMALLINT (2o : +-65 000)
 MEDIUMINT (3o : +-16 000 000)
 INT (4o : +- 2 000 000 000) 
 BIGINT (8o : +- 9 trillions)
   Intervalle précis : -(2^(8*N-1)) -> (2^8*N)-1
   /!\ INT(2) = "2 chiffres affichés" -- ET NON PAS "nombre à 2 chiffres"

FLOAT(M,D) DOUBLE(M,D) FLOAT(D=0->53) 
   /!\ 8,3 -> 12345,678 -- PAS 12345678,123!

TIME (HH:MM) 
YEAR (AAAA) 
DATE (AAAA-MM-JJ) 
DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999)
TIMESTAMP (comme date, mais 1970->2038, compatible Unix)

VARCHAR(ligne) 
TEXT (multi-lignes; taille max=65535) 
BLOB (binaire; taille max=65535)

Variantes : 
TINY (max=255) 
MEDIUM (max=~16000) 
LONG (max=4Go)
   Ex : TINYTEXT, LONGBLOB, MEDIUMTEXT

ENUM ('valeur1', 'valeur2', ...) -- (default NULL, ou '' si NOT NULL)
link={{{link}}}Attention !

Il faut préférer DECIMAL(10,2) à FLOAT car ce dernier peut se révéler imprécis. Ex : 39.99 x 1 = 39.9900016784668.

Oubli de mot de passe oublié[modifier | modifier le wikicode]

 $ service mysql stop
 $ mysqld_safe --skip-grant-MaTables
 > UPDATE mysql.user SET password=PASSWORD('nouveau') WHERE user='root';
 ## Tuer mysqld_safe, avec Control + \
 $ service mysql start

Réparer les tables après un arrêt soudain[modifier | modifier le wikicode]

mysqlcheck --all-databases
mysqlcheck --all-databases --fast

Relancer la synchronisation de la base du serveur secondaire[modifier | modifier le wikicode]

 $ mysql
 mysql> slave start;
 mysql> show slave status\G

Manipuler des variables[modifier | modifier le wikicode]

Les définitions sont effectuées à l'aide des mots clés "select" (suivi de ":=") ou "set" (avec "=") :

 SELECT @test := 2;
 SELECT @test + 1
 
 SET @date1='date une', @date1='date deux'

Pour les afficher ensuite :

 show variables like 'test';
 show variables like 'date1';
 show variables like 'date2';

Certaines variables globales représentent la configuration du système, et peuvent être changées provisoirement le temps d'une session, ou de façon permanente :

 mysql> set @@global.max_connections = 1000;
 mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 60 |
+---------------+-------+
1 row in set (0.00 sec)
 mysql> set @@session.wait_timeout=120;
link={{{link}}}Attention !

En cas de conversion de dates au format Text en Datetime, cela les efface toutes à 0000-00-00 00:00:00

Références[modifier | modifier le wikicode]