04 Bases SQL Postgres - damiencorpataux/infradon1 GitHub Wiki
Un SGBDR comme Postgres permet de gérer des données relationnelles. Ces données sont stockées sous forme d'enregistrements dans des tables composées de colonnes, chaque colonne étant définie par un type, et d'autres options comme des index, des contraintes, etc.
Les tables peuvent être organisées par projet dans une database, éventuellement sous-organisés via des schemas. Ce sont les schémas qui contiennent directement les tables qui contiennent nos précieuses données.
Entre les tables, il y a des relations sous forme de clés étrangères qui sont à la base du concept de données relationnelles. Dans Postgres, chacun de ces élément est un objet.
Pour actionner le tout, c'est à dire créer une DATABASE et des TABLES contenant des COLUMNs, pour ensuite y INSERT INTO des données, nous utilisons: des instructions SQL.
Dans Postgres, pour organiser nos données, nous trouverons notamment les objets suivants:
-
DATABASE: Objet racine d'un ensemble de données (personnes, clients, commandes, paiements, etc.), les databases sont cloisonnées et n'ont pas accès entre elles -
SCHEMA: Objet permettant de séparer les tables en groupes sémantiquement cohérents - nous utilisons uniquement le schéma par défautpublic -
TABLE: Permet de définir un entité et ses champs (terme relationnel: les colonnes) -
COLUMN: Objet représentant un champs d'une entité -
TYPE: Objet définissant le type de donnée contenu dans un colonne (booléen, numérique, caractère, chaîne de caractère, etc.) -
FOREIGN KEY: Objet créant une référence vers une autre colonne - d'une autre table, ou de la même table pour créer une récusrivité (!) -
CONSTRAINT: Objet permettant le contrôle des données lors de la modification de données -
INDEX: Objet permettant d'accélérer l'interrogation des données

Notez que nous pouvons classer les commandes SQL en deux groupes:
- La partie structure:
CREATE,ALTER,DROP - La partie contenu:
INSERT INTO,UPDATE,DELETE FROM,SELECT

Postgres met donc à disposition un ensemble d'objets qui nous permettent d'implémenter la structure de notre base de données, en fonction du modèle de données que nous avons conceptualisé en amont.
-
\cou\connect(danspsql): Changer la base de données active (celle où on est en train de travailler) -
\lou\list(danspsql): Lister les bases de données existantes
https://www.postgresql.org/docs/current/sql-createdatabase.html -
\d: Lister les table de la database active -
\d <table>: Lister le détail d'une table (colonnes et types, contraintes, index, etc.) -
CREATE DATABASE: Créer base de données
https://www.postgresql.org/docs/current/sql-createdatabase.html -
ALTER DATABASE: Modifier les paramètres d'une base de données (ceci influence sont comportement et son fonctionnement)
https://www.postgresql.org/docs/current/sql-alterdatabase.html -
DROP DATABASE: Supprimer une base de données
https://www.postgresql.org/docs/current/sql-dropdatabase.html -
pg_dump -U postgres -t 'contact' --schema-only micromessenger(depuis un shell système): Obtenir la description SQL d'une table -
pg_dump -U postgres --schema-only micromessenger(depuis un shell système): Obtenir la définition SQL d'une database -
pg_dump -U postgres --schema-only micromessenger(depuis un shell système): Obtenir la description SQL d'une database et toutes ses données
-
CREATE TABLE: Créer
https://www.postgresql.org/docs/current/sql-createtable.html -
\d(danspsql): Lister -
ALTER TABLE: Modifier
https://www.postgresql.org/docs/current/sql-altertable.html -
DROP TABLE: Supprimer
https://www.postgresql.org/docs/current/sql-droptable.html
Au sens large, un type de donnée définit la manière dont une donnée va être encodée (en binaire) lors de son insertion dans un système numérique - ici un SGBDR.
Parmi les types les plus répandus, nous avons par exemple:
- Booléen (
BOOLEAN) - Nombre entier (
SMALLINT,INTEGER,BIGINT) - Nombre à virgule flottante (
NUMERIC) - Chaine de caractère à longueur variable (
VARCHAR) - Chaine de caractère à longueur arbitraire (
TEXT) - Séquqnce (
SERIAL), nombre auto-incrémenté utilisé pour les clés primaire
https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL - Tous les types:
https://www.postgresql.org/docs/current/datatype.html
-
PRIMARY KEY: Traîte la colonne comme PRIMARY KEY: notamment, applique une index UNIQUE sur la colonne
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-PRIMARY-KEYS
Exemple: `` -
FOREIGN KEY <definition>: Applique une contraine de type FOREIGN KEY sur la colonne
https://www.postgresql.org/docs/current/tutorial-fk.html
Exemple:status_id INTEGER REFERENCES status(id) -
NOT NULL: Applique une containe NOT NULL sur la colonne (la colonne ne peut pas contenir une valeurNULL)
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-NOT-NULL
Exemple:name TEXT NOT NULL -
DEFAULT <value>: Assigne une valeur par défaut sur la colonne (appliquée lorsqueINSERT INTOne spécifie pas de valeur pour la colonne)
https://www.postgresql.org/docs/current/ddl-default.html
Exemple:name TEXT DEFAULT 'Anonymous' -
UNIQUE: Crée un index UNIQUE sur la colonne
https://www.postgresql.org/docs/current/indexes-unique.html
Exemple:name TEXT UNIQUE - Il existe une multitude de qualifiers:
https://www.postgresql.org/docs/7.2/sql-createtable.html
Exemple:name TEXT NOT NULL UNIQUE DEFAULT 'Anonymous'
Exemple:status_id INTEGER NOT NULL UNIQUE DEFAULT 1
Par exemple:
CREATE TABLE contact (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
status_id INTEGER DEFAULT 1,
CONSTRAINT status_id FOREIGN KEY(status_id) REFERENCES status(id)
)Dans Postgres, nous trouvons:
- Les types built-in: intégrés nativement au système
Doc technique: https://www.postgresql.org/docs/current/datatype.html - Les types personalisé: définissable par le language PL/SQL, que nous ne verrons pas dans ce cours
Par exemple, PostGIS (type géographiques): https://postgis.net/documentation/getting_started/
Les opérateurs:
-
+, eg.SELECT 1+1 -
-, eg.SELECT 10-1 -
*, eg.SELECT 2*2 -
/, eg.SELECT 10/2 -
^, eg.SELECT 3^2- Trouvez sur internet une liste de fonctions built-in Postgres et essayez en quelques unes
- Notez vos essais, résultats et surtout: vos observations personnelles
Les comparateurs:
-
=, eg.SELECT 1=1 -
<, eg.SELECT 1<2 -
>, eg.SELECT 2>1 -
<=, eg.SELECT 1<=2 -
>=, eg.SELECT 2>=1 -
ANDeg.SELECT 1=1 AND 2=2 -
OReg.SELECT 1=1 AND 2=200 -
NOTeg.SELECT NOT 1=1 -
IN, eg.SELECT 1 IN (1, 2, 3)
Exemples complets:
SELECT * FROM contact WHERE id IN (1,2,3)SELECT * FROM contact WHERE id IN (1,2,3) OR id > 100SELECT * FROM contact WHERE id IN (SELECT id FROM status WHERE id IN (1, 3))
-
SUM(), eg.SELECT SUM(1, 2, 3) -
AVG(), eg.SELECT AVG(1, 2, 3) -
CONCAT(), eg.SELECT CONCAT('abc', ' ', 'def') -
COUNT(), eg.SELECT COUNT(*) FROM table- Trouvez sur le web une liste de fonctions built-in dans Postgres, leurs définition et usage - et essayez en quelques unes
- Notez vos essais, résultats et surtout: vos observations personnelles
-
INSERT INTO table VALUES (...): Créer un enregistrement
https://www.postgresql.org/docs/current/sql-insert.html -
DELETE FROM table WHERE ...: Supprimer un ou plusieurs enregistrements
https://www.postgresql.org/docs/current/sql-delete.html -
UPDATE table SET ... WHERE ...: Modifier un ou plusieurs enregistrements
https://www.postgresql.org/docs/current/sql-update.html - Condition (sinon postgres applique l'action sur toute la table):
- Statement:
SELECT
https://www.postgresql.org/docs/current/sql-select.html- Table source:
FROM
https://www.postgresql.org/docs/7.1/queries.html#QUERIES-FROM - Condition:
WHERE
https://www.postgresql.org/docs/7.1/queries.html#QUERIES-WHERE - Jointure:
JOIN
https://www.postgresql.org/docs/current/tutorial-join.html - ...et tous les autres composants d'une requête SQL pour interrogation des données:
https://www.postgresql.org/docs/7.1/queries.html
- Table source:
Opérations de base (sans stockage de données):
SELECT 1+1;SELECT SUM(1, 1);SELECT CONCAT('1' || '1');-
SELECT CONCAT('1' || 1);- lisez bien le message d'erreur - etc...
Opérations sur la structure de données:
CREATE DATABASE mydatabase- List databases (dans
psql:\l) - Select database (dans
psql:\c mydatabase) CREATE TABLE personne (id SERIAL PRIMARY KEY, name TEXT)- List tables (dans
psql:\dou\dt) - Describe table (dans
psql:\d personne)
Opérations sur les données (peuplement du contenu):
INSERT INTO personne (name) VALUES ('Name 1')INSERT INTO personne (name) VALUES ('Nom 2')INSERT INTO personne (name) VALUES ('Näme 3')
Interrogation des données:
SELECT * FROM personneSELECT * FROM personne WHERE name = 'Name 1'SELECT * FROM personne WHERE name = 'Name 1' OR name = 'Nom 2'SELECT * FROM personne WHERE name LIKE 'Name'SELECT * FROM personne WHERE name LIKE 'Name%'SELECT * FROM personne WHERE name LIKE '%'SELECT * FROM personne WHERE name LIKE 'Mon%' OR name LIKE 'Ton%'SELECT * FROM personne WHERE NOT name LIKE 'Son%'SELECT COUNT(*) FROM personneSELECT string_agg(name, ', ') FROM personne
Toutes les commandes SQL:
A l'aide de quelques exemples minimalistes, nous allons démontrer tout le workflow pour passer d'un diagramme de classes (niveau conceptuel) au code SQL (niveau implémentation) pour faire réellement fonctionner notre service SGBDR.
Votre serviteur va vous proposer différents diagrammes, tirés des exemples du cours, que nous allons dériver pour les implémenter au niveau SQL.
...todo
Si vous n'êtes pas présent à cette séance, il vous est fortement recommendé de la rattraper en communiquant avec vos collègues - une grande quantité de connaissance est transmise par la pratique ce jour-là.