Synthaxes courantes en SQL


Cette page comprend une liste de requêtes SQL étudié pendant la licence ASRALL. Pour plus de renseignements, vous trouverez de l'aide sur w3schools.

Les pricipales requêtes

  • Retourne les données correspondant à l'Identifiant 25
SELECT nom, prenom FROM T1 WHERE identifiant = 25;
  • Retourne les données correspondant au client qui a plus de 50€ :
SELECT nom_client, SUM(argent) FROM client GROUP BY nom_client HAVING SUM(argent) > 40
  • concaténation de chaines :
SELECT prenom||' '||nom AS personne FROM utilisateurs;
  • Enlever les doublons :
SELECT DISTINCT * FROM utilisateurs_lambda, utilisateurs_avancer;
  • Si une valeur fait partie d'une liste :
SELECT * FROM utilisateurs WHERE ages IN (18, 20, 22);
  • Recherche grâce à des filtres :
SELECT * FROM utilisateurs LIKE "_o%";
  • le caractère _ signifie : n'importe quel caractères mais 1 seul
  • le caractère % signifie : n'importe quel caractères et plusieurs

Retourne :

lorent, loriane
  • Filtre par ordre décroissant :
SELECT * FROM utilisateurs ORDER BY age DESC
  • Trouve les utilisateurs agé entre 20 et 25 ans :
SELECT * FROM utilisateurs WHERE age BETWEEN 20 AND 25;
  • Concaténer les résultats dans une chaine :
SELECT "Vous êtes "||nom||" "||prenom FROM utilisateurs;
  • Créer une table :
CREATE TABLE T1 (C1 DATE, C2 INT, C3 VARCHAR(10));
  • Supprimer une table :
DROP TABLE T1 CASCADE;

L'option CASCADE est facultative mais sa présence signifie que les objets qui dépendent de la table (vues, par exemple) seront automatiquement supprimés.

  • Supprimer une ligne spécifique :
DELETE FROM ma_table WHERE ma_collone IS NULL;
  • Insérer des valeurs :
INSERT INTO T1(C1,C2,C3) VALUES (1, 'chaine2', 'chaine2'),(2, 'chaine3',chaine3');
  • Mettre à jour des valeurs :
UPDATE T1 SET C1="valeur à maj" WHERE C1='mon_utilisateur_par_ex';
  • Créer une base de donnée :
CREATE DATABASE ma_bdd;
  • Supprimer ma base de donnée :
DROP DATABASE ma_bdd;
  • Copier une table :
CREATE TABLE nouvelle_table AS SELECT * FROM table_cible;

Les Unions

  • Unifier les tables :
SELECT col1 FROM t1 UNION SELECT col1 FROM t2;
  • Récupérer les données communes des tables :
SELECT col1 FROM t1 INTERSECT SELECT col1 FROM t2;
  • Récupérer les données inclus dans t1 seulement s'is ne sont pas présent dans t2 :
SELECT col1 FROM t1 EXCEPT SELECT col1 FROM t2;

Les Jointures

  • Jointure classique entre deux tables :
SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.id;
/* Identique à : */
SELECT * FROM T1,T2 WHERE T1.id = T2.id;
  • Jointure classique entre deux tables MAIS affiche les valeurs NULL :
SELECT * FROM T1 FULL JOIN T2 ON T1.id = T2.id
  • fusionner le contenu de deux tables :
SELECT * FROM t1 CROSS JOIN t2;
/* Identique à : */
SELECT * FROM t1,t2;
  • Injecter des données dans la table de gauche :
SELECT * FROM T1 LEFT JOIN T2 T1.id = T2.id;
/* T1 = table de gauche */
/* T2 = table de droite */

Si les collones de l'ensemble de droite sont absents dans la table de gauche alors leurs contenues seront renseigné par la valeur NULL.

  • Injecter des données dans la table de droite :
SELECT * FROM T1 RIGHT JOIN T2 T1.id = T2.id;
/* T1 = table de gauche */
/* T2 = table de droite */

Si les collones de l'ensemble de droite sont absents dans la table de gauche alors leurs contenues seront renseigné par la valeur NULL.

Créer / supprimer un utilisateur

Postgres

  • Créer un simple utilisateur :
CREATE USER mon_utilisateur WITH PASSWORD 'mon_utilisateur';
  • Supprimer un utilisateur :
DROP USER mon_utilisateur;

MySQL

  • Créer un simple utilisateur :
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
  • Supprimer un utilisateur :
DROP USER ‘newuser’@‘localhost’;

Gestion des privilèges (droits)

  • Donner tous les droits sur une base de donnée :
GRANT ALL PRIVILEGES ON DATABASE ma_bdd TO mon_utilisateur;

Liste des droits applicable présenté à cette page

  • On peut également donner certain droits sur des collones spécifique :
GRANT SELECT, INSERT, UPDATE (ma_collone1, ma_collone2) ON ma_table TO mon_utilisateur;

ou

  • On peut également donner tous les droits sur une table spécifique :
GRANT ALL PRIVILEGES ON TABLE ma_table TO mon_utilisateur;
  • Créer un rôle dont les utiliseurs pourront créer des BDD, des rôles mais pas le droit de s'authentifier :
CREATE ROLE mon_role CREATEDB CREATEROLE NOLOGIN;

D'autres rôles sont présenté ici

  • appliquer un rôle aux utilisateurs :
GRANT mon_role TO utilisateur, utilisateur2;
  • Supprimer un rôle d'un utilisateur :
REVOKE mon_role TO utilisateur;
  • Supprimer un rôle :
DROP ROLE mon_role

Modifier le comportement d'une table

  • Changer le mot de passe d'un utilisateur :
ALTER USER 'binome' WITH PASSWORD 'nouveau_password';
  • Ajouter une clé primaire sur un champ (C1) :
ALTER TABLE ma_table ADD CONSTRAINT mon_label_cle_primaire PRIMARY KEY (ma_collone_C1);
  • Ajouter une clé étrangère sur un champ (C1) :
ALTER TABLE ma_table ADD CONSTRAINT mon_label2_cle_etrangere FOREIGN KEY (ma_collone_C1bis) REFERENCES ma_table(ma_collone);
  • Ajouter une collone dans une table :
ALTER TABLE T1 ADD C6 VARCHAR(50);
  • Supprimer une collone dans une table :
ALTER TABLE T1 DROP C6;
  • Ajouter une contrainte d'unicité dans une collone :
ALTER TABLE ma_table ADD CONSTRAINT mon_label UNIQUE (ma_collone);
  • Ajouter une contrainte empêchant de renseigner des valeurs NULL dans une collonne :
ALTER TABLE ma_table ALTER COLUMN ma_collone SET NOT NULL;
  • Ajouter une contrainte qui force la saisie d'une valeur positive :
ALTER TABLE ma_table ALTER COLUMN ma_collone CHECK(ma_collone > 0);

Créer une vue

  • Avoir une vue qui détient toutes les collones de la table T1 :
CREATE VIEW ma_vue AS SELECT * FROM ma_table;
  • Donner le droit d'exécuter un SELECT à cette vue par mon_groupe :
GRANT SELECT ON ma_vue TO mon_groupe;
  • Lister toutes les vues d'une table :
SHOW FULL TABLES IN ma_table WHERE TABLE_TYPE LIKE 'VIEW';

Créer une règle

  • Si un utilisateur ajoute un donnée dans la table alors on fait une action :
CREATE RULE ma_regle AS ON INSERT TO ma_table DO 
INSERT INTO ma_table2 VALUES (now(), 'INSERT', NEW.col1, NEW.col2);
  • On peut retrouver les infos sur ces règles via :
SELECT * FROM pg_rules WHERE tablename='ma_table';

Manipuler les commits

Par défaut les commits sont automatique, ci-dessous on les gères manuellement :

\pset AUTOCOMMIT off;
BEGIN;
UPDATE T1 SET C1=2;
COMMIT;                     -- END; Fonctionne également.
  • Rollback :
\SET AUTOCOMMIT off;
BEGIN;
UPDATE T1 SET C1=2;
SELECT * FROM T1;

Affiche : C1=2

SAVEPOINT r0;
UPDATE t1 SET C1=4;
SELECT * FROM T1;

Affiche : C1=4

ROLLBACK TO SAVEPOINT r0;
SELECT * FROM T1;

Affiche : C1=2;

COMMIT;
  • Isolation des utilisateurs (celà fonctionne avec l'autocommit à off) :
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

D'autres instructions

  • Remplire une table rapidement :
INSERT INTO ma_table (ma_collone) (SELECT round(random()*10) FROM generate_series(1,10000000));