Données utilisées
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)
);
Vous souhaitez lister les joueuses avec un elo supérieur à la moyenne.
SELECT *
FROM echecs.club c
WHERE EXISTS (SELECT 1
FROM echecs.joueuse j
WHERE c.id_club = j.id_club
AND j.elo > 2400);
La syntaxe ressemble à celle du IN
mais le EXISTS
est plus performant.
Question
Imaginons que nous avons de nombreuses requêtes à écrire sur les joueuses françaises ayant plus de 2000 elo.
Et nous n’avons pas envie de nous embêter à écrire à chaque fois toutes les restrictions.
Solution 1 : créons une nouvelle table
CREATE TABLE echecs.joueuse_fr_2000
AS
SELECT *
FROM echecs.joueuse
WHERE code_pays = 'FR'
AND elo >= 2000
Problèmes
Pour une utilisation ponctuelle, utilisez une CTE 😎
WITH
N’existe que le temps de la session.
CREATE TEMPORARY TABLE joueuses_fr_elo2000
AS
SELECT *
FROM echecs.joueuse
WHERE code_pays = 'FR'
AND elo > 2000;
Remarque
Une table temporaire n’est pas définie dans un schéma.
Définition
Une vue représente une table virtuelle, dont la structure et les données proviennent du résultat d’une requête SQL prédéfinie.
Elle ne stocke pas directement les données, mais la requête elle-même, et s’exécute à chaque utilisation.
Photo à un instant t (snapshot) 📷
L’utilisateur qui crée une table peut distribuer des droits aux autres.
Voir section priviléges de la doc PostgreSQL
-- Lecture pour tous
GRANT SELECT ON echecs.joueuse TO PUBLIC;
-- Tous les droits
GRANT ALL PRIVILEGES ON echecs.joueuse TO chantal WITH GRANT OPTION;
PUBLIC
: tous les utilisateursWITH GRANT OPTION
pour donner le droit de transmettre ce droit-- Lecture
REVOKE SELECT ON echecs.joueuse TO chantal;
-- Tous les droits
REVOKE ALL PRIVILEGES ON echecs.joueuse TO chantal;
Suffixe CASCADE
pour retirer les droits à ceux qui ont reçu les droits de la part de…
Pour une gestion simplifiée des droits
-- droit d'accès au schéma i.e. de consulter les objets du schéma
GRANT USAGE ON SCHEMA echecs TO PUBLIC;
-- retire à Chantal le droit de créer de nouveaux objets (tables, vues, etc.) dans le schéma
REVOKE CREATE ON SCHEMA echecs FROM chantal;
-- Autorise à effectuer des requêtes SELECT sur toutes les tables du schéma
GRANT SELECT ON ALL TABLES IN SCHEMA echecs TO PUBLIC;
Mission
Vous devez transférer discrétement et sans vous tromper 10 millions entre les comptes de Shakira et Cristiano.
Malheureusement l’opération est assez longue et vous devez vous prémunir contre le risque d’une interruption.
Comment faire ? 😕
BEGIN; -- Début de la transaction
UPDATE compte SET solde = solde - 10000000 WHERE id = 1;
UPDATE compte SET solde = solde + 10000000 WHERE id = 2;
COMMIT; -- Valider si ok
Pour définir la fiabilité des transactions :
Définition
Un index est une structure de données qui améliore la vitesse des opérations de lecture sur une table en facilitant la recherche des données.
Il permet une lecture plus rapide sur une colonne utilisée fréquemment dans WHERE, JOIN, GROUP BY, ORDER BY
Définition
Un trigger est une fonction qui s’exécute automatiquement en réponse à une mise à jour d’une table
Il permet par exemple de :