AIDE-MÉMOIRE MINIMAL DU LANGAGE SQL DE MYSQL



Documents pareils
Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Olivier Mondet

Le Langage De Description De Données(LDD)

Création et Gestion des tables

Pour les débutants. langage de définition des données

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Bases de Données relationnelles et leurs systèmes de Gestion

PHP 5. La base de données MySql. A. Belaïd 1

1/ Présentation de SQL Server :

TP3 : Creation de tables 1 seance

Les BASES de DONNEES dans WampServer

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

CREATION WEB DYNAMIQUE

MySQL / SQL EXEMPLES

Langage SQL : créer et interroger une base

Cours: Administration d'une Base de Données

Le langage SQL (première partie) c Olivier Caron

Bases de données relationnelles

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

WEB DEVELOPER SGBD SYSTEME DE GESTION DE BASES DE DONNEES L étudiant sera capable :

Bible MySQL! La première version de MySQL est apparue en Cette première version est créée pour un usage personnel à partir de msql.

Historisation des données

I. MySQL : Serveur et SGBD

Stockage du fichier dans une table mysql:

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

Bases de données relationnelles & SQL

Le Langage SQL version Oracle

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Optimisations des SGBDR. Étude de cas : MySQL

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

SQL Historique

Ecole Industrielle et Commerciale de la ville de Namur. Structure et application des bases de données. Y. Mine

Introduction au Système de Gestion de Base de Données et aux Base de Données

FileMaker 13. Guide de référence SQL

Notes de cours : bases de données distribuées et repliquées

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Introduction à JDBC. Accès aux bases de données en Java

Exercices sur SQL server 2000

Auto-évaluation Oracle: cours de base

Partie 0 : Gestion des tablespace et des utilisateurs... 3

I4 : Bases de Données

Introduction aux Bases de Données 2004/2005

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

Modélisation et Gestion des bases de données avec mysql workbench

Gestion des utilisateurs et de leurs droits

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Gestion de base de données

Les chaînes de caractères

Bases de données et sites WEB

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

LES TYPES DE DONNÉES DU LANGAGE PASCAL

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Cours Bases de données 2ème année IUT

TP Contraintes - Triggers

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Compétences Business Objects

Optimisation de MySQL

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

OpenPaaS Le réseau social d'entreprise

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Ora2Pg Performances. (C) 2013 Gilles Darold

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Application web de gestion de comptes en banques

Créer une base de données

420-PK6-SL Banques de données Avancées UTILISATEURS

Informatique Générale

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Mejdi BLAGHGI & Anis ASSÈS

Manuel de référence réduit de mysql (version 4.1.1) + "The MySQL C API" par Paul Dubois Licence Professionnelle Réseaux et Télécommunications Option

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Les bases de données

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Présentation du module Base de données spatio-temporelles

LE LANGAGE SQL2 1. INTRODUCTION

1. Base de données SQLite

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Traitement de texte : Quelques rappels de quelques notions de base

Mysql. Les requêtes préparées Prepared statements

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

Intégrité sémantique dans les bases de données relationnelles

Algorithmique et Programmation, IMA

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

MODE OPERATOIRE OPENOFFICE BASE

SOMMAIRE. Travailler avec les requêtes... 3

Intégrité des données

Table des matières 1 DISASTER RECOVERY SAUVEGARDER RESTAURER BASE DE DONNÉS "SUSPECT"... 28

A QUOI SERVENT LES BASES DE DONNÉES?

Bases de données Cours 4 : Le langage SQL pour ORACLE

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

SQL Server 2000, Analysis Services et DTS

Transcription:

AIDE-MÉMOIRE MINIMAL DU LANGAGE SQL DE MYSQL Michel Cartereau, 10 avril 2013 Ce document présente l'essentiel à connaître afin d'utiliser le langage SQL (structured query language) au sein du système de gestion de bases de données (SGBD) MySQL dans sa version 5.1. L'accent est mis sur la compatibilité avec la norme SQL dans sa version SQL 2 de 1992, avec quelques compléments sur la norme SQL 3 de 1999. I - LE LANGAGE SQL DE MYSQL Cette présentation du langage SQL comprend en premier les règles générales d'écriture, puis détaille les instructions pour chaque grande classe de manipulations. Cette présentation est focalisée sur les principales manipulations (création, mise à jour et interrogation d'une base). Il n'est pas abordé certains aspects plus avancés de SQL, dont notamment la gestion des droits (privileges), les transactions, les assertions, les déclencheurs (triggers) et les procédures. I.1 SYNTAXE GÉNÉRALE Cette section précise les règles générales d'écriture dans le langage SQL. I.1.1 IDENTIFICATEUR Un nom ou «identificateur» (désignation de base, table, champ, etc.) est constitué de lettres, chiffres ou trait de souligné («_») tout en commençant par une lettre. Il n'y a pas a priori différenciation des lettres minuscules et majuscules (CODE, Code, code identiques). Exemples : coop detail QSTOCK code_postal type1mobilier Contre-exemples : _coop 2N net&euro H-T h.t type1 Mobilier t_réf - Il est fortement conseillé d'éviter les lettres accentuées, tout signe diacritique (cédille etc.) et bien sûr proscrire les espaces au sein des noms. - La taille maximale est fixée à 64 caractères dans MySQL et 128 par la norme SQL. Cependant, on n'utilise généralement pas plus de 30 caractères afin de garantir une compatibilité entre différents SGBD. De plus dans MySQL, les noms de bases et de tables correspondent à des fichiers et donc il faut être très prudent sur leur nommage (taille réduite, ni espaces ni lettres accentuées ni ponctuation). - Il est possible de délimiter un nom par l'ajout d'un accent grave («`») au-début et à la fin. Ce mécanisme sert dans des cas particuliers où le nom correspond à un mot-clef du langage SQL, ou quand un nom a été défini sans respecter les règles, ou aussi pour imposer la casse des lettres (différenciation des lettres minuscules et majuscules). La norme SQL utilise à cet effet le guillemet («"»). I.1.2 MOT-CLEF Un mot-clef est un nom défini dans le langage SQL. Il n'y a pas de différenciation des lettres minuscules et majuscules. La plupart des mots-clefs sont réservés à SQL, c'est-à-dire qu'il n'est pas possible de les réutiliser comme identificateur. Une liste de ces mots-réservés figure en annexe (cf. II.5). Exemples : create option null NULL Null I.1.3 NOTATION DE CHAÎNES DE CARACTÈRES Une chaîne de caractères correspond à un morceau de texte noté entre apostrophes («'»). Exemples : '01530' 'Carotte Du JARDIN' 'Gaia d''agroparistech' 'Švejk' - Une véritable apostrophe au sein du texte se note dédoublée («''», et non pas par un guillemet «"»). - L'alphabet utilisable dans le texte se définit lors de la création de la base ; c'est généralement l'alphabet universel Unicode codé sur un octet («utf8» ou «utf-8»). Il est possible d'indiquer un alphabet particulier en préfixant la chaîne par un trait de souligné («_») suivi de son nom, ou de la faire suivre par le mot-clef collate suivi du nom de l'aphabet. MySQL utilise la notation simplifiée au préfixe «N» définie dans la norme SQL comme équivalent de l'alphabet Unicode. Exemples : _latin1'été' 'été' collate latin1 N'Švejk' - Une chaîne longue peut aussi être découpée en plusieurs morceaux : il suffit de noter chaque morceau entre apostrophes et de les séparer par un ou plusieurs espaces, retours à la ligne ou commentaires. - MySQL permet aussi d'utiliser le guillemet («"») comme délimitateur du texte mais il est déconseillé de Aide-mémoire minimal de SQL dans MySQL - Page 1

l'utiliser car hors norme SQL ainsi que les notations spécifiques à MySQL pour quelques caractères particuliers au sein d'une chaîne : «\'» pour une apostrophe, «\"» pour un guillemet, «\\» pour une contre-oblique, «\b» pour un retour-en-arrière (code ASCII n 8 «BS»), «\t» pour une tabulation (code ASCII n 9 «HT»), «\r» pour un retour-en-début-de-ligne (code ASCII n 10 «LF») et «\n» pour un passage-à-la-ligne (code ASCII n 13 «CR»). I.1.4 NOTATION DE VALEURS NUMÉRIQUES Les valeurs numériques correspondent essentiellement à des nombres entiers ou réels. Il est possible d'utiliser la notation scientifique à puissance de dix en préfixant l'exposant par «E» ou «e». Exemples : 32767-9 3.14159.33-0.8E3 1.7e-7 - Selon le type utilisé pour représenter la donnée, des valeurs maximales et minimales sont définies, ainsi qu'une précision (cf. I.3.1.1). - Attention aux intervalles de valeurs possibles définis selon chacun des types numériques car une valeur trop grande peut dans certains cas être silencieusement transformée en une toute autre valeur. I.1.5 NOTATION DE VALEURS TEMPORELLES Les informations temporelles comprennent la date, l'heure, une horodate et aussi une durée. Une date se note comme un texte préfixé par le mot-clef date, en utilisant la notation internationale «année-mois-jour» où l'année est indiquée sur 4 chiffres, le mois et le jour sur 1 ou 2 chiffres, tous séparés par un trait d'union («-»). Une heure se note comme un texte préfixé par le mot-clef time, en utilisant la notation internationale «heure:minutes:secondes» où l'heure est comprise entre 0 et 23, et les secondes éventuellement notées avec une partie décimale introduite par un point («.») pour exprimer des fractions de seconde. Heure, minutes et secondes sont séparées par un deux-points («:»). Il est possible de combiner une date avec une heure en une horodate (timestamp) ; elle se note comme un texte préfixé par le mot-clef timestamp, contenant la date puis l'heure séparées par une espace. Une durée se note sous la forme générale : interval 'durée' unité où la durée est indiquée abrégée ou selon les notations précédentes, et où l'unité est au choix : second, minute, hour, day, month, ou year. Il est possible d'exprimer une durée remontant dans le temps : interval - 'durée' unité Exemples : date '2011-11-09' date '2001-9-11' time '12:00:00' time'0:5:12.25' timestamp '2011-11-09 12:00:00' timestamp '2001-9-11 0:5:12.25' interval '3' day interval '8:30' hour interval - '6' month - Dans la norme SQL, une date doit être valide relativement au calendrier grégorien ; autrement dit, les jour, mois et année ne peuvent pas valoir zéro et une date comme '2011-11-31' est invalide. MySQL permet d'utiliser la valeur '0000-00-00' comme valeur manquante en place de la notation null dans certains cas (selon l'option SQL NO_ZERO_DATE, cf. II.6.2), mais cela est déconseillé car hors norme. - Dans certaines expressions, MySQL reconnaît une date même quand sa notation ne respecte pas les modèles ci-dessus (par exemple sans mot-clef en préfixe ou sans séparateur). En outre, une année notée avec seulement deux chiffres est classée par MySQL comme suit : dans le 21 ème siècle (2000) si comprise en 00 et 69, le 20 ème siècle (1900) sinon entre 70 et 99. Ces notations sont cependant déconseillées car hors norme. - De même qu'une date, MySQL reconnaît une heure même quand sa notation ne respecte pas les modèles ci-dessus (par exemple sans mot-clef en préfixe ou sans séparateur). En outre, une heure notée de manière incomplète est interprétée différemment par MySQL selon les cas ; par exemple : '10:45' correspond à 10 h 45 mn tandis que '1045' à 10 mn 45 s. Ces notations sont cependant déconseillées car hors norme. - MySQL reconnaît mais ignore les fractions de seconde. - La norme SQL permet de préciser le fuseau horaire (time zone) mais cela n'est pas possible dans MySQL. I.1.6 NOTATION DE VALEURS BINAIRES ET LOGIQUES Une valeur logique correspond à true ou false (introduites en SQL 1999). Une valeur binaire se note sous la forme d'une suite de bits notée comme du texte et immédiatement préfixée par «B». Il est aussi Aide-mémoire minimal de SQL dans MySQL - Page 2

possible d'utiliser une notation similaire en hexadécimal avec le préfixe «X». Exemples : true False FALSE B'11111010' X'FA' - Comme tout mot-clef, les valeurs true et false s'écrivent indifféremment en minuscules ou majuscules. - Les valeurs binaires sont de fait en voie d'abandon (disparition dans la norme SQL 2003). I.1.7 NOTATION DE VALEUR MANQUANTE L'absence de valeur se note par le mot-clef «null». - Comme tout mot-clef, il n'y a pas de différenciation des lettres minuscules et majuscules («NULL», «Null», «null» etc. identiques). - Ne pas confondre avec une valeur nulle comme zéro («0») pour un nombre, ou la chaîne vide («''»). - MySQL autorise la notation synonyme «\N» (en majuscule) mais cela est déconseillé car hors norme. I.1.8 INSTRUCTION Une instruction dans le langage SQL s'écrit sur une ou plusieurs lignes. Il est possible d'ajouter espaces ou retours à la ligne dans la notation afin de l'aérer, voire d'y insérer des commentaires. Exemples : select count(nom) from personne -- nombre total de personnes select NOM, NCOM from client, commande where client.ncli = commande.ncli Remarque : - Dans le cas où une instruction figure avec d'autres dans un programme écrit en SQL, il faut alors la terminer par un point-virgule («;»). - Ne pas hésiter à répartir une instruction longue sur plusieurs lignes car cela facilite la lecture et permet de détecter plus facilement des erreurs. I.1.9 COMMENTAIRE Un commentaire sert à placer du texte libre dans une instruction. il se note par deux tirets («--») suivi d'aumoins une espace puis du texte libre jusqu'à la fin de la ligne. Exemple : -- Fait par Michel Cartereau en XI 2011 - Dans le cas d'un commentaire long s'étalant sur plusieurs lignes, il faut répéter le double-tiret à chaque ligne. Cependant MySQL permet d'entourer le texte d'un commentaire long entre les symboles «/*» et «*/» au lieu d'utiliser le double-tiret, mais ceci n'a été normalisé que dans la version 1999 de SQL. - La norme SQL n'impose pas une espace immédiatement après les tirets. - MySQL permet aussi de préfixer une ligne de commentaire par un dièse («#») mais ceci est fortement déconseillé car hors norme SQL. Aide-mémoire minimal de SQL dans MySQL - Page 3

I.2 MANIPULATIONS D'UNE BASE Voici la présentation des instructions permettant de manipuler une base regroupant des tables de données, correspondant de manière simplifiée à un «schéma» dans la norme SQL. I.2.1 CRÉATION D'UNE BASE : CREATE SCHEMA OU CREATE DATABASE Syntaxe simplifiée : create schema nom option ou create database nom option avec comme option : default character set alphabet Exemples : create database client_commande create schema coop default character set latin1 - La norme SQL ne reconnaît que le mot-clef schema et non pas database. - Le nom de la base correspond en fait à un dossier créé par MySQL dans l'espace de stockage. Il faut donc être très prudent lors du choix de ce nom. - Le mot-clef default est en fait facultatif. - Il existe une instruction spécifique à MySQL permettant d'obtenir l'instruction de création à réutiliser pour une base existante : show create database nom ou show create schema nom - MySQL possède des variantes spécifiques, hors norme SQL, de cette instruction create : i. Option supplémentaire du mode d'interclassement (cf. II.2) : default collate interclassement ii. Dans les options, mot-clef default facultatif, et possibilité d'introduction du signe égal («=») avant la valeur de l'alphabet (cf. II.2) ou de l'interclassement ; exemple : character set = latin1 iii. Condition optionnelle de non existence préalable à la création de la base placée juste avant le nom ; exemple : create database if not exists coop I.2.2 SUPPRESSION D'UNE BASE : DROP SCHEMA OU DROP DATABASE Syntaxe simplifiée : drop schema nom Exemples : drop schema client_commande drop database coop ou drop database nom - La norme SQL ne reconnaît que le mot-clef schema et non pas database. Elle impose aussi la présence d'un mot-clef, placé après le nom de la base, conditionnant la suppression : restrict imposant que le schéma soit complétement vide ou cascade provoquant la suppression de ses objets (tables etc.). MySQL supprime automatiquement tout le contenu de la table. - MySQL possède une option spécifique, hors norme SQL : condition optionnelle d'existence préalable à la suppression de la base, placée juste avant le nom ; exemple : drop database if exists coop I.2.3 AUTRE OPÉRATION SUR UNE BASE SPÉCIFIQUE À MYSQL : ALTER SCHEMA OU ALTER DATABASE Retouche d'une base: alter schema nom retouche ou alter database nom retouche avec comme retouches : default character set alphabet et-ou default collate interclassement Exemple : alter database coop default collate latin1_general_ci - Cette instruction n'existe pas dans la norme SQL. - Le mot-clef default est en fait facultatif. Aide-mémoire minimal de SQL dans MySQL - Page 4

I.3 MANIPULATIONS D'UNE TABLE Voici la présentation des instructions permettant de manipuler une table de données dans une base. Elle est incomplète car elle n'aborde pas notamment certains aspects avancés de SQL : le mode transactionnel (set transaction, commit, rollback), les assertions (create assertion), les tables temporaires (create table... temporary) ainsi que la création d'index spécifique à MySQL (create index). I.3.1 TYPES DE DONNÉES Les types de données se regroupent dans les familles suivantes : valeurs numériques, chaînes de caractères, valeurs temporelles ou valeurs binaires. MySQL ne gère pas les types personalisés de valeurs (domain) définis dans la norme SQL. Voici un sommaire de ces types de données : Famille Norme SQL Spécifique à MySQL numérique chaîne de caractère int, integer, smallint, bigint decimal, dec, numeric float, double precision, real character, char, national chararacter, nchar character varying, char varying, varchar, national character varying character large object, char large object, clob smallint fixed enum, set, binary varbinary temporel date, time, timestamp datetime binaire et logique binary large object, blob boolean longtext, mediumtext, text, tinytext longblob, mediumblob, tinyblob I.3.1.1 TYPES DE VALEURS NUMÉRIQUES Les types de valeurs numériques se répartissent dans deux catégories selon que la conservation de la valeur est garantie au chiffre près ou non. La première catégorie, à valeur exacte, correspond aux nombres entiers sans partie décimale et au nombres décimaux avec une quantité limitée de chiffres après la virgule (typiquement des valeurs financières où la précision doit être garantie au centime près). La seconde à valeur approchée, recouvre des nombres réels à usage scientifique où la précision est garantie pour une certaine quantité de chiffres quelle que soit l'amplitude des valeurs (très grandes ou très petites, généralement notées en puissance de dix) et pour lesquels les calculs sont effectués plus rapidement. Les différentes notations d'une valeur numérique sont indiquées en I.1.4. a) Types de nombres entiers - Nombre entier ordinaire : integer ou int - Petit nombre entier : smallint - Grand nombre entier (SQL 2003) : bigint Exemples : numero integer age smallint - Il existe aussi dans MySQL un type pour des nombres entiers très petits, codés sur un octet et de valeur comprise entre - 127 et 128 : tinyint ; cela n'est pas dans la norme SQL. - Dans MySQL, les caractéristiques numériques de ces différents types sont les suivantes : Type Intervalle Nombre d'octets int - 2 147 483 648 à 2 147 483 647 ( ± 2 31 ) 4 smallint - 32 768 à 32 767 ( ± 2 15 ) 2 bigint ± 9,2 miliards de milliards ( ± 2 63 ) 8 tinyint - 127 à 128 1 - MySQL permet d'indiquer une quantité maximale de chiffres au sein de la définition d'un nombre entier : type entier (quantité de chiffres) ; cependant, cela n'est pas dans la norme SQL, et ne concerne que l'affichage et pas le stockage de la valeur ; exemple : int(11) - MySQL offre aussi la possibilité de définir un entier sans signe selon la notation : type entier unsigned ; Aide-mémoire minimal de SQL dans MySQL - Page 5

la plage des valeurs s'étend alors de zéro au double de la valeur maximale du type, incrémenté de un ; exemple : int unsigned pour un intervalle de 0 à 4 294 967 295 (2 x 2 147 483 647 + 1) ; cela n'est pas dans la norme SQL. b) Type de nombres décimaux exacts - Nombre décimal (fixed-point type) : decimal(précision, décimales) ou dec(précision, décimales) avec Indication de la quantité maximale de chiffres (précision) dont ceux après la virgule décimale (décimales) Exemples : prix decimal(7,2) taux dec(5,4) - La précision maximale s'élève à 64 chiffres dans MySQL. La quantité de chiffres situés après la virgule ne peut pas évidemment dépasser celle des chiffres de la précision. Quand une valeur contenant plus de chiffres après la virgule que ceux du type de la colonne est stockée, il survient alors une approximation généralement réalisée par élimination des chiffres en trop. - En fait, l'indication de la quantité de décimales est facultative mais cela correspond alors à une quantité nulle et de fait revient à un nombre entier sans chiffre après la virgule ; exemple : dec(11) - MySQL propose le synonyme fixed pour decimal mais cela n'est pas dans la norme SQL. - La norme SQL définit un autre type de nombre décimal, numeric, quasiment similaire au type decimal ; il est aussi disponible dans MySQL mais il n'y a pas de différence entre les deux. c) Types de nombres réels scientifiques - Nombre réel ordinaire : float - Nombre réel à double précision : double precision Exemples : coefficient float mesure double precision - Dans MySQL, les caractéristiques de ces différents types (floating-point type) sont les suivantes : Type Précision Etendue Nombre d'octets float 10-7 10 ±38 4 double precision 10-16 10 ±308 8 - Il existe aussi le type real synonyme dans MySQL de double precision ; ce type existe dans la norme SQL mais celle-ci ne spécifie pas sa précision. - MySQL offre la possibilité d'indiquer la quantité maximale de chiffres dont ceux situés après la virgule décimale afin de mettre en forme l'affichage du nombre (et incidemment arrondir les valeurs) ; cela n'est pas en fait dans la norme SQL qui autorise seulement l'indication d'une précision (en chiffres binaires). I.3.1.2 TYPES DE CHAÎNES DE CARACTÈRES - Texte à taille fixe : character(taille) ou char(taille) - Texte réduit à un seul caractère : character(1) ou char(1) ou character ou char - Texte à taille variable : character varying(taille) ou char varying(taille) ou varchar(taille) Exemples : code char(3) nom varchar(40) - Les différentes notations d'une chaîne de caractères sont indiquées en I.1.3. - Caractéristiques dans MySQL des différents types de chaînes de caractères (string type) : Type Taille maximale * Particularités char 255 remplissage complété à droite par des espaces mais élimination de ces espaces lors de l'extraction de la valeur (en fait cela dépend de l'option SQL PAD_CHAR_TO_FULL_LENGTH de MySQL, cf II.6) varchar 65 535 depuis la version 5.0 de MySQL, les espaces initiaux et finaux sont conservés lors du stockage de la valeur * : en fait, il s'agit de la taille maximale exprimée en octets pour la représentation en mémoire ; selon l'alphabet utilisé (cf. II.2), un caractère de texte peut occuper un ou plusieurs octets ; de plus, dans le cas du type varchar, un à deux octets sont réservés pour représenter la taille réelle de la chaîne. Aide-mémoire minimal de SQL dans MySQL - Page 6

La prise en compte des espaces initiaux et finaux variant selon les types, il est sage de les éliminer systématiquement dès la saisie de texte. Par ailleurs, dans le cas où une valeur est trop longue par rapport à la taille maximale de la colonne, il survient une anomalie ou un avertissement lors du remplissage de la colonne (sauf s'il s'agit d'espaces et d'une colonne de texte à taille fixe). - Dans le cas d'un jeu limité de valeurs, MySQL propose deux types supplémentaires hors norme SQL : 1. Valeur parmi une liste de possibilités : enum(liste) La colonne peut uniquement prendre une seule des valeurs énumérées dans la liste indiquée sous la forme des libellés possibles séparés par une virgule («,») et au nombre maximal de 65 535. Exemple : direction enum('nord','est','sud','ouest') et la valeur 'nord' 2. Ensemble de valeurs prédéfinies : set(liste) La colonne peut uniquement prendre une ou plusieurs des valeurs énumérées dans la liste indiquée sous la forme des textes de chaque libellé possible séparés par une virgule («,», 64 au maximum). Une valeur multiple est codée par un texte regroupant les libellés séparés par une virgule sans espaces autour ; lors du remplissage de la colonne, les répétitions sont éliminées et les libellés multiples rangés selon l'ordre de la définition dans la liste. Exemple : accessoires set('rétroviseur','panier','sacoches','compteur') la valeur 'sacoches,panier,compteur,panier' devient 'panier,sacoches,compteur' - Il existe dans MySQL la possibilité de manipuler des textes très grands (jusqu'à plusieurs giga-octets) sur le modèle du type character large object ou char large object ou clob introduit dans la norme SQL 1999 : il s'agit des types longtext (taille maximale 4,3 milliard caractères), mediumtext ( 16,7 millions), text (65 535) et tinytext (255) ; au-delà des capacités augmentées, la principale différence avec le type varchar consiste en un stockage indépendant de celui de la table. - MySQL permet aussi de manipuler des chaînes de caractères sous forme d'octets binaires sans considération d'alphabet ; cela se concrétise par les types binary et varbinary, équivalents à char et varchar ; cela n'est pas dans la norme SQL. - Il est possible de préciser un alphabet (cf. II.2) particulier en l'indiquant à la fin de la définition du type par : character set alphabet ; exemple : nom varchar(40) character set utf8 - La norme SQL (1992 et 1999) définit aussi une variante dite «national» des types de chaînes de caractères avec un alphabet prédéfini : national chararacter ou nchar, national character varying ou nchar varying, national character large object ou nclob ; les deux premières paires existent dans MySQL et correspondent à l'alphabet Unicode («utf8»). I.3.1.3 TYPES DE VALEURS TEMPORELLES - Date (AAAA-MM-JJ) : date - Heure (HH:MM:SS) : time - Horodate (AAA-MM-JJ HH:MM:SS) : timestamp Exemples : anniversaire date passage timestamp - Les dates et heures se notent selon la notation internationale et leurs valeurs doivent correspondre à la réalité et respecter le calendrier grégorien (cf. I.1.5). - La norme SQL permet de manipuler les fractions de seconde avec un nombre maximal de chiffres décimaux indiqué lors de la définition des types time(précision)et timestamp(précision) mais pas MySQL (5.1) ; de même, l'indication d'un fuseau horaire est possible dans SQL, mais pas dans MySQL (5.1), avec les types suivants : time with time zone et timestamp with time zone. - Attention aux horodates en MySQL : le type timestamp peut dans certains cas comporter un mécanisme de mise à jour automatique de la colonne avec les date et heure courantes ; afin d'éviter cela, MySQL dispose du type équivalent datetime. Par ailleurs, une horodate ne peut pas être antérieure à l'année 1970, bien que cela soit possible pour une simple date. - MySQL ne dispose pas du type interval défini dans SQL pour représenter des durées ; cependant, il est tout à fait possible d'utiliser une valeur représentant une durée (cf. I.1.5). Aide-mémoire minimal de SQL dans MySQL - Page 7

I.3.1.4 TYPES DE VALEURS BINAIRES ET LOGIQUES - Suite de bits de taille fixe : bit(taille) - Bit unique : bit - Valeur logique (SQL 1999) : boolean - Suite d'un grand nombre d'octets (SQL 1999) : binary large object ou blob Exemples : image blob jeune boolean - Dans MySQL, la taille maximale d'une suite de bits est fixée à 64. La norme SQL définit aussi le type bit varying pour une suite de bits à taille variable, qui n'existe pas tel que dans MySQL mais sous la forme d'une suite d'octets à taille variable : varbinary. En fait, les types bit et bit varying se sont avérés peu utilisés et ils ont disparu dans la norme SQL 2003. - MySQL représente en fait une valeur logique comme un entier codé sur un octet (tinyint), avec les valeurs true et false associées respectivement à 1 et 0 ; la norme SQL 1999 indique seulement que la valeur true est plus grande que false (sans fixer de valeur numérique).. - MySQL décline le type blob en plusieurs variantes selon la taille maximale d'octets : types longblob ( 4,3 milliard), mediumblob ( 16,7 millions), blob (65 535) et tinyblob (255) ; contrairement aux types équivalents longtext, mediumtext, text et tinytext, aucun alphabet n'est associé ici en cas de stockage de texte car les valeurs sont considérées sous leur simple forme binaire. La norme SQL permet de fixer la taille en indiquant une valeur entre parenthèses, éventuellement exprimée avec un suffixe pour des kilo-octets («K»),des méga-octets («M») ou des giga-octets («G») : blob(taille) ; MySQL reconnaît partiellement cette indication de taille en choisissant automatiquement sa variante correspondante du type blob, mais il ne reconnaît pas les suffixes d'unités. I.3.2 DÉFINITION DE CLEF La définition de clef s'applique au cas de la clef primaire, d'une clef secondaire ou d'une clef étrangère. Elle se définit sous la forme d'une contrainte de table ou de colonne. Un index est associé à chaque type de clef dans MySQL, automatiquement ou manuellement. I.3.2.1 CLEF PRIMAIRE Toute table doit normalement posséder une clef primaire, indiquée : - soit sous la forme d'une contrainte de table, syntaxe : primary key(colonne ou liste de colonnes) - soit à l'intérieur de la définition d'une colonne (quand elle forme la clef à elle tout seule) : primary key Exemples : primary key (ncli) primary key (genre, espece) numero integer not null primary key - La clef primaire est unique dans une table mais elle peut porter sur une ou plusieurs de ses colonnes. - Le(s) colonne(s) d'une clef primaire possède(nt) toujours une valeur unique ; autrement dit, il ne peut pas y avoir de valeur manquante (not null) et de doublons. - MySQL autorise une notation simplifiée à l'intérieur de la définition d'une colonne, hors norme : key. Par ailleurs, MySQL y associe automatiquement un index baptisé avec le nom PRIMARY. I.3.2.2 CLEF SECONDAIRE Une table peut comporter une ou plusieurs clefs secondaires, aussi appelées candidates, subrogées, alternées ou de rechange ; une telle clef se note : - soit sous la forme d'une contrainte de table, syntaxe : unique (colonne ou liste de colonnes) - soit à l'intérieur de la définition d'une colonne (quand elle forme la clef à elle toute seule) : unique Exemples : unique (courriel) unique (entrepot, num_inventaire) nom varchar(40) unique Aide-mémoire minimal de SQL dans MySQL - Page 8

- Il peut y avoir absence de valeur (null) dans le(s) colonne(s) d'une clef secondaire mais pas de doublons. - MySQL associe automatiquement à la clef secondaire un index baptisé avec le nom de la colonne (ou de la première dans le cas d'une clef sur plusieurs colonnes). I.3.2.3 CLEF ÉTRANGÈRE Une contrainte d'intégrité référentielle, sur la table liée à une table de référence, se traduit par la définition d'une clef étrangère : - sous la forme d'une contrainte de table, syntaxe : foreign key (colonne ou liste de colonnes) references table de référence (colonne de référence) options avec en option une ou plusieurs clauses associées à l'application de l'intégrité référentielle : - cas d'opération de modification (update) dans la table de référence : on update action - cas d'opération de suppression (delete) dans la table de référence : on delete action - action vaut l'une des valeurs suivantes : no action : l'opération est refusée (en fin de transaction) restrict : variante du cas précédent où l'opération est aussi refusée, mais immédiatement et non pas en fin de transaction (cas introduit dans la norme SQL 1999), cascade : l'opération est répercutée dans la table liée par la suppression ou la mise à jour des enregistrements liés à ceux de la table de référence concernés par l'opération, set null : annulation du lien par suppression de(s) valeur(s) de clef étrangère dans la table liée set default : remplacement de(s) valeur(s) de clef étrangère dans la table liée par la valeur par défaut d'indication respective à chaque colonne concernée. Exemple : foreign key(acheteur) references personne(numero) on delete cascade - Attention! MySQL (5.1) ne gère l'intégrité référentielle que dans le cas du moteur de stockage InnoDB avec certaines contraintes et limitations ; ainsi, les colonnes des clefs étrangères doivent être indexées (voir en I.3.3.2 ; les autres limitations sont présentées ci-après). - Il peut y avoir absence de valeur (null) dans le(s) colonne(s) d'une clef secondaire. - En l'absence d'indication d'une clause pour l'application de l'intégrité référentielle, il s'applique alors par défaut le refus d'opération (no action). - La norme SQL permet l'indication de clef étrangère au niveau de définition d'une colonne formant la clef à elle toute seule : foreign key references table de référence (colonne de référence) options mais MySQL (5.1) ne la reconnaît pas (même avec le moteur de stockage «InnoDB»). - La norme SQL contient une clause supplémentaire du mode de validation lors d'une nouvelle valeur ou d'une modification d'une clef étrangère composée de plusieurs colonnes ; celui-ci précise les conditions du déclenchement du contrôle d'intégrité référentielle lorsque il y a une ou plusieurs valeurs manquantes parmi les colonnes de la clef étrangère : match mode où mode vaut simple, partial ou full mode condition de déclenchement colonnes vérifiées simple toutes les colonnes ont une valeur toutes partial au-moins une colonne avec une valeur celles avec une valeur présente full au-moins une colonne avec une valeur toutes MySQL (5.1) autorise la présence de cette clause mais l'ignore en fait en appliquant le mode simple I.3.2.4 INDEX Dans MySQL un index est automatiquement associé à une clef primaire et une clef secondaire, mais il faut le gérer manuellement dans le cas d'une clef étrangère. A cet effet, il y est possible de créer un index : - soit sous la forme d'un élément de création de la table : index (colonne ou liste de colonnes) ou index nom d'index (colonne ou liste de colonnes) - soit par retouche de la table : alter table nom de table add index (colonne ou liste de colonnes) Aide-mémoire minimal de SQL dans MySQL - Page 9

ou alter table nom de table add index nom d'index (colonne ou liste de colonnes) - soit par une instruction spéciale : create index nom d'index on table(colonne ou liste de colonnes) Exemples : create table commande ( ncom char(4) not null primary key, ncli char(4) not null, datecom date, index (ncli), ncli foreign key references client (ncli) ) engine=innodb create index index_acheteur on vente(acheteur) alter table vente add index (acheteur) - Tout index est identifié dans MySQL par un nom. Celui d'une clef primaire s'appelle automatiquement PRIMARY, et celui d'une clef secondaire porte le nom de la colonne (ou la première) associée. Pour une index créé manuellement, le nom est facultatif dans le cas de définition via un élément de création de la table (c'est alors automatiquement le nom de la colonne, ou la première, associée). - Au sein de la spécification d'un index via un élément de création ou une retouche de table, le mot-clef index peut être remplacé par key. - MySQL permet de supprimer un index par les commandes : drop index nom d'index on table ou alter table nom de table drop index nom d'index - Il existe dans MySQL des options complémentaires de définition d'un index, non décrites ici. - La norme SQL ne spécifie pas les index. I.3.3 CRÉATION D'UNE TABLE : CREATE TABLE Syntaxe simplifiée : create table identification (liste des éléments de la table) La table est a priori identifiée par son simple nom, mais il est possible en cas d'ambiguité de préfixer son nom par celui de la base (ou schéma) en les séparant par un point («.») ; exemple : coop.personne La liste contient au-minimum les définitions des colonnes séparées par une virgule («,»). Il peut aussi y figurer des contraintes de table (définitions de clef). Exemples : create table client ( ncli char(4) not null, nom char(18) not null, adresse char(24) not null, localite char(20) not null, cat char(2) default null, compte decimal(9,2) not null, primary key (ncli) ) create table coop.personne ( numero integer primary key, nom varchar(40) not null, code_postal char(5) ) - Cette présentation est incomplète car elle n'aborde pas certains aspects avancés de SQL : les transactions (contrainte différée avec deferred) et les tables temporaires (create table... temporary). - MySQL ne gère pas les contraintes de vérification (check) définies dans la norme SQL ; par contre MySQL permet l'association d'un commentaire à la table (comment) mais cela est hors norme. - MySQL offre la variante suivante : create table if not exists identification (liste) qui n'effectue pas la création si une table de même nom existe déjà ; attention! cette variante est hors norme et de plus, ell ne vérifie pas que la structure de la table existante correspond celle décrite dans la commande. - MySQL permet de reconstituer une instruction de création à partir d'une table existante par la commande suivante (hors norme) : show create table nom ; exemple : show create table client. Il est Aide-mémoire minimal de SQL dans MySQL - Page 10

aussi possible d'obtenir une liste détaillée des colonnes avec leurs caractéristiques par des commandes spécifiques aussi hors norme : show columns from table ou describe table ; exemple : show columns from client ou describe client - Il est possible dans MySQL de spécifier à la fin de la commande le type de moteur de stockage (cf. II.4) utilisé sous la forme : engine=nom du moteur. Cela sert notamment à activer le moteur «InnoDB» afin de disposer d'un réel contrôle des intégrités référentielles ; exemple : create table commande ( ncom char(4) not null primary key, ncli char(4) not null, datecom date, index (ncli), ncli foreign key references client (ncli) ) engine=innodb I.3.3.1 DÉFINITION D'UNE COLONNE Une colonne est définie par son identificateur suivi du type de donnée : nom type Cette définition minimale peut être éventuellement complétée par une ou plusieurs des options suivantes dans l'ordre : la fixation de valeur par défaut, une contrainte de valeur ou une indication d'interclassement. MySQL permet l'association d'un commentaire à la colonne (comment) mais cela est hors norme. Fixation d'une valeur par défaut Option de fixation de la valeur stockée en absence d'indication à l'enregistrement : default valeur Exemples : code integer default 0 type char(1) default 'A' - Cette option figure immédiatement après le nom de la colonne dans sa définition. - La valeur peut être soit notée explicitement, soit une fonction temporelle ou d'identification de l'utilisateur, soit l'indication de valeur manquante (null). - Si la valeur par défaut n'est pas fixée, il est alors enregistré null dans la colonne en l'absence de valeur sauf dans le cas d'une colonne à incrémentation automatique (auto_increment, voir ci-après). Contrainte de valeur dans la définition d'une colonne - Contrainte de valeur obligatoire : not null - Contrainte d'absence de doublons : unique Exemples : nom_produit varchar(40) unique numero integer not null - Comme dans la norme SQL, il est possible d'attribuer un nom particulier à une contrainte en la préfixant par : constraint nom ; exemple : numero integer constraint verif_numero not null - La notation null désigne l'absence de valeur et non pas une valeur nulle (0) ; a priori toute colonne n'a pas obligatoirement une valeur. - La contrainte d'absence de doublons correspond à une clef secondaire (cf. I.3.2). - La norme SQL permet l'indication d'une contrainte d'intégrité référentielle pour une colonne formant la clef à elle toute seule : foreign key references table de référence (colonne de référence) options mais MySQL (5.1) l'ignore (même avec le moteur de stockage InnoDB). - La contrainte de validation existant dans la norme SQL est acceptée mais ignorée par MySQL (5.1) : check(condition) - MySQL fournit une contrainte d'incrémentation automatique, dans le cas d'une valeur numérique (entière ou réelle) : auto_increment. Lors de l'enregistrement MySQL attribue automatiquement un numéro d'ordre à la colonne) à partir du rang 1 et à la suite du dernier numéro utilisé si la valeur indiquée est vide (null) ; MySQL prend en compte aussi une valeur indiquée nulle (0) mais seulement si l'option NO_AUTO_VALUE_ON_ZERO n'est pas active. Cependant, dans la table, il ne peut y avoir qu'une seule colonne auto-incrémentée et celle-ci doit être indexée (typiquement c'est la clef primaire). Cela n'est pas dans la norme SQL. Aide-mémoire minimal de SQL dans MySQL - Page 11

Indication d'interclassement Option d'indication d'un interclassement (cf. II.2) pour un type de caractères : collate interclassement Exemple : reference varchar(30) character set ascii default '?' collate ascii_bin - Cette option figure à la fin de la définition de la colonne. - Si cette option est absente, il s'applique alors l'interclassement par défaut d'indication pour l' alphabet (si défini dans le type de données ou sinon au niveau de la base). I.3.3.2 CONTRAINTE DE TABLE - Définition de la clef primaire : primary key(colonne ou liste de colonnes) - Définition d'une clef secondaire : unique (colonne ou liste de colonnes) - Définition d'une clef étrangère : foreign key (colonne ou liste de colonnes) references table de référence (colonne de référence) options Exemples : primary key (genre, espece) unique (courriel) foreign key(acheteur) references personne(numero) on delete cascade - Comme dans la norme SQL, il est possible d'attribuer un nom particulier à une contrainte en la préfixant par : constraint nom ; exemple : constraint verif_courriel unique (courriel) - Les définitions de clefs sont présentées en détail à la partie I.3.2. - MySQL permet aussi de définir un index ; c'est obligatoire pour une clef étrangère mais hors norme : index options (colonne ou liste de colonnes) ou key options (colonne ou liste de colonnes) avec comme options un nom et-ou un type d'index (nons décrits ici). - La norme SQL permet de définir aussi une contrainte de validation (check) mais MySQL l'ignore. I.3.4 RETOUCHE D'UNE TABLE : ALTER TABLE Syntaxe simplifiée : alter table identification retouche de la table La table est a priori identifiée par son simple nom, mais il est possible en cas d'ambiguité de préfixer son nom par celui de la base (ou schéma) en les séparant par un point («.») ; exemple : coop.personne Une retouche de la table consiste soit en l'ajout ou la suppression d'une colonne, soit en l'ajout ou la suppression d'une contrainte de la table, soit en la modification de la valeur par défaut d'une colonne. Exemples : alter table client alter localite set default 'PARIS' alter table client add constraint unique (nom) alter table coop.personne add prenom varchar(40) alter table client drop column telephone cascade - MySQL permet d'indiquer une liste de retouches dans une seule instruction, séparées par une virgule à l'intérieur de parenthèses, mais cela est hors norme. - MySQL fournit aussi des possibilités de retouche d'index (cf. I.3.2.4) et d'autres non présentées ici et hors norme, notamment sur le nom, le type de donnée ou la position d'une colonne, les alphabets, les interclassements, le nom de la table. I.3.4.1 AJOUT D'UNE COLONNE Syntaxe : add column nom de colonne définition de la colonne ou add nom de colonne définition de la colonne Exemples : alter table client add column tel varchar(20) alter table coop.personne add prenom varchar(40) Remarque : MySQL permet d'indiquer une liste de noms et définitions de colonne dans une seule instruction, séparées par une virgule à l'intérieur de parenthèses, ainsi que de choisir la position de la colonne ; cela n'est pas dans la norme SQL. I.3.4.2 SUPPRESSION D'UNE COLONNE Syntaxe : drop column nom de colonne mode ou drop nom de colonne mode Aide-mémoire minimal de SQL dans MySQL - Page 12

et en MySQL : drop column nom de colonne ou drop nom de colonne où mode précise les modalités de la suppression vis-à-vis des références externes à cette table (contraintes d'intégrité référentielle, vues, etc.) : restrict imposant l'absence de références externes ou cascade provoquant la suppression de celles-ci. Exemple : alter table client drop column tel ou alter table client drop tel - MySQL ignore en fait le mode de suppression et permet de ne pas l'indiquer (hors norme). - On ne peut pas supprimer l'unique colonne d'une table. I.3.4.3 AJOUT D'UNE CONTRAINTE DE TABLE Syntaxe : add constraint nom contrainte de table ou add contrainte de table Exemples : alter table client add constraint verif_nom unique (nom) alter table coop.lot add primary key(numero) - Les contraintes de table sont présentées en détail à la partie I.3.3.2. - Le nom de contrainte est indispensable pour pouvoir la supprimer ultérieurement. I.3.4.4 SUPPRESSION D'UNE CONTRAINTE DE TABLE Syntaxe : drop constraint nom de contrainte mode et en MySQL : drop constraint nom de contrainte de table où mode précise les modalités de la suppression vis-à-vis des références externes à cette table (contraintes d'intégrité référentielle, vues, etc.) : restrict imposant l'absence de références externes ou cascade provoquant la suppression de celles-ci. Exemples : alter table client drop constraint verif_no cascade alter table coop.lot drop constraint verif_producteur - MySQL ignore en fait le mode de suppression et permet de ne pas l'indiquer (hors norme). - Les contraintes de table sont présentées en détail à la partie I.3.3.2. - Le nom de la contrainte doit avoir été attribué lors de sa création. I.3.4.5 MODIFICATION DE LA VALEUR PAR DÉFAUT Syntaxe : alter column nom de colonne set default valeur ou alter nom de colonne set default valeur Exemples : alter table client alter column localite set default 'PARIS' alter table coop.personne alter prenom set default '?' Remarque : MySQL permet aussi de supprimer une valeur par défaut précédemment définie, selon la notation suivante, hors norme : alter column nom de colonne drop default ; après l'opération, une nouvelle valeur par défaut s'applique selon le type de donnée de la colonne : null si possible, sinon zéro (0) pour un type numérique, la chaîne vide ('') pour du texte, etc. I.3.5 SUPPRESSION D'UNE TABLE : DROP TABLE Syntaxe simplifiée : drop table nom mode et en MySQL : drop table nom où mode précise les modalités de la suppression vis-à-vis des références externes à cette table (contraintes d'intégrité référentielle, vues, etc.) : restrict imposant l'absence de références externes ou cascade provoquant la suppression de celles-ci. Exemples : drop table client restrict drop table produit - MySQL ignore en fait le mode de suppression et permet de ne pas l'indiquer (hors norme). - MySQL possède une option spécifique, hors norme : condition optionnelle d'existence préalable à la suppression de la table, placée juste avant le nom ; exemple : drop table if exists produit Aide-mémoire minimal de SQL dans MySQL - Page 13

I.3.6 AUTRES OPÉRATIONS SUR UNE TABLE SPÉCIFIQUES À MYSQL : RENAME TABLE ET TRUNCATE TABLE MySQL fournit quelques instructions complémentaires de manipulations de table, hors norme : - Changement du nom : rename table nom actuel to nouveau nom - Suppression de tout le contenu : truncate table table ou truncate table Exemples : rename nouveaux_produits to produits_nouveaux truncate table coop.produit I.4 MANIPULATION D'UNE VUE Voici la présentation des instructions permettant de manipuler une vue sur les données (view). I.4.1 CRÉATION D'UNE VUE : CREATE VIEW Syntaxe simplifiée : create view nom de la vue as expression de recherche ou create view nom de la vue (colonne ou liste de colonnes) as expression de recherche La vue est a priori identifiée par son simple nom, mais il est possible en cas d'ambiguité de préfixer son nom par celui de la base (ou schéma) en les séparant par un point («.») ; exemple : coop.legumes La liste des colonnes contient les noms séparés par une virgule («,»). Une expression de recherche est décrite en I.5.4. Exemples : create view clients_riches as select ncli, nom from client where compte >= 10000 create view coop.legumes(nom_legume, prix_legume) as select nom, prix from produit where type = 'LEGUME' witch cascaded check option - L'instruction comporte une clause finale optionnelle qui vérifie la conformité d'une mise à jour d'une table sous-jacente au travers de la vue. Le contrôle vérifie que les nouvelles données correspondent bien à l'interrogation spécifique à la vue, soit seulement au niveau de cette vue (local), soit aussi pour toutes celles la réutilisant (cascaded) : with check local option ou witch cascaded check option ou équivalent au cas de cascaded : with check option - Si la liste des noms de colonnes de la vue est absente, MySQL prend en compte tous les noms des colonnes en résultat de l'interrogation mais cela est figé au moment de la création de la vue ; autrement dit, la vue peut devenir invalide si la structure d'une table impliquée dans la vue est modifiée après la création de cette vue. - L'expression de recherche ne peut pas contenir en MySQL une sous-recherche. - MySQL offre la possibilité de retrouver le texte de la création d'une vue existante via la commande hors norme show create view nom de la vue - MySQL propose des variantes hors norme de cette instruction, notamment : remplacement de la vue si préexistante (create or replace...), mode optionnel de prise en charge (algorithm = mode). I.4.2 SUPPRESSION D'UNE VUE : DROP VIEW Syntaxe simplifiée : drop view nom mode et en MySQL : drop view nom où mode précise les modalités de la suppression vis-à-vis des références externes à cette vue (contraintes d'intégrité référentielle, vues, etc.) : restrict imposant l'absence de références externes ou cascade provoquant la suppression de celles-ci. Exemples : drop view clients_riches restrict drop view coop.legumes - MySQL ignore en fait le mode de suppression et permet de ne pas l'indiquer (hors norme). - MySQL possède une option spécifique, hors norme SQL : condition optionnelle d'existence préalable à la suppression de la vue, placée juste avant le nom ; exemple : drop view if exists coop.legumes I.4.3 AUTRE OPÉRATION SUR UNE VUE SPÉCIFIQUE À MYSQL : ALTER VIEW Syntaxe simplifiée : alter view nom de la vue (colonne ou liste de colonnes) as interrogation Aide-mémoire minimal de SQL dans MySQL - Page 14

ou alter view nom de la vue as interrogation Exemples : alter view clients_riches as select ncli, nom from client where compte >= 5000 alter view coop.legumes(nom_legume, prix_legume) as select nom, prix from produit where type = 'LEGUME' and prix > 0 witch cascaded check option Remarque : cette instruction est similaire à celle de création de vue (create view) et plus particuièrement sa variante (create or replace view) ; elle est par ailleurs hors norme. I.5 MANIPULATIONS DE DONNÉES Cette section présente les principales instructions (ou «requêtes», request) de manipulations des données dans les tables d'une base : ajout, mise à jour, suppression et interrogation. La notion de table recouvre ici aussi a priori les éventuelles vues existantes dans la base. I.5.1 AJOUT DE DONNÉES : INSERT Syntaxe simplifiée : insert into table (liste de colonnes) values (liste de valeurs) ou insert into table (liste de colonnes) expression de recherche Exemples : insert into detail (ncom, npro, qcom) values (3001, 'PV489', 30) insert into coop.produit (nom, type, prix) values ('KIWI', 'FRUIT', null) insert into coop.produit (nom, type, prix) select nom, type, prix from coop.nouveaux_produits where validation = 'fait' - Il est possible de ne pas indiquer la liste des colonnes et ses parenthèses ; c'est alors toutes les colonnes de la table qui sont implicitement prises en compte et remplies selon l'ordre de leur position dans la table ; exemple : insert into produit values (null, 'kiwi', 'FRUIT', null) - La notation default comme valeur permet d'obtenir la valeur par défaut fixée pour la colonne considérée ; exemple : insert into entrepot (code, lieu) values ('Z08', default) - La norme SQL permet aussi d'utiliser la notation default values à la place de la liste des valeurs et ses parenthèses pour obtenir un enregistrement avec les valeurs par défaut respectives de chaque colonne ; exemple : insert into produit default values. MySQL ne reconnaît pas cette notation mais elle peut être remplacée par une liste vide ; exemple : insert into produit values() - Plusieurs lignes de données peuvent être insérées en une seule instruction ; il suffit d'indiquer les listes de valeurs correspondant à chaque ligne de données, à la suite et séparées par une virgule («,») ; exemple : insert into entrepot (code, lieu) values ('G01', 'grenier'), ('J01', 'jardin') - Quand la valeur ajoutée ne correspond pas exactement au type de donnée de la colonne correspondante, il peut survenir une conversion (cf. I.5.7). - MySQL permet de simplifier l'écriture de l'instruction en omettant le mot-clef into, et aussi en remplaçant values par value ; cela n'est pas dans la norme. - L'insertion est refusée si la nouvelle valeur de clef primaire, ou unique, existe déjà dans la table ; afin de forcer l'insertion dans ce cas par suppression de l'enregistrement avec la même clef, MySQL propose une instruction de syntaxe similaire (hors norme) : replace into table (liste de colonnes)... I.5.2 MISE À JOUR DE DONNÉES : UPDATE Syntaxe : update table set liste des mises à jour where condition ou sur toutes les lignes de la table : update table set liste des mises à jour les mises à jour sont séparées dans la liste par une virgule, et sous la forme : colonne = valeur une valeur est soit une expression, soit null, soit default la condition est présentée en I.5.6.1 Exemples : update coop.produit set type = 'fruit', nom = 'kiwi' where numero = 1 update client set cat = 'A1' where cat is null update client set compte = compte + 100 update table1 set table1.col1 = (select table2.col2 from table2 where table1.id1 = table2.id2) Aide-mémoire minimal de SQL dans MySQL - Page 15

- Dans le cas où une modification réutilise une valeur mise à jour lors d'une modification précédente dans la même liste, la norme SQL stipule que c'est la valeur initiale avant toute modification qui est prise en compte alors que MySQL au contraire prend en compte la nouvelle valeur modifiée précédemment ; exemple : update promotion set prix = prix * 0.8, prix_ancien = prix - Quand la valeur ne correspond pas exactement au type de donnée de la colonne mise à jour par celle-ci, il peut survenir une conversion (cf. I.5.7). - MySQL fournit des clauses complémentaires à l'instruction de mise à jour : tri des lignes avant la mise à jour (order by), application à un nombre limité de lignes (limit) ; ces clauses sont hors norme. I.5.3 SUPPRESSION DE DONNÉES : DELETE Suppression de lignes particulières : delete from table where condition ou de toutes les lignes de la table : delete from table la condition est présentée en I.5.6.1 Exemples : delete from coop.produit where numero = 2 delete from nouveaux_produits - Pour le cas de la suppression complète des lignes d'une table, MySQL contient une autre instruction généralement plus rapide mais hors norme (truncate, cf. I.3.6) - MySQL fournit des éléments complémentaires à l'instruction de suppression, hors norme, notamment : non prise en compte des anomalies (delete ignore from), tri des lignes avant la suppression (order by), application à un nombre limité de lignes (limit). - Il est aussi possible avec MySQL de combiner la suppression avec une jointure mais cela est hors norme : delete from liste de tables using jointure... ou delete liste de tables from jointure... I.5.4 INTERROGATION : SELECT Une instruction d'interrogation regroupe toutes les possibilités d'extraire de l'information à partir des tables de données et d'effectuer des calculs. Les informations obtenues en résultat sont soit une table, soit une valeur ; en cas d'absence de résultat, on obtient la valeur null. La syntaxe générale est : expression de recherche option de tri (voir les diagrammes syntaxiques en II.3) L'option de tri s'applique sur les lignes obtenues : order by spécification du tri où la spécification du tri correspond à un ou plusieurs critères séparés par une virgule («,») ; un critère étant un résultat désigné par son nom ou son rang (compté à partir de 1), et éventuellement complété par le sens de tri : asc pour croissant (appliqué par défaut d'indication) ou desc pour décroissant. Une expression de recherche peut être composée de manière plus ou moins structurée sous la forme d'une interrogation élémentaire ou d'une combinaison d'interrogations. Une expression de recherche peut être réutilisée dans une instruction pour y fournir une table de données, voire une simple colonne ou une valeur (cf. I.5.6.5). Dans ce cas, il s'agit soit de remplissage d'une table dans une instruction d'insertion (cf. I.5.1), soit sinon d'une sous-recherche (subquery). Une sous-recherche délivre soit une valeur simple (type «scalaire»), soit une liste de valeurs (type «colonne»), soit un ensemble de colonnes (type «table»). Elle se note sous la forme d'une interrogation élémentaire mise entre parenthèses : ( interrogation élémentaire ) Exemples : select nom, prix from produit order by prix desc select personne.nom, count(lot.numero) as nb from personne join lot on lot.producteur = personne.numero group by producteur having nb >= 10 order by personne.nom insert into coop.produit (nom, type, prix) select nom, type, prix from coop.nouveaux_produits where validation = 'fait' select avg(type_produit.total) from ( select sum(prix) as total from produit group by type ) as type_produit I.5.4.1 INTERROGATION ÉLÉMENTAIRE Syntaxe simplifiée : select doublons résultats from données options où la gestion des doublons s'indique explicitement par l'ajout d'un mot-clef immédiatement après select, soit distinct pour une élimination, soit all pour leur conservation (cas appliqué par défaut d'indication), Aide-mémoire minimal de SQL dans MySQL - Page 16

où les résultats correspondent à : - Soit toutes les colonnes de la table, noté par une astérique, «*» - Soit une ou plusieurs identifications de valeurs séparées par une virgule («,»), correspondant chacune à une colonne désignée par son nom ou plus généralement à une expression éventuellement assortie d'un surnom («alias») : valeur ou valeur as surnom et où les données correspondent à un ou plusieurs éléments séparés par une virgule («,») : - Soit une table désignée par son nom, éventuellement assortie d'un surnom : nom ou nom as surnom - Soit l'expression d'une jointure de tables (cf. I.5.5) - Soit une table dite «dérivée» résultat d'une sous-recherche de type «table» identifiée explicitement par un surnom : ( interrogation élémentaire ) as surnom et où options est l'une ou plusieurs, dans l'ordre, des clauses suivantes facultatives : - Restriction sur les données : where condition où la condition est présentée en I.5.6.1 - Regroupement des lignes obtenues : group by spécification du regroupement où la spécification du regroupement correspond à une ou plusieurs désignations de résultats séparées par une virgule («,») - Filtrage des lignes après une agrégation ou un regroupement : having condition Exemples : select * from client where cat = 'B1' select distinct cat from client select nom, ville from coop.personne order by ville, nom select nom, (prix * 1.196) as prix_ttc from produit select p.type, avg(p.prix) as moyenne from produit as p group by p.type select avg(type_produit.total) from ( select sum(prix) as total from produit group by type ) as type_produit select producteur, count(numero) as nb from lot group by producteur having nb >= 10 select current_date date_du_jour - Il est possible d'attribuer un surnom à une table ou un résultat, en omettant le mot-clef as ; exemple : avg(prix) as moyenne ou avg(prix) moyenne - Au sein des options, un résultat peut être désignée par son nom en cas de colonne, éventuellement préfixé par le nom de la table suivi d'un point («.»), ou par un surnom si défini précédemment. - Un critère de tri de type textuel peut aussi inclure un interclassement introduit par le mot-clef collate ; exemple : select nom from client order by nom collate utf8_bin asc - MySQL propose aussi la limitation du nombre de lignes en résultat, hors norme SQL ; cette option se place tout à la fin, sous deux formes : soit les premières lignes avec limit quantité, soit un certain nombre de lignes au-delà d'un seuil avec limit seuil, quantité ou limit quantité offset seuil ; exemples : select * from client order by nom asc limit 5 (5 premières lignes au maximum) et select * from client order by nom asc limit 5, 10 (lignes de rang 6 à 15 si existantes) I.5.4.2 COMBINAISON D'INTERROGATIONS Voici les combinaisons possibles d'interrogation présentées par ordre de priorité décroissant. 1) Elément de recherche, à la base d'une combinaison Soit une interrogation élémentaire (cf. I.5.4.1) Soit une sous-recherche (cf. I.5.4) : ( expression de recherche ) 2) Union des résultats : expression de recherche 1 union doublons expression de recherche 2 La gestion des doublons s'effectue avec élimination par défaut d'indication, ou sinon sans élimination par l'ajout du mot-clef all immédiatement après union. Les résultats de la seconde recherche s'ajoutent à ceux de la première, avec la reprise des noms de colonne issus de la première recherche ; les deux recherches doivent produire des résultats sur des colonnes en même nombre et de même type respectif. Aide-mémoire minimal de SQL dans MySQL - Page 17

La norme SQL permet de restreindre l'union aux colonnes de noms identiques à l'aide du mot-clef corresponding placé avant la seconde expression de recherche, éventuellement complété par une liste de nom colonnes (séparés par une virgule) introduite par le mot-clef by : corresponding ou corresponding by(liste de colonnes) ; MySQL ne reconnaît pas cette option. Exemple : select p.nom from personne as p join lot on lot.producteur = p.numero union select p.nom from personne as p join vente on vente.acheteur = p.numero - La norme SQL défini d'autres combinaisons mais inexistantes dans MySQL (5.1) : Intersection : expression de recherche 1 intersect doublons expression de recherche 2 la syntaxe est similaire à celle de l'union ; cela correspond à l'ensemble des résultats communs aux deux recherches. Différence : expression de recherche 1 except doublons expression de recherche 2 la syntaxe est similaire à celle de l'union ; cela correspond à l'ensemble des résultats de la première recherche qui n'apparaissent pas dans ceux de la seconde recherche. I.5.5 JOINTURE DE TABLES Une jointure entre tables dispose de notations spécifiques selon le type de jointure. Dans tous les cas, une jointure lie deux tables désignées par une référence respective, qui peut être : - Un nom de table, éventuellement préfixé par le nom de son schéma ou de sa base, et suivi en option par la définition d'un surnom : nom de table as surnom - Une table «dérivée» résultat d'une sous-recherche de type «table» et identifiée explicitement par un surnom : ( interrogation élémentaire ) as surnom - une autre jointure, éventuellement placée entre parenthèses («( )») la norme SQL permet aussi de définir un surnom pour les colonnes d'une table sous la forme : table as nouveau nom de table ( liste des nouveaux noms de colonne ) Exemples : select cli.nom, cli.compte from client as cli join commande as cmd on cli.ncli = cmd.ncli select p.nom, p.prix, max(j.prix) as max_vente from produit as p join (select prix from vente, produit as v where v.produit = produit.numero) as j select distinct x.nom from personne as x join (vente join produit on vente.produit = produit.numero) on x.numero = acheteur Jointure générale Syntaxe : référence de table 1 type de jointure join référence de table 2 on condition où le type de jointure est au choix : - Interne : inner ; à chaque ligne de la 1 ère table est associée toute ligne de la 2 nde table vérifiant la condition - Externe à gauche : left outer ; une jointure interne est d'abord effectuée, puis il y est ajouté toute ligne de la 1 ère table sans concordance avec la 2 nde table et alors complétées par des manques (null) - Externe à droite : right outer ; une jointure interne est d'abord effectuée, puis il y est ajouté toutes les lignes de la 2 nde table sans concordance avec la 1 ère table et alors complétées par des manques (null) - Externe bilatérale : full outer ; une jointure interne est d'abord effectuée, puis il y est ajouté toutes les lignes de la 1 ère table sans concordance avec la 2 nde table complétées par des manques (null) et enfin toutes celles de la 2 nde table sans concordance avec la 1 ère table complétées par des manques (null) et où la condition (cf. I.5.6.1) définit le critère de concordance des lignes entre les tables Exemples : select p.nom from produit as p join vente as v on v.produit = p.numero select p.nom, p.prix, max(j.prix) as max_vente from produit as p join (select prix from vente, produit as v where v.produit = produit.numero) as j - Le type de jointure peut être omis, c'est alors la jointure interne (inner) qui s'applique. - Dans le cas d'une jointure externe, le mot-clef outer peut être omis. - L'appellation «équi-jointure» correspond au cas où la condition consiste en l'égalité de colonnes. Aide-mémoire minimal de SQL dans MySQL - Page 18

- Quand la condition de jointure porte sur l'égalité d'une ou plusieurs colonnes homonymes, elle peut alors être remplacée par une notation spécifique respectivement : using(nom commun de colonne) ou using(liste des noms communs de colonne séparés par une virgule) exemple : select client.nom from client join commande using(ncli) - La norme SQL définit des types complémentaires de jointure : Naturelle : référence de table 1 natural join référence de table 2 ; la concordance s'effectue automatiquement sur l'égalité de toutes les colonnes homonymes et de même type, avec reprise dans la table jointe d'une seule de ces colonnes homonymes ; à éviter car la condition n'est pas explicitée. Union : référence de table 1 union join référence de table 2 ; ajout simple des lignes de chaque table complétées par des manques (null) ; ceci n'existe pas dans MySQL. Jointure croisée Chaque ligne de la première table est jointe à chacune de l'autre table, c'est le «produit cartésien». Syntaxe : référence de table 1 cross join référence de table 2 Exemple : select produit.nom, entrepot.reference from produit cross join entrepot I.5.6 EXPRESSION Les différentes formes d'expression correspondent aux types possibles de la valeur associée. I.5.6.1 EXPRESSION LOGIQUE Voici les composants possibles d'une expression logique (ou condition) présentés par ordre de priorité décroissant qui s'appliquent a priori sur une ou des valeurs correspondant à une expression (cf. I.5.6). 1) Prédicat - Comparaison entre deux valeurs avec : =, <> (différence), >, <, >= ou <= MySQL propose, hors norme SQL, une notation synonyme pour la différence :!= exemples : type = 'LEGUME' compte <> 0 age <= 18 - Appartenance ou non d'une valeur à un intervalle donné : valeur between valeur 1 and valeur 2 ou valeur not between valeur 1 and valeur 2 exemples : compte between 500 and 1000 - Présence ou non dans une liste de valeurs : valeur in liste ou valeur not in liste exemple : cat in ('A01, 'A02', 'A03') - Concordance ou non avec un motif de texte : valeur like motif ou valeur not like motif où le motif peut contenir les symboles, appelés «jokers», «%» pour désigner toute suite de symboles (éventuellement vide), et «_» pour désigner un et un seul symbole quelconque. Dans le cas où un de ces jokers figure dans le texte du motif comme véritable symbole, il est possible d'annuler son effet de joker en le faisant précéder d'un symbole particulier déclaré à la fin du prédicat par : escape symbole ; exemples : code_postal like '750 ' courriel like '%!_%@%' escape '!' - Présence ou absence de la donnée : valeur is null ou valeur is not null exemple : cat is not null - Comparaison avec chaque élément d'un ensemble de valeurs : valeur comparateur mode liste où comparateur correspond à : =, <> (différence), >, <, >= ou <= et liste à une liste de valeurs, ou au résultat d'une sous-recherche (cf. I.5.4) renvoyant une seule colonne et mode à : all (chaque comparaison est vérifiée), any (au-moins une comparaison est vérifiée) la norme SQL définit some comme synonyme de any mais MySQL ne le reconnaît pas. exemple : produit.prix < all (select lot.prix from lot where lot.produit = produit.numero) - Existence de résultats pour une sous-recherche (cf. I.5.4) donnée : exists sous-recherche exemple : exists (select ncom from commande where commande.ncli = client.ncli) - La norme SQL définit aussi d'autres prédicats particuliers mais inexistants dans MySQL : Un seul résultat pour une sous-recherche (cf. I.5.4) : unique Correspondance entre une liste de valeurs et la ligne en résultat d'une sous-recherche (cf. I.5.4) : match Recouvrement de périodes temporelles : overlaps 2) Sous-condition : (condition) exemple : (localite = 'Paris') and (datecom >= '2011-11-01') Aide-mémoire minimal de SQL dans MySQL - Page 19

3) Terme logique - Une combinaison logique : or (disjonction «ou»), and (conjonction «et»), not (négation) MySQL propose, hors norme SQL, des notations synonymes : (or), && ( and),! (not) ainsi que la conjonction exclusive (l'un ou l'autre mais pas les deux à la fois) : xor Attention au symbole qui correspond soit à la concaténation de texte comme dans la norme SQL, soit à or (disjonction «ou»)! Son attribution dépend en fait de l'option SQL PIPES_AS_CONCAT (cf. II.6) exemple : (type = 'LEGUME') and (prix > 100) - Un test logique : is constante ou is not constante avec les constantes true, false ou unknown correspondant à une logique à trois états : vrai, faux ou indéterminable (donnée manquante généralement) exemple : (produit.prix > client.compte) is not unknown - L'ordre de priorité décroissant de ces opérateurs logiques est : is not and or I.5.6.2 EXPRESSION NUMÉRIQUE Voici les composants possibles d'une expression numérique présentés par ordre de priorité décroissant : 1) Une valeur numérique Il s'agit d'un élément d'expression (cf. I.5.6.5), à valeur numérique. 2) Une fonction à valeur numérique - Position d'une sous-chaîne dans une chaîne de caractères : position(sous-chaîne in chaîne) qui renvoie le rang de la sous-chaîne non vide dans chaîne (à partir de 1) si présente, 0 sinon ; exemple : position('@', courriel) - Extraction d'un composant d'une valeur temporelle : extract(champ from valeur temporelle) où champ correspond au choix à l'année (year), le mois (month), le jour (day), l'heure (hour), les minutes (minute) ou secondes (second) ; MySQL autorise d'autres champs hors norme, mais ne permet pas d'obtenir l'heure et les minutes en tenant compte d'un fuseau horaire comme défini dans la norme SQL (timezone_hour, timezone_minute) ; exemple : extract(year from date_arrivee) - Nombre de caractères dans une chaîne : char_length(chaîne) ou character_length(chaîne) à ne pas confondre avec octet_length(chaîne) qui renvoie le nombre d'octets, car selon l'alphabet (cf. II.2) un caractère peut occuper un ou plusieurs octets ; dans MySQL, la fonction hors-norme length(chaîne) est un synonyme de octet_length(chaîne); exemple : char_length(nom) - Nombre de bits dans une chaîne : bit_length(chaîne) - MySQL fournit de nombreuses fonctions complémentaires, hors norme et non présentées ici. 3) La négation : - Exemple : - debit 4) La multiplication ou la division : * / Exemple : prix * 1.77 5) L'addition ou la soustraction : + - Exemple : solde + report I.5.6.3 EXPRESSION TEXTUELLE Voici les composantes possibles d'une expression textuelle présentées par ordre de priorité décroissant : 1) Une valeur textuelle Il s'agit d'un élément d'expression (cf. I.5.6.5), à valeur textuelle. 2) Une fonction à valeur textuelle - Extraction d'une partie d'une chaîne débutant à un rang donné (compté à partir de 1), soit jusqu'à la fin de la chaîne : substring(chaîne from début), soit pour une certaine quantité de caractères donnée : substring(chaîne from début for quantité) ; MySQL fournit le synonyme substr() et la possibilité de remplacer les mots-clefs from et for par une virgule, ce qui est hors-norme ; exemple : substring(code from 1 for 2) - Changement de casse par passage en majuscules : upper(chaîne) ou en minuscules : lower(chaîne) exemple : upper(produit.type) - Elimination des occurences d'un caractère situées à l'une ou aux deux extrémités d'une chaîne : Aide-mémoire minimal de SQL dans MySQL - Page 20

trim(mode caractère from chaîne) où mode est au choix : both ou absent (les deux bouts), leading (au début seul) ou trailing (à la fin seule) ; par défaut d'indication le caractère à éliminer est l'espace, et en absence d'indication des mode et caractère, le mot-clef from peut être alors omis ; exemple : trim(both from courriel) ou trim(courriel) - Conversion du texte d'une chaîne dans un alphabet (cf. II.2) donné : convert(chaîne using alphabet) fonction utilisable uniquement dans la spécification d'un résultat d'une instruction d'interrogation (cf. I.5.4) exemple : select convert(nom using utf8) from personne - La norme SQL définit aussi une fonction de remplacement ciblé de certains caractères dans une chaîne mais celle-ci n'existe pas dans MySQL : translate(chaîne using table de conversion) - MySQL fournit de nombreuses fonctions complémentaires, hors norme et non présentées ici. 3) L'application d'un interclassement (cf. II.2) : collate interclassement Exemple : nom collate utf8_bin 4) La concaténation de deux chaînes La norme SQL utilise la notation mais MySQL utilise a priori (cf. II.6.2) celle-ci pour le «ou logique» et propose à la place la fonction concat(liste de valeurs) Exemple : nom ' ' prenom ou concat(nom, ' ', prenom) I.5.6.4 EXPRESSION TEMPORELLE Voici les composantes possibles d'une expression temporelle présentées par ordre de priorité décroissant : 1) Une valeur temporelle Il s'agit d'un élément d'expression (cf. I.5.6.5), à valeur temporelle. Exemple : date '2011-12-28' 2) Une fonction à valeur temporelle - La date courante : current_date Dans MySQL, la fonctionne retourne la date soit comme un texte de forme normalisée 'AAAA-MM-JJ' dans un contexte textuel, soit comme un nombre AAAAMMJJ dans un contexte numérique ; exemples : '2011-12-29' ou 20111229 - L'heure courante : current_time Dans MySQL, la fonctionne retourne l'heure soit comme un texte de forme normalisée 'HH:MM:SS' dans un contexte textuel, soit comme un nombre HHMMSS.00000 dans un contexte numérique ; exemples : '12:17:30' ou 121730.000000 - L'horodate courante : current_timestamp Dans MySQL, la fonctionne retourne l'horodate soit comme un texte de forme normalisée 'AAAA-MM-JJ HH:MM:SS' dans un contexte textuel, soit comme un nombre AAAAMMJJHHMMSS.00000 dans un contexte numérique ; exemples : '2011-12-29 12:17:30' ou 20111229121730.000000 - MySQL propose des homonymes hors-norme pour ces fonctions : curdate(), curtime(), now() mais par contre ne permet pas de manipuler des fractions de seconde. En outre, MySQL fournit aussi de nombreuses fonctions complémentaires, hors norme et non présentées ici. 3) L'augmentation ou la diminution temporelle Il s'agit de la combinaison d'une valeur temporelle avec une durée (cf. I.1.5): durée + valeur temporelle ou valeur temporelle + durée ou valeur temporelle - durée Exemple : current_date + interval '3' month I.5.6.5 ELÉMENT D'UNE EXPRESSION L'élément de base formant une expression peut être : - Une notation de valeur numérique, textuelle, temporelle, logique, binaire ou hexadécimale Exemples : 1.77 'Carotte' date '2011-12-28' true B'11111010' X'20' - Le nom du compte de l'utilisateur utilisant le SGDB : current_user La norme SQL définit aussi user et session_user, non reconnus tels quels par MySQL. - Le nom d'une variable défine dans l'environnement d'exécution (cf. II.6.1). - Le nom d'une colonne, éventuellement préfixé par le nom de table Aide-mémoire minimal de SQL dans MySQL - Page 21

Exemples : produit.prix cat - Un calcul dit «d'agrégation» portant sur l'ensemble de toutes les valeurs de colonnes, ou dans le cas d'un regroupement de lignes au sein d'une interrogation (cf. I.5.4) sur chacun des groupes obtenus, avec en conséquence le remplacement de la liste de ces valeurs par le résultat du calcul ; cela s'exprime de manière générale sous la forme : fonction(doublons expression) où la gestion des doublons s'indique explicitement par soit distinct pour une élimination, soit all ou rien pour leur conservation (cas appliqué par défaut d'indication), et où la fonction de calcul peut correspondre à : Comptage : count() (pas de prise en compte lignes avec une valeur absente, null) Moyenne (average) : avg() Somme : sum() Minimum ou maximum : min() ou max() La notation particulière count(*) désigne le nombre total de lignes Attention! il ne peut pas y avoir d'espace entre le nom de la fonction et la parenthèse ouvrante. Exemples : select type, avg(prix) from produit group by type select count(*) as nb_client, count(distinct cat) as nb_cat from client - Une sous-recherche (cf. I.5.4) dont le résultat est une valeur simple (dite «scalaire») ou null si vide Exemple : ( select max(prix) from produit ) - Une sous-expression notée entre parenthèses : ( expression ) Exemple : (prix * 1.77) - Une conversion de type, ou «transtypage» (cf. I.5.7) : cast(expression as type de donnée) La norme SQL permet d'utiliser un nom de domaine à la place du type de données mais pas MySQL. Exemple : cast('12:20' as time) - Une opération avec un choix : La première valeur définie (non vide) présente dans une liste : coalesce(liste d'expressions) exemple : coalesce(nom_jeune_fille, nom_famille, '?') La valeur d'une expression, remplacée par null dans le cas où elle est égale à une valeur particulière : nullif(expression, valeur) exemple : nullif(nom, '?') Une valeur définie au cas par cas selon les valeurs possibles d'une expression donnée : case expression liste de cas alternative end où la liste est constituée d'un ou plusieurs cas à la suite, chacun noté : when valeur then résultat et où l'alternative, optionnelle, s'applique si aucun cas n'est vérifié : else valeur l'absence d'alternative équivaut au choix de la valeur null par défaut de cas vérifié Exemple : case sexe when 'F' then 'femme' when 'H' then 'homme' else 'inconnu' end Une valeur définie au cas par cas selon des conditions (cf. I.5.6.1) au sein d'une interrogation: case liste de cas alternative end où la liste est constituée d'un ou plusieurs cas à la suite, chacun noté : when condition then résultat et où l'alternative, optionnelle, s'applique si aucun cas n'est vérifié : else valeur l'absence d'alternative équivaut au choix de la valeur null par défaut de cas vérifié Exemple : select code_postal, case when pays = 'FR' then 'France' when pays is null then 'Inconnu' else 'Etranger' end from personne I.5.7 CONVERSION DE VALEURS Quand des opérations s'appliquent à des valeurs de types (ou domaines) différents, il survient généralement une conversion implicite et silencieuse du type de l'une des valeurs vers celui de l'autre valeur, appelée «transtypage» (cast). Il est aussi possible de provoquer une conversion de manière explicite à l'aide de l'opérateur cast (cf. I.5.6.5). Voici ci-après un aperçu des conversions implicites dans MySQL lors d'une comparaison ou d'un calcul. Aide-mémoire minimal de SQL dans MySQL - Page 22

Opérandes null numérique texte temporel binaire ou hexadécimal null null null null null null numérique null numérique 1 numérique 2 numérique 3 numérique 5 texte null numérique 2 texte texte 4 texte 6 temporel null numérique 3 texte 4 temporel numérique 3 5 binaire ou hexadécimal null numérique 5 texte 6 numérique 3 5 binaire ou hexadécimal Nota bene 1) Dans le cas du couple composé d'une nombre entier et d'un nombre décimal exact, le résultat est de type décimal exact ; sinon, dès qu'une valeur est un réel approché, le résultat est alors un réel approché. 2) Le texte est interprété autant que possible comme la notation d'une valeur numérique à partir du début : si cela correspond à un nombre, le texte est alors converti à ce nombre, sinon c'est la valeur zéro ; exemples : '123.1' 123.1 '5a' 5 'carotte' 0 3) La valeur temporelle est considérée comme du texte, puis convertie vers un nombre ; attention aux cas des fonctions temporelles (cf. I.5.6.4) dans MySQL qui renvoient alors un nombre exemples : date '2011-12-29' + 1 2012 current_date + 1 20111230 4) La valeur temporelle est considérée comme du texte ; exemple : concat('le ', current_date ) 'le 2011-12-29' 5) La valeur binaire (ou hexadécimale) est convertie en un nombre (exprimé en base décimale) exemple : 12 + B'0011' 15 6) La valeur binaire (ou hexadécimale) est convertie en un texte, caractère par caractère exemple : concat('a', X'7c', 'b') 'a b' Aide-mémoire minimal de SQL dans MySQL - Page 23

II - ANNEXE : SPÉCIFICITÉS DE MYSQL Cette section décrit les principales spécificités de MySQL, liées à cette présentation du langage SQL. II.1 AIDE EN LIGNE MySQL fournit une instruction d'aide en ligne (en anglais) : help 'sujet' Celle-ci affiche des indications extraites de l'aide en ligne de MySQL. Le sujet peut être notamment un concept général, une instruction de SQL ou un mot-clef. Une liste des principales têtes de chapitres s'obtient par le sujet contents. Exemples : help 'data types' help 'create table' help 'using' help 'contents' II.2 ALPHABETS (CHARSET) ET INTERCLASSEMENTS (COLLATION) MySQL propose un grand nombre d'alphabets avec souvent plusieurs modes d'interclassement. Leurs listes respectives s'obtiennent par les commandes show character set et show collation. L'interclassement définit une méthode de comparaison et de tri des symboles, en considérant les variantes accentuées ou de casse (minuscule ou majuscule) d'une lettre et éventuellement les variantes d'écriture d'un symbole ; par exemple : égalité entre «u», «U», «ù» et «Ù». Par convention, un code à la fin du nom du mode d'interclassement indique s'il est sensible à la casse («_cs») ou non («_ci»). Il prend tout son sens lors de la recherche d'un mot quelques soient ses écritures possibles ; exemple : érable, Erable, Érable, ERABLE sont toujours égaux dans un interclassement insensible à la casse et prenant en compte les accentuations d'une lettre. Un alphabet, avec un interclassement associé par défaut d'indication, est fixé pour le serveur et s'applique a priori à toutes ses bases. Il peut être redéfini au niveau d'une base de données (create database, alter database), ou d'une colonne (create table, alter table). Voici les principaux alphabets avec leurs interclassements respectifs : Alphabet Interclassement Commentaire ascii latin1 utf8 ascii_general_ci * ascii_bin latin1_general_ci latin1_general_cs latin1_swedish_ci * utf8_general_ci * utf8_unicode_ci utf8_bin alphabet informatique élémentaire (US ASCII, lettres anglaises) pas de différence de casse différence entre tous les symboles dont notamment les minuscules et majuscules alphabet de l'europe de l'ouest (ISO 8859-1), dont le français lettres accentuées identiques à la lettre sans accent, pas de différence de casse lettres accentuées identiques à la lettre sans accent, différence de casse variante nordique (lieu d'origine des concepteurs de MySQL), lettres accentuées identiques à la lettre sans accent, sans différence entre lettres minuscules et majuscules alphabet universel (Unicode) lettres accentuées identiques à la lettre sans accent, sans différence entre lettres minuscules et majuscules prise en compte supplémentaire de notations multiples d'une même lettre (exemples en français et allemand : «œ» et «oe», «ß» et «ss») différence entre tous les symboles (dont minuscules et majuscules) * : mode d'interclassement appliqué par défaut à l'alphabet en l'absence d'indication. Aide-mémoire minimal de SQL dans MySQL - Page 24

II.3 DIAGRAMMES SYNTAXIQUES Ces diagrammes syntaxiques ont été créés à l'aide de l'outil RailRoad diagram generator 1. II.3.1 DIAGRAMME SYNTAXIQUE POUR UNE INTERROGATION (SELECT) 1 Outil disponible gratuitement en ligne à : http://railroad.my28msec.com/ Aide-mémoire minimal de SQL dans MySQL - Page 25

Aide-mémoire minimal de SQL dans MySQL - Page 26

Aide-mémoire minimal de SQL dans MySQL - Page 27

Aide-mémoire minimal de SQL dans MySQL - Page 28

Aide-mémoire minimal de SQL dans MySQL - Page 29

II.3.2 DIAGRAMME SYNTAXIQUE POUR UNE EXPRESSION Aide-mémoire minimal de SQL dans MySQL - Page 30

Aide-mémoire minimal de SQL dans MySQL - Page 31

Aide-mémoire minimal de SQL dans MySQL - Page 32

Aide-mémoire minimal de SQL dans MySQL - Page 33

Aide-mémoire minimal de SQL dans MySQL - Page 34