SQL

Structured Query Language : langage de requêtes.

Besoin

Définir un langage standard pour la manipulation de données dans un SGBDR.

Analyse

SQL n'est pas un langage de programmation (il ne comporte pas de structures de contrôle, d'instructions de branchement, de boucles, etc.), mais un langage de requêtes. Il utilise des mots-clés proches du langage naturel (anglais).

Les jointures permettent d'exploiter les relations définies entre tables.

Conception

Exécution

Une requête est exécutée dans l'ordre suivant :

  1. création de l'ensemble de données : FROM et jointures associées
  2. filtrage/restriction: WHERE
  3. regroupement : GROUP BY
  4. filtrage des groupes : HAVING
  5. doublons : DISTINCT
  6. tri : ORDER BY

Utilisation

SQL est utilisable :

Version 1 SQL89 2 (SQL92) 3 Commentaire
Domaine Technologie Année 1986/1987 1989 1992
Niveau de conformité Entrée Oui
Intermédiaire Non Oui
Complet Non Oui
Codes d'erreur standards Non Oui
Structure base Non Oui
Tables système (meta) Non (complet)
Types Caractères CHAR (longueur)
Oui Chaîne de caractères de longueur fixe. Les délimiteurs sont des cotes simples ('Javarome' par exemple)
CHARACTER (longueur)
VARCHAR (longueur)
Non Oui Chaîne de caractères de longueur variable
CHAR VARYING (longueur)
CHARACTER VARYING (longueur)
NCHAR (longueur) Non Oui Chaîne de caractères nationaux de longueur fixe
NATIONAL CHAR (longueur)
NATIONAL CHARACTER (longueur)
NCHAR VARYING (longueur)
Non Oui Chaîne de caractères nationaux de longueur variable
NATIONAL CHAR VARYING (longueur)
NATIONAL CHARACTER VARYING (longueur)
CLOB Character Large OBject.
Nombres INT
INTEGER
Oui Nombre entier
SMALLINT Oui Petit nombre entier
NUMERIC (précision, échelle) Oui Nombre décimal
DECIMAL (précision, échelle) Oui
DEC (précision, échelle) Oui
FLOAT (précision Oui Nombre à virgule flottante
REAL Oui Nombre à virgule flottante à faible précision
DOUBLE PRECISION Oui Nombre à virgule flottante à grande précision
Binaire BIT (longueur) Non Oui Séquence de bits de longueur fixe
BIT VARYING (longueur) Non Oui Séquence de bits de longueur variable
BLOB Binary Large OBject.
Temps DATE Non Oui Date. Spécifié sous forme de chaîne variant selon les fournisseurs et les pays ('1972-8-12' au format ISO par exemple)
TIME (précision) Non Oui Heure. Spécifié sous forme de chaîne variant selon les fournisseurs et les pays ('02.00.03' au format ISO par exemple)
TIMESTAMP (précision) Non Oui Date et heure (instant spécifique à la nanoseconde près). Spécifié sous forme de chaîne variant selon les fournisseurs et les pays ('1972-08-12-02.00.03.048632' par exemple)
INTERVAL Non Oui Intervalle de temps
Graphiques IMAGE Non
GRAPHIC
VARGRAPHIC
Objets multimédia Non
I(nteractive) SQL Non Oui Prepared statements
API Non Oui
SQL Dyamique Non Oui
Manipulation de données SELECT élément(s) FROM table(s) Récupère des données
GROUP BY
HAVING
ORDER BY Non Oui
INSERT Ajoute des lignes
DELETE FROM table Supprime des lignes. WHERE possible.
UPDATE Modifie des données
Définition de données Table Création CREATE TABLE
Suppression DROP TABLE
Modification ALTER TABLE
Vue Création CREATE VIEW
Suppression DROP VIEW
Index Création CREATE INDEX sur une colonne
Suppression DROP INDEX sur une colonne
Schéma Création CREATE SCHEMA
Suppression DROP SCHEMA
Domaine Création CREATE DOMAIN
Modification ALTER DOMAIN
Suppression DROP DOMAIN
Type structuré Création Non CREATE TYPE Type "objet"
Contrôle d'accès GRANT Accorde à un utilisateur des privilèges d'accès.
REVOKE Supprime à un utilisateur des privilèges d'accès.
Contrôle de transaction COMMIT Valide la transaction en cours.
ROLLBACK Annule la transaction en cours.
SET TRANSACTION Définit les caractéristiques d'accès aux données de la transaction en cours.
Programmation SQL DECLARE Définit un curseur pour une requête.
EXPLAIN Décrit le plan d'accès aux données d'une requête.
OPEN Ouvre un curseur pour récupérer les résultats de la requête. Equivalent de Statement.getResultSet()
FETCH Récupère une ligne de résultats de la requête. Equivalent de ResultSet.next()
CLOSE Ferme un curseur. Equivalent de ResultSet.close()
PREPARE Prépare une commande SQL pour une exécution dynamique. Equivalent des PreparedStatement JDBC.
EXECUTE Exécute une commande SQL dynamiquement. Equivalent de Statement.execute
DESCRIBE Décrit une requête préparée
Fonctions Binaires BIT_LENGTH (chaîne) Non Oui Nombre de bits d'une séquence BIT ou BIT VARYING
Caractères CHAR_LENGTH (chaîne) Non Oui Longueur d'une chaîne de caractères
POSITION (cible IN source) Non Oui Position où la chaîne cible apparaît dans la chaîne source
SUBSTRING (source FROM n FOR longueur) Non Oui Position de la chaîne source, commençant au caractère n, d'une longueur donnée
TRANSLATE (chaîne USING trans) Non Oui Chaîne traduite selon une fonction de traduction spécifiée
TRIM (BOTH car FROM chaîne) Non Oui Chaîne avec les occurences de car au début et à la fin de la chaîne supprimées.
TRIM (LEADING car FROM chaîne) Non Oui Chaîne avec les occurences de car au début de la chaîne supprimées.
TRIM (TRAILING car FROM chaîne) Non Oui Chaîne avec les occurences de car à la fin de la chaîne supprimées.
UPPER (chaîne) Non Oui Chaîne convertie en majuscules.
LOWER (chaîne) Non Oui Chaîne convertie en minuscules
OCTET_LENGTH Non Oui Nombres d'octets dans une chaîne de caractères.
Conversions CONVERT (chaîne USING conv) Non Oui Chaîne convertie selon une fonction de conversion spécifiée
CAST (valeur AS type) Non Oui Conversion de type (date en chaîne de caractères par exemple)
Date/Heure CURRENT_DATE Non Oui Date en cours
CURRENT_TIME (précision) Non Oui Heure en cours avec la précision souhaitée
CURRENT_TIMESTAMP (précision) Non Oui Date et heure en cours avec la précision souhaitée
EXTRACT (partie FROM source) Non Oui Partie spécifiée (DAY, HOUR, etc.) d'une valeur DATETIME

Exemples

Création d'une table :

<strong>CREATE TABLE</strong>MA_TABLE <b>(</b>REFERENCE <b>VARCHAR(</b>127<b>) NOT NULL</b>, NOM <b>VARCHAR(127),</b> AUTRE_REF<b> VARCHAR(</b>127<b>), CONSTRAINT</b> PK_ACTOR <b>PRIMARY KEY (</b>REFERENCE<b>))</b>

Ajout d'un enregistrement dans une table :

<strong>INSERT INTO </strong>AGENCES<b>(</b>VILLE, REGION, OBJECTIF, VENTES, AGENCE<b>) VALUES (</b><span class="codeString">'Brest'</span>, <span class="codeString">'Ouest'</span>, 275000.00, 0.00, 23<b>)</b>

Sélection d'enregistrements :

<strong>SELECT FROM</strong>EMPLOYEES emps, AGENCES ags<strong>WHERE</strong>emps.AGENCE<b> = </b>ags.ID<b> AND </b>emps.NOM<b> LIKE </b>'B%'<b> ORDER BY </b>emps.NOM<b> ASC</b>

Supression d'enregistrements d'une table :

<strong>DELETE FROM </strong>CLIENTS<b>WHERE </b>SOCIETE<b> =</b> <span class="codeString">'Microsoft'</span> <strong>AND</strong> VENTES<strong> < </strong>QUOTA

Mise à jour d'enregistrements d'une table :

<strong>UPDATE </strong>VENDEURS<b>SET</b> QUOTA = QUOTA + 15000.0, STATUS = <span class="codeString">'Udpated'</span> <b>WHERE</b> ID<b> ></b> 20

Modification d'une table pour spécifier une clé étrangère :

<strong>ALTER TABLE</strong>MA_TABLE<b> ADD CONSTRAINT </b>MA_RELATION<b> FOREIGN KEY (</b>AUTRE_REF<b>) REFERENCES </b>AUTRE_TABLE<b> (</b>REF<b>)</b>

Protéger l'accès aux données :

<strong>GRANT UPDATE,SELECT ON </strong>MA_TABLE<b>TO </b>javarome<br> <br> <b>REVOKE UPDATE ON </b>MA_TABLE <b>FROM </b>javarome

Procédures stockées (non standard) :

<strong>procedure</strong> GETAMANAGERINOUT (pname <strong>IN VARCHAR2</strong>, p_cur <strong>OUT refTypes.cursorType</strong>, page <strong>IN number</strong>) <strong>is </strong>v_cur <strong>refTypes.cursorType</strong>;<br> <strong>BEGIN</strong><br> <strong>OPEN </strong>v_cur <strong>FOR</strong><br> <strong>SELECT </strong>name,id <strong>FROM </strong>c_manager <strong>WHERE </strong>pname=name <strong>AND </strong>page=age;<br> p_cur:=v_cur;<br> <strong>END </strong>GETAMANAGERINOUT;

Fonctions (non standard, Oracle) :

<strong>function </strong>GETALLFIRMSAPPK_F <strong>return refTypes.cursorType</strong> <strong>is </strong>v_cur <strong>refTypes.cursorType</strong>;<br> <strong> BEGIN</strong><br> <strong>OPEN </strong>v_cur <strong>FOR SELECT </strong>name <strong>FROM </strong>c_firm;<br> <strong>return </strong>v_cur;<br> <strong> end</strong>;

Notes