===== Synthaxes courantes en SQL =====
{{ :wiki:synthaxes-commandes-requete-sql-logo.png?100 | }}
----
Cette page comprend une liste de requêtes SQL étudié pendant [[http://iut-charlemagne.univ-lorraine.fr/content/licence-professionnelle-administration-de-systemes-reseaux-et-applications-base-de-logiciels|la licence ASRALL]]. Pour plus de renseignements, vous trouverez de l'[[http://www.w3schools.com/sql/|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 [[http://docs.postgresql.fr/9.2/sql-grant.html|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é [[http://docs.postgresql.fr/8.2/sql-createrole.html|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));