Bases de Données Relationnelles et SQL

Author

Ludovic Deneuville

Objectifs

Qu’est-ce qu’une base de données ?

  • Collection organisée de données
  • Stockée électroniquement
  • Structurée pour faciliter l’accès et la gestion
  • Conçue pour minimiser la redondance
  • peut être utilisée par des applications
  • interrogeables, modifiables par les utilisateurs

Base de données relationnelles

  • Organise les données dans des Tables
  • Tables interconnectées
  • Tables structurées
  • Table = tableau

SGBD

Un Système de Gestion de Base de Données (SGBD) est un logiciel qui permet de :

  • stocker
  • organiser
  • gérer des données de manière structurée

Exemples de SGBD :

  • relationnelles : PostgreSQL, MySQL, Oracle Database
  • NoSQL : MongoDB, Cassandra
  • SGBD : interface principale avec les données
  • Pour nous PostgreSQL, gratuit, libre, installé VM
  • NoSQL : Not Only SQL

Kesako

  • PostgreSQL : SGBD
  • DBeaver : outil client qui permet de se connecter à un SGBD
  • SQL : langage de programmation conçu pour gérer et manipuler des bases de données relationnelles.

On parle de SQL ensuite

Types de données

Il existe de très nombreux types de données que l’on peut stocker, les principaux :

  • Chaîne de caractères
  • Numérique
  • Booléen
  • Date, Temps
  • Géométrique

Plus de détails sur la documentation PostgreSQL.

  • Date, Temps -> plein de fonctions
  • Géométrique -> contours géographiques

Types - exemple

CREATE TABLE personne (
    id_personne      SERIAL PRIMARY KEY,
    nom              VARCHAR(100) NOT NULL,
    prenom           VARCHAR(100) NOT NULL,
    date_naissance   DATE,
    email            VARCHAR(255) UNIQUE,
    nb_enfants       INT CHECK (nb_enfants >= 0),
    taille_m         DECIMAL(3, 2)
    est_actif        BOOLEAN,
    last_updated     TIMESTAMPTZ DEFAULT NOW() 
);
  • SERIAL : séquence
  • NOT NULL : obligatoire
  • UNIQUE : distinctes, mais n’empêche pas les NULL
  • DECIMAL(3, 2) : de -9.99 à 9.99
    • 3 chiffres significatifs dont 2 après la virgule

Code bien aligné, Mots clés en majuscule

Table

Une Table est composée de lignes et de colonnes :

  • une ligne représente un enregistrement spécifique
  • une colonne représente un attribut particulier de ces enregistrements
  • Clé primaire (PK) : colonne ou un ensemble de colonnes qui identifie de manière unique chaque enregistrement dans une table
    • permet d’identifier une ligne sans ambiguïté

PK :

  • obligatoire (non null)
  • unique

Table - exemple

Associations entre tables

Clé étrangère

Une clé étrangère (FK) :

  • permet de faire le lien entre 2 tables
  • c’est une colonne d’une table A
  • elle correspond à la clé primaire d’une table B

Types d’associations

  • 1..1 : Une Personne a un Passeport et un Passeport appartient à une seule Personne
    • clé étrangère dans l’une des 2 tables
  • 1..* : Une Joueuse joue pour une seule équipe Equipe. Une Equipe est composée de plusieurs Joueuses
    • clé étrangère dans la table Joueuse
  • *..* : Un Etudiant suit plusieurs Cours et un Cours et suivi par plusieurs Etudiants
    • table d’association entre Etudiant et Cours

Lien entre 2 tables via une clé étrangère

On supposera ici :

  • Une joueuse a un pays
  • Un pays a plusieurs joueuses

Lien entre 2 tables via une table d’association

  • Une joueuse peut participer a plusieurs tournois
  • Un tournoi accueille plusieurs joueuses

SQL

  • SQL : Structured Query Language
  • Inventé en 1970 par Edgar F. Codd
  • Langage de programmation
  • Utilisé pour gérer et manipuler des bases de données relationnelles
  • très très très utilisé
  • tous les langages qui traitent de la data peuvent encapsuler du SQL

Opérations CRUD

SQL permet d’effectuer les opérations du CRUD :

  • SELECT : récupérer des données depuis une table
  • INSERT : insérer de nouvelles données dans une table
  • UPDATE : mettre à jour des données existantes
  • DELETE : supprimer des données d’une table
CRUD

Create, Read, Update, Delete

Actions sur une table

Créer une Table

Insérer des données

Supprimer une table

DROP TABLE personne;

Si ensuite, vous essayez :

SELECT *
  FROM personne;

ERREUR: la relation « personne » n’existe pas

Actions sur les lignes

Sélectionner tout

Pour afficher tout le contenu d’une table.

SELECT *
  FROM personne;
  • Une requête se termine par un ;
  • Possible de limiter le nombre de lignes affichées
    • LIMIT 5

Filter les lignes

Mettre à jour des lignes

  • simples quotes en SQL
  • pas de double

Supprimer des lignes

Actions sur les colonnes

Sélectionner des colonnes

Renommer une colonne

Ajouter un attribut

Supprimer une colonne

Renommer à l’affichage

Le mot clé AS permet de renommer une colonne à l’affichage.

⚠️ Il ne change pas le nom de la colonne.

Jointures

Alias

Jusqu’à maintenant, nous n’avions qu’une seule table.

Nous savions donc que le champ nom venait de la table personne.

Comment faire si nous faisons une jointure avec une table qui a également une colonne nommée nom ?

SELECT p.nom       -- 2. p.nom : attribut nom de la table d'alias p i.e. personne
  FROM personne p  -- 1. nous déclarons p comme alias de la table personne

Jointure totale

Faire une jointure c’est comme créer un gros tableau fusionné

Types de jointures

Dans la jointure précédente :

  • Laure apparait 2 fois car elle a 2 commandes
  • Maud apparait une fois
  • Ali n’apparait pas

Comment faire pour inclure Ali dans le tableau même sans commande ?

  • jointure interne (INNER JOIN)
    • la valeur de id_personne doit être présente dans les 2 tables
    • sinon id_personne est dans une seule, alors rien n’est affiché la concernant

Jointures externes

Agrégation

GROUP BY

  • Utilisé pour regrouper les résultats en fonction d’une ou plusieurs colonnes
  • Permet l’utilisation de fonctions d’agrégation telles COUNT, SUM, AVG…

HAVING

Pour filter après un GROUP BY

Ordonner les lignes

Possible d’ordonner selon plusieurs colonnes

Formes normales

1ere forme normale

Autres formes normales

  • 2NF : 1NF + tout attribut non clé dépend de la clé
  • 3NF : 2NF + un attribut non clé ne peut pas dépendre d’un autre attribut non clé

Les schémas

Une bonne pratique (non appliquée ici) est de classer nos tables dans différents schémas.

De la même manière que vous rangez des fichiers dans des dossiers, vous vous y retrouverez plus facilement en rangeant les tables dans des schémas.

Si vous ne déclarez pas de shéma lors de la création d’une table, elle va dans le schéma public.

Schémas - exemple

Créer un schéma pour le projet info

CREATE schema projet;


À la création, stocker la table dans le schéma

CREATE table projet.joueuse(
  ...
);


Préciser le schéma lors des requêtes

SELECT *
  FROM projet.joueuse;

SQL sans table

SELECT CURRENT_DATE;
SELECT 1 + 2;
SELECT 1 > 2;
SELECT 'Salut';

Autres notions non abordées

  • ACID, COMMIT, ROLLBACK
  • vues, snapshot
  • index
  • droits : grant / revoke
  • WITH (Common Table Expressions)
  • UNION, INTERSECT, EXCEPT
  • DISTINCT
  • EXISTS
  • SEQUENCE

Bibliographie

Exercice

exercice