Tables
Un Système de Gestion de Base de Données (SGBD) est un logiciel qui permet de :
Exemples de SGBD :
Il existe de très nombreux types de données que l’on peut stocker, les principaux :
Plus de détails sur la documentation PostgreSQL.
Une Table
est composée de lignes et de colonnes :
ligne
représente un enregistrement spécifiquecolonne
représente un attribut particulier de ces enregistrementsClé primaire
(PK) : colonne ou un ensemble de colonnes qui identifie de manière unique chaque enregistrement dans une table
Une clé étrangère (FK) :
1..1
: Une Personne a un Passeport et un Passeport appartient à une seule Personne
1..*
: Une Joueuse joue pour une seule équipe Equipe. Une Equipe est composée de plusieurs Joueuses
*..*
: Un Etudiant suit plusieurs Cours et un Cours et suivi par plusieurs Etudiants
id_joueuse | nom | prenom | date_naissance | code_pays |
---|---|---|---|---|
1 | Sebag | Marie | 1986-10-15 | FR |
2 | Polgar | Judit | 1976-07-23 | HU |
3 | Hou | Yifan | 1994-02-27 | CN |
4 | Kosteniuk | Alexandra | 1984-04-23 | CH |
5 | Ju | Wenjun | 1991-01-31 | CN |
code_pays | nom |
---|---|
CH | Suisse |
CN | Chine |
FR | France |
HU | Hongrie |
id_joueuse | nom | prenom | date_naissance | code_pays |
---|---|---|---|---|
1 | Sebag | Marie | 1986-10-15 | FR |
2 | Polgar | Judit | 1976-07-23 | HU |
3 | Hou | Yifan | 1994-02-27 | CN |
4 | Kosteniuk | Alexandra | 1984-04-23 | CH |
5 | Ju | Wenjun | 1991-01-31 | CN |
id_joueuse | id_tournoi |
---|---|
1 | 1 |
1 | 2 |
3 | 2 |
4 | 1 |
4 | 2 |
id_tournoi | nom | ville |
---|---|---|
1 | Norway Chess | Oslo |
2 | Tata Steel | Wijk aan Zee |
SQL permet d’effectuer les opérations du CRUD :
SELECT
: récupérer des données depuis une tableINSERT
: insérer de nouvelles données dans une tableUPDATE
: mettre à jour des données existantesDELETE
: supprimer des données d’une tableCRUD
Create, Read, Update, Delete
id_personne | nom | prenom | date_naissance | adresse |
---|---|---|---|---|
1 | Gatore | Ali | 1990-05-15 | Amiens |
2 | Dure | Laure | 1985-09-22 | Auxerre |
3 | Erateur | Maud | 1995-03-10 | Lille |
Si ensuite, vous essayez :
ERREUR: la relation « personne » n’existe pas
Pour afficher tout le contenu d’une table.
SELECT *
FROM personne
WHERE adresse LIKE 'A%'
AND prenom = 'Laure'
AND adresse IN ('Amiens', 'Auxerre')
AND adresse IS NOT NULL
AND adresse != 'Lille'
AND id_personne BETWEEN 2 AND 3;
Tip
Pour une meilleure lisibilité, alignez votre code !
id_personne | prenom | nom | date_naissance | adresse |
---|---|---|---|---|
2 | Laure | Dure | 1985-09-22 | Auxerre |
La clause LIKE
est utilisée pour rechercher un texte spécifique dans une colonne de texte
%
représente zéro, un ou plusieurs caractères_
représente un seul caractèrePour ensuite faire revivre Ali :
id_personne | prenom | nom | date_naissance | adresse |
---|---|---|---|---|
2 | Laure | Dure | 1985-09-22 | Amiens |
3 | Maud | Erateur | 1995-03-10 | Lille |
Vous pouvez ajouter une valeur par défaut.
id_personne | nom | prenom | dnais | adresse | joue_echecs |
---|---|---|---|---|---|
1 | Gatore | Ali | 1990-05-15 | Amiens | true |
2 | Dure | Laure | 1985-09-22 | Amiens | true |
3 | Erateur | Maud | 1995-03-10 | Lille | true |
Le mot clé AS
permet de renommer une colonne à l’affichage.
⚠️ Il ne change pas le nom de la colonne.
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 ?
USING
Si et seulement si les 2 colonnes qui permettent de faire la jointure ont le même nom.
↪️ Alors vous pouvez utiliser cette syntaxe avec USING.
id_personne | nom | prenom | dnais | adresse |
---|---|---|---|---|
1 | Gatore | Ali | 1990-05-15 | Amiens |
2 | Dure | Laure | 1985-09-22 | Amiens |
3 | Erateur | Maud | 1995-03-10 | Lille |
Créer et insérer les données
CREATE TABLE commande (
id_commande INT PRIMARY KEY,
produit VARCHAR(50),
quantite INT,
prix_unitaire DECIMAL(10, 2),
id_personne INT,
FOREIGN KEY (id_personne) REFERENCES personne(id_personne)
);
INSERT INTO commande (id_commande, produit, quantite, prix_unitaire, id_personne) VALUES
(1, 'livre', 1, 10, 2),
(2, 'pain', 3, 2, 3),
(3, 'pomme', 10, 0.5, 2);
id_commande | produit | quantite | prix_unitaire | id_personne |
---|---|---|---|---|
1 | livre | 1 | 10 | 2 |
2 | pain | 3 | 2 | 3 |
3 | pomme | 10 | 0.5 | 2 |
prenom | produit | quantite |
---|---|---|
Laure | livre | 1 |
Laure | pomme | 10 |
Maud | pain | 3 |
Dans la jointure précédente :
Comment faire pour inclure Ali dans le tableau même sans commande ?
LEFT JOIN
signifie que l’on garde tout le contenu provenant de la table précédenteRIGHT JOIN
pour faire l’inverseprenom | produit | quantite |
---|---|---|
Laure | livre | 1 |
Laure | pomme | 10 |
Maud | pain | 3 |
Ali |
La jointure externe effectuée avec le mot clé LEFT JOIN
indique que nous affichons :
Pour filter après un GROUP BY
Une relation est de première forme normale (1NF) si
Attribut atomique
id | nom |
---|---|
1 | Ali Gator |
2 | Laure Dure |
3 | Maud Erateur |
Cette table ne respecte pas la 1NF car son attribut nom n’est pas atomique.
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.
Créer un schéma pour le projet info
À la création, stocker la table dans le schéma
Préciser le schéma lors des requêtes