Définition
Le SQL est un langage standardisé utilisé pour interagir avec des bases de données relationnelles.
Il permet de créer, manipuler, interroger et gérer les données stockées dans des tables.
SQL est un language normé dont la dernière version est SQL:2023.
Caution
Les SGBD ne respectent pas exactement la norme SQL.
À un niveau avancé d’utilisation, il y a des différences entre les SGBD.
CREATE TABLE echecs.joueuse (
id_joueuse SERIAL PRIMARY KEY,
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50) NOT NULL,
date_naissance TIMESTAMP,
elo INT CHECK (elo > 0),
mail VARCHAR(100) UNIQUE,
est_arbitre BOOLEAN DEFAULT false,
code_pays VARCHAR(2),
taux_victoires FLOAT CHECK (taux_victoires BETWEEN 0 AND 1)
);
Contraintes
NOT NULL
: l’attribut doit être renseignéUNIQUE
: chaque valeur de l’attribut est unique (pas de doublons)CHECK
: pour vérifier la cohérence d’un attributUtile lorsque le nombre de tables devient grand.
CREATE TABLE echecs.club (
id_club SERIAL PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
ville VARCHAR(100) NOT NULL,
date_creation DATE
);
Déplacer la table joueuse dans le schéma echecs :
Schéma par défaut
Par défaut les objets sont créés dans le schéma public
.
Ça devient rapidement un joyeux bazar si on ne range pas ses tables.
Modifier le type :
Renommer :
Ajout :
Suppression :
id_club
ALTER TABLE echecs.joueuse
ADD CONSTRAINT fk_id_club
FOREIGN KEY (id_club)
REFERENCES echecs.club(id_club);
Clé étrangère
Dans la table joueuse, l’attribut id_club
a pour valeur soit :
id_club
de la table clubWarning
Cette opération est irréversible !
Elle supprime définitivement :
Pourquoi l’on n’insère pas la colonne id_club ? 😕
La colonne id_club est une séquence gérée par le SGBD.
Les valeurs sont générées automatiquement à l’insertion et la séquence est incrémentée (1, 2, 3…).
Séquences
Il est possible de créer et gérer ses propres séquences :
SELECT * FROM <schema>.<table>
pour tout afficher.
id_club | nom | ville | date_creation |
---|---|---|---|
1 | C’Chartres Echecs | Chartres | 1991-09-01 |
2 | Bischwiller | Bischwiller | 1976-09-01 |
3 | Asnieres - le Grand Echiquier | Asnieres | 1987-03-20 |
4 | Tours des Hauts-De-France | Saint-Quentin | 1999-12-01 |
Listez les colonnes à afficher après le SELECT
nom | prenom | elo |
---|---|---|
Guichard | Pauline | 2357 |
Daulyte-Cornette | Deimante | 2371 |
Navrotescu | Andreea | 2338 |
Sebag | Marie | 2448 |
Millet | Sophie | 2366 |
Skrichempko | Almira | 2361 |
Filtrez sur les lignes avec une clause WHERE
.
nom | prenom | elo |
---|---|---|
Sebag | Marie | 2448 |
Le mot clé AND
permet d’ajouter d’autres filtres.
nom | prenom | elo |
---|---|---|
Navrotescu | Andreea | 2338 |
Skrichempko | Almira | 2361 |
Vous pouvez autoriser plusieurs conditions avec OR
.
nom | prenom | elo |
---|---|---|
Sebag | Marie | 2448 |
Navrotescu | Andreea | 2338 |
Skrichempko | Almira | 2361 |
AND
, OR
et NOT
SELECT *
FROM echecs.joueuse
WHERE prenom LIKE 'A%' -- commence par A
OR prenom LIKE '%A' -- termine par A
OR prenom LIKE '%A%' -- contient au moins un A
OR UPPER(prenom) LIKE '%A%' -- contient au moins un A ou un a
OR prenom LIKE 'A__' -- commence par A suivi de 2 autres caractères
%
: représente entre 0 et une infinité de caractères_
: représente exactement 1 caractèreLIKE est sensible à la Casse
MAJUSCULES ≠ minuscules
BETWEEN
permet de spécifier une plage de valeurs numériques.
nom | prenom | elo |
---|---|---|
Guichard | Pauline | 2357 |
Daulyte-Cornette | Deimante | 2371 |
Millet | Sophie | 2366 |
Skrichempko | Almira | 2361 |
Vous pouvez spécifier qu’un attribut doit appartenir à un liste avec IN
.
Ou inversement avec NOT IN
.
nom | prenom | elo |
---|---|---|
Daulyte-Cornette | Deimante | 2371 |
Millet | Sophie | 2366 |
ORDER BY
pour ordonner selon plusieurs colonnes.
nom | prenom | elo |
---|---|---|
Navrotescu | Andreea | 2338 |
Guichard | Pauline | 2357 |
Skrichempko | Almira | 2361 |
Millet | Sophie | 2366 |
Daulyte-Cornette | Deimante | 2371 |
Sebag | Marie | 2448 |
nom | prenom | elo |
---|---|---|
Guichard | Pauline | 2357 |
Daulyte-Cornette | Deimante | 2371 |
Navrotescu | Andreea | 2338 |
Imaginons que vous souhaitez modifier le elo
de toutes les joueuses.
Warning
Généralement un message d’avertissement vous demande si vous êtes certain de vouloir mettre à jour toutes les lignes.
Supprimer une joueuse :
Vider la table :
Et si ? Vous avez exécuté par erreur :
DELETE FROM echecs.joueuse;
😱
Il y a un système de transactions avec les mots clés :
Auto-commit
Attention : il n’y a pas de garde-fou lorsque vous êtes en Auto-commit.
Quelques opérations avec le type DATE
.
SELECT nom,
prenom,
EXTRACT(YEAR FROM date_naissance) AS annee_naissance,
date_naissance + INTERVAL '10 years' AS anniv_dix_ans,
AGE(CURRENT_DATE, date_naissance) AS age
FROM echecs.joueuse
WHERE date_naissance >= '1991-04-20'
OR date_naissance BETWEEN '1991-04-20' AND '1992-12-31'
OR EXTRACT(MONTH FROM date_naissance) = 4;
Pour stocker la date et l’heure
INSERT INTO echecs.club (nom, ville, date_creation)
VALUES ('C''Chartres Echecs', 'Chartres', '1991-09-01 20:00:00');
INSERT INTO echecs.club (nom, ville, date_creation)
VALUES ('Bischwiller', 'Bischwiller', CURRENT_TIMESTAMP);
Vous pouvez utiliser également sur le type TIMESTAMP :
EXTRACT
,BETWEEN
,Joueuses dont le mail n’est pas renseigné :
Et inversemenent :
La fonction COALESCE
En PostgreSQL, la fonction COALESCE :
La requête ci-dessus va afficher :
pas de contact
00.00.00.00.00
nom_complet | elo |
---|---|
Guichard Pauline | 2357 |
Daulyte-Cornette Deimante | 2371 |
Navrotescu Andreea | 2338 |
Sebag Marie | 2448 |
Millet Sophie | 2366 |
Skrichempko Almira | 2361 |
Le mot clé DISTINCT
permet de supprimer les doublons.
Afficher un échantillon aléatoire de 10 % des lignes