Formation SQL1
Dalibo SCOP
8 janvier 2018
Vous êtes libres de redistribuer et/ou modifier cette création selon les conditions suivantes :
Paternité
Pas d'utilisation commerciale
Partage des conditions initiales Ă l'identique
Commentaire sur le reste de la ligne
-- commentaire
Commentaire dans un bloc
/* bloc */
SELECT
SELECT expressions_colonnes [ FROM elements_from ] [ WHERE predicats ] [ ORDER BY expressions_orderby ] [ LIMIT limite ] [ OFFSET offset ];
référence de colonne :
table.colonne
AS :
AS
expression AS alias
DISTINCT
SELECT DISTINCT expressions_colonnes...
+
-
/
*
||
now()
age(timestamp)
extract( 'year' FROM timestamp)
date_part('Y',timestamp)
char_length(chaine)
count(*)
FROM expression_table [, expression_table ...]
optionnel :
reference_table alias
la table sera ensuite référencée par l'alias
reference_table [AS] alias
reference_table AS alias (alias_colonne1, ...)
Nom_Objet
nom_objet
"
"Nom_Objet"
=
<
>
=<
>=
<>
NOT
expression operateur_comparaison expression
predicat OR predicat
predicat AND predicat
Comparaison de motif
chaine LIKE motif ESCAPE 'c'
%
_
Expression régulière POSIX
chaine ~ motif
Liste de valeurs
expression IN (valeur1 [, ...])
Chevauchement d'intervalle de valeurs
expression BETWEEN expression AND expression
Chevauchement d'intervalle de dates
(date1, date2) OVERLAPS (date3, date4)
Tris des lignes selon des expressions
ORDER BY expression [ ASC | DESC | USING opérateur ] [ NULLS { FIRST | LAST } ] [, ...]
ASC
DESC
NULL
NULLS FIRST
NULLS LAST
COLLATE collation
OFFSET n
FETCH {FIRST | NEXT} n ROWS ONLY
LIMIT n
OFFSET
FETCH
FROM
,
char
varchar
integer
smallint
bigint
real
double precision
numeric
decimal
boolean
date
time
timestamp
interval
bit
bit varying
XML
char(n)
varchar(n)
'
'chaîne de caractères'
E
e
E'chaîne de caractères'
U&
U&'chaîne de caractères'
numeric(precision, echelle)
decimal(precision, echelle)
.
TYPE 'chaine'
TRUE
FALSE
'YYYY-MM-DD HH24:MI:SS.ssssss'
'YYYY-MM-DD HH24:MI:SS.ssssss+fuseau'
'YYYY-MM-DD HH24:MI:SS.ssssss' AT TIME ZONE 'fuseau'
INTERVAL 'durée interval'
timezone
SET TIME ZONE
'Europe/Paris'
'CEST'
'+02'
bit(n)
bit varying(n)
B
B'01010101'
X
X'55'
xml
serial
smallserial
bigserial
IDENTITY
text
bytea
array
enum
cidr
inet
macaddr
uuid
json
jsonb
hstore
range
tableau
CREATE TYPE
N'hésitez pas, c'est le moment !
Data Definition Language
Data Manipulation Language
Transaction Control Language
CREATE
CREATE SCHEMA s1;
ALTER
renommage
ALTER type_objet ancien_nom RENAME TO nouveau_nom ;
changement de propriétaire
ALTER type_objet nom_objet OWNER TO proprietaire ;
changement de schéma
ALTER type_objet nom_objet SET SCHEMA nom_schema ;
DROP
supprimer un objet :
DROP type_objet nom_objet ;
supprimer un objet et ses dépendances :
DROP type_objet nom_objet CASCADE ;
public
CREATE SCHEMA nom_schéma
ALTER SCHEMA nom_schéma
DROP SCHEMA [ IF EXISTS ] nom_schéma [ CASCADE ]
nom_schema
search_path
SET search_path = schema1,schema2,public;
$user, public
MINVALUE
MAXVALUE
START
INCREMENT
CACHE
CYCLE
CREATE SEQUENCE nom [ INCREMENT incrément ] [ MINVALUE valeurmin | NO MINVALUE ] [ MAXVALUE valeurmax | NO MAXVALUE ] [ START [ WITH ] début ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { nom_table.nom_colonne | NONE } ]
ALTER SEQUENCE nom [ INCREMENT increment ] [ MINVALUE valeurmin | NO MINVALUE ] [ MAXVALUE valeurmax | NO MAXVALUE ] [ START [ WITH ] début ] [ RESTART [ [ WITH ] nouveau_début ] ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { nom_table.nom_colonne | NONE } ]
DROP SEQUENCE nom [, ...]
nextval('nom_sequence')
currval('nom_sequence')
nextval()
nextval(...)
CREATE TABLE
CREATE TABLE nom_table ( definition_colonnes definition_contraintes ) clause_stockage;
nom_colonne type [ COLLATE collation ] [ contrainte ] [, ...]
DEFAULT
CREATE TABLE ... (LIKE table clause_inclusion)
INCLUDING DEFAULTS
INCLUDING CONSTRAINTS
INCLUDING INDEXES
ALTER TABLE
Supprimer une table :
DROP TABLE nom_table;
Supprimer une table et tous les objets dépendants :
DROP TABLE nom_table CASCADE;
Construction :
[CONSTRAINT nom_contrainte] PRIMARY KEY ( nom_colonne [, ... ] )
UNIQUE
[ CONSTRAINT nom_contrainte] { UNIQUE ( nom_colonne [, ... ] )
NOT NULL
FOREIGN KEY
[ CONSTRAINT nom_contrainte ] FOREIGN KEY ( nom_colonne [, ...] ) REFERENCES table_reference [ (colonne_reference [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
MATCH
MATCH FULL
MATCH SIMPLE
GENERATED ... AS IDENTITY
ALWAYS
BY DEFAULT
ON UPDATE
ON DELETE
CHECK
DEFERRABLE
NOT DEFERRABLE
INITIALLY DEFERED
INITIALLY IMMEDIATE
INSERT
UPDATE
DELETE
INSERT INTO nom_table [ ( nom_colonne [, ...] ) ] { liste_valeurs | requete }
INSERT INTO nom_table [ ( nom_colonne [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...]
INSERT INTO nom_table [ ( nom_colonne [, ...] ) ] requĂŞte
UPDATE nom_table SET { nom_colonne = { expression | DEFAULT } | ( nom_colonne [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ FROM liste_from ] [ WHERE condition | WHERE CURRENT OF nom_curseur ]
DELETE FROM nom_table [ [ AS ] alias ] [ WHERE condition
requete_sql RETURNING ( * | expression )
BEGIN TRANSACTION
COMMIT
ROLLBACK
SAVEPOINT nom_savepoint
RELEASE SAVEPOINT nom_savepoint
ROLLBACK TO SAVEPOINT nom_savepoint
GROUP BY
HAVING
CASE
UNION
EXCEPT
INTERSECT
WHERE
IS NULL
IS NOT NULL
AND
false
NULL AND false
NULL AND true
NULL AND NULL
OR
true
NULL OR true
NULL OR false
NULL OR NULL
COALESCE(attribut, ...);
Regroupement de données :
GROUP BY expression [, ...]
count()
Comptage :
count(expression)
count(colonne)
Valeur minimale :
min(expression)
Valeur maximale :
max(expression)
Moyenne :
avg(expression)
Somme :
sum(expression)
Écart-type :
stddev(expression)
Variance :
variance(expression)
(
)
IN
ANY
ALL
expression IN (sous-requete)
expression NOT IN (sous-requete)
NOT IN
expression operateur ANY (sous-requete)
expression operateur ALL (sous-requete)
EXISTS (sous-requete)
EXISTS
CROSS JOIN
INNER JOIN
Condition de jointure par prédicats :
table1 [INNER] JOIN table2 ON prédicat [...]
Condition de jointure implicite par liste des colonnes impliquées :
table1 [INNER] JOIN table2 USING (colonne [, ...])
Liste des colonnes implicites :
table1 NATURAL [INNER] JOIN table2
table1 LEFT [OUTER] JOIN table2 ON prédicat [...]
table1 LEFT [OUTER] JOIN table2 USING (colonne [, ...])
table1 NATURAL LEFT [OUTER] JOIN table2
table1 RIGHT [OUTER] JOIN table2 ON prédicat [...]
table1 RIGHT [OUTER] JOIN table2 USING (colonne [, ...])
table1 NATURAL RIGHT [OUTER] JOIN table2
table1 FULL OUTER JOIN table2 ON prédicat [...]
table1 FULL OUTER JOIN table2 USING (colonne [, ...])
table1 NATURAL FULL OUTER JOIN table2
switch
CASE expression WHEN valeur THEN expression WHEN valeur THEN expression (...) ELSE expression END
CASE WHEN expression THEN expression WHEN expression THEN expression (...) ELSE expression END
ELSE
Regroupement avec dédoublonnage :
requete_select1 UNION requete_select2
Regroupement sans dédoublonnage :
requete_select1 UNION ALL requete_select2
Intersection de deux ensembles avec dédoublonnage :
requete_select1 INTERSECT requete_select2
Intersection de deux ensembles sans dédoublonnage :
requete_select1 INTERSECT ALL requete_select2
Différence entre deux ensembles avec dédoublonnage :
requete_select1 EXCEPT requete_select2
Différence entre deux ensembles sans dédoublonnage :
requete_select1 EXCEPT ALL requete_select2
CAST (expression AS type)
expression::type
chaîne1 || chaîne2
char_length(chaîne)
lower(chaîne)
upper(chaîne)
substring(chaîne [from int] [for int])
position(sous-chaîne in chaîne)
Arrondi : round(numeric)
round(numeric)
Troncature : trunc(numeric [, precision])
trunc(numeric [, precision])
Entier le plus petit : floor(numeric)
floor(numeric)
Entier le plus grand : ceil(numeric)
ceil(numeric)
Générer une suite d'entiers : generate_series(borne_debut, borne_fin, intervalle)
generate_series(borne_debut, borne_fin, intervalle)
Générer un nombre aléatoire : random()
random()
current_date
current_time
current_timestamp
age(timestamp, timestamp)
date_trunc(text, timestamp)
date_trunc('month' from date_naissance)
extract(text, timestamp)
extract('year' from date_naissance)
date/time - date/time = interval
date/time + time = date/time
date/time + interval = date/time
interval * numeric = interval
interval / numeric = interval
interval + interval = interval
to_char(timestamp, text)
to_char(current_timestamp, 'DD/MM/YYYY HH24:MI:SS')
to_date(text, text)
to_date('05/12/2000', 'DD/MM/YYYY')
to_timestamp(text, text)
to_timestamp('05/12/2000 12:00:00', 'DD/MM/YYYY HH24:MI:SS')
datestyle
generate_series(timestamp_debut, timestamp_fin, intervalle)
CREATE VIEW vue (colonne ...) AS SELECT ...
SELECT * FROM vue;
GRANT
REVOKE
security_barrier
INSTEAD OF
PREPARE
EXECUTE
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ name ] ON table_name ( { column_name | ( expression ) } [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) [ TABLESPACE tablespace_name ] [ WHERE predicate ]
SELECT * FROM taches WHERE fait IS false ORDER BY date_rendu;
CREATE INDEX ON taches(date_rendu) WHERE fait IS false;
SELECT * FROM employes WHERE upper(nom)='DUPONT';
CREATE INDEX ON employes(upper(nom));
identifiant, nom_attribut, valeur
float
double
numeric(x, y)
LIKE
Le problème est similaire à tout autre langage :
Cette requĂŞte d'exemple :
SELECT matricule, nom, prenom, nom_service, fonction, localisation FROM employes emp JOIN services ser ON (emp.num_service = ser.num_service) WHERE ser.localisation = 'Nantes';
L'objet de ce module est de comprendre son plan d'exécution :
Hash Join (cost=1.06..2.29 rows=4 width=48) Hash Cond: (emp.num_service = ser.num_service) -> Seq Scan on employes emp (cost=0.00..1.14 rows=14 width=35) -> Hash (cost=1.05..1.05 rows=1 width=21) -> Seq Scan on services ser (cost=0.00..1.05 rows=1 width=21) Filter: ((localisation)::text = 'Nantes'::text)
pg_class
relpages
reltuples
pg_statistic
pg_stats
CREATE STATISTICS
default_statistics_target = 100
Configurable par colonne
ALTER TABLE nom ALTER [ COLUMN ] colonne SET STATISTICS valeur;
300 * default_statistics_target
PostgreSQL dispose de la parallélisation depuis la version 9.6. Cela ne concernait que les jointures de type Nested Loop et Hash Join. Quant au Merge Join, il a fallu attendre la version 10 pour que la parallélisation soit supportée.
SELECT * FROM t1 WHERE c1=1 AND c2=1
c1=1
c2=1
SELECT * FROM commandes WHERE extract('year' from date_commande) = 2014;
extract
SELECT * FROM t1 WHERE c2 LIKE 'x%';
Delete (actual time=111.251..111.251 rows=0 loops=1) -> Hash Join (actual time=1.094..21.402 rows=9347 loops=1) -> Seq Scan on lot_a30_descr_lot (actual time=0.007..11.248 rows=34934 loops=1) -> Hash (actual time=0.501..0.501 rows=561 loops=1) -> Bitmap Heap Scan on lot_a10_pdl (actual time=0.121..0.326 rows=561 loops=1) Recheck Cond: (id_fantoir_commune = 320013) -> Bitmap Index Scan on... (actual time=0.101..0.101 rows=561 loops=1) Index Cond: (id_fantoir_commune = 320013) Trigger for constraint fk_lotlocal_lota30descrlot: time=1010.358 calls=9347 Trigger for constraint fk_nonbatia21descrsuf_lota30descrlot: time=2311695.025 calls=9347 Total runtime: 2312835.032 ms
SELECT DISTINCT t1.* FROM t1 JOIN t2 ON (t1.id=t2.t1_id);
Prédicat incluant une transformation :
WHERE col1 + 2 > 5
Opérateur non-supporté par l'index :
WHERE col1 <> 'valeur';
effective_cache_size
NOT EXISTS
UNION ALL
LATERAL
SELECT c1 FROM t1 WHERE c1<10
SELECT pg_class.relname, pg_class.reltuples FROM pg_class LEFT JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid;