# SQL
## Script
```sql
CREATE TABLE Gare
(
nom VARCHAR NOT NULL,
ville VARCHAR NOT NULL,
adresse VARCHAR NOT NULL,
horaire VARCHAR NOT NULL,
PRIMARY KEY (nom, ville)
);
CREATE TABLE Ligne (
code INTEGER PRIMARY KEY,
nom VARCHAR NOT NULL
);
CREATE TABLE Hotel (
adresse VARCHAR PRIMARY KEY,
nom VARCHAR NOT NULL,
nb_etoiles INTEGER NOT NULL
);
CREATE TABLE Taxi (
numero INTEGER PRIMARY KEY,
marque VARCHAR NOT NULL,
tarif INT NOT NULL,
tel INT NOT NULL
);
CREATE TYPE type_de_transport AS ENUM(
'bus',
'velo',
'tramway'
);
CREATE TABLE Transport (
numero INTEGER PRIMARY KEY,
compagnie VARCHAR NOT NULL,
tarif INTEGER NOT NULL,
type type_de_transport NOT NULL
);
CREATE TYPE type_de_statut AS ENUM(
'voyageur',
'grandVoyageur',
'grandVoyageurPlus'
);
CREATE TABLE Voyageur (
id SERIAL PRIMARY KEY,
nom VARCHAR NOT NULL,
prenom VARCHAR NOT NULL,
adresse VARCHAR NOT NULL,
num_tel VARCHAR(10) NOT NULL,
num_carte VARCHAR(16) UNIQUE,
statut type_de_statut,
regulier BOOLEAN NOT NULL,
CHECK(NOT(regulier AND num_carte IS NULL)OR(statut IS NULL)),
CHECK(NOT(regulier AND (num_carte IS NULL OR statut IS NULL)))
);
CREATE TYPE type_de_train AS ENUM(
'RER',
'TER',
'TGV'
);
CREATE TABLE Train(
num INTEGER PRIMARY KEY,
placemax INTEGER,
classe1 BOOL,
vitessemax INTEGER,
type type_de_train,
CHECK((type='RER' AND NOT classe1 AND vitessemax=90) OR (type='TER' AND classe1 AND vitessemax=200) OR (type='TGV' AND classe1 AND vitessemax=350))
);
CREATE TABLE RegulierC(
id SERIAL PRIMARY KEY,
lundi BOOLEAN,
mardi BOOLEAN,
mercredi BOOLEAN,
jeudi BOOLEAN,
vendredi BOOLEAN,
samedi BOOLEAN,
dimanche BOOLEAN
);
CREATE TABLE ExceptionnelC(
id SERIAL PRIMARY KEY,
ajout BOOLEAN,
jour_debut DATE,
jour_fin DATE,
CHECK (jour_debut <= jour_fin)
);
CREATE TABLE Arret(
rang INTEGER,
code_ligne INTEGER,
nom_gare VARCHAR,
ville VARCHAR,
PRIMARY KEY(rang, code_ligne),
FOREIGN KEY (code_ligne) REFERENCES Ligne (code),
FOREIGN KEY (nom_gare, ville) REFERENCES Gare(nom, ville )
);
CREATE TABLE Horaire(
id SERIAL PRIMARY KEY,
arrivee TIME,
depart TIME,
train INTEGER REFERENCES Train(num),
rang INTEGER,
code_ligne INTEGER,
FOREIGN KEY(rang, code_ligne) REFERENCES Arret(rang, code_ligne),
regulierC INTEGER REFERENCES RegulierC(id)
);
CREATE TABLE Billet (
id SERIAL PRIMARY KEY,
gare_depart VARCHAR,
depart TIME,
gare_arrivee VARCHAR,
arrivee TIME,
assurance BOOLEAN,
prix INTEGER
);
CREATE TABLE Trajet(
id INTEGER,
place INTEGER,
horaire_depart INTEGER,
horaire_arrivee INTEGER,
PRIMARY KEY(place, id),
FOREIGN KEY (id) REFERENCES Billet(id),
FOREIGN KEY (horaire_depart) REFERENCES Horaire(id),
FOREIGN KEY (horaire_arrivee) REFERENCES Horaire(id)
);
CREATE TYPE type_de_paiement AS ENUM(
'espece',
'CB',
'cheque'
);
CREATE TABLE Reservation(
id_billet INTEGER,
id_voyageur INTEGER,
paiement type_de_paiement,
PRIMARY KEY(id_billet, id_voyageur),
FOREIGN KEY (id_billet, id_voyageur) REFERENCES Reservation(id_billet, id_voyageur)
);
CREATE TABLE Propose_taxi (
num_taxi INTEGER,
id_billet INTEGER,
id_voyageur INTEGER,
PRIMARY KEY (num_taxi, id_billet, id_voyageur),
FOREIGN KEY (num_taxi) REFERENCES Taxi(numero),
FOREIGN KEY (id_billet, id_voyageur) REFERENCES Reservation(id_billet, id_voyageur)
);
CREATE TABLE Propose_hotel(
adresse VARCHAR,
id_billet INTEGER,
id_voyageur INTEGER,
PRIMARY KEY(adresse, id_billet, id_voyageur),
FOREIGN KEY (adresse) REFERENCES Hotel(adresse),
FOREIGN KEY (id_billet, id_voyageur) REFERENCES Reservation(id_billet, id_voyageur)
);
CREATE TABLE Propose_transport (
numero INTEGER,
id_billet INTEGER,
id_voyageur INTEGER,
PRIMARY KEY (numero, id_billet, id_voyageur),
FOREIGN KEY (numero) REFERENCES Transport(numero),
FOREIGN KEY (id_billet, id_voyageur) REFERENCES Reservation(id_billet, id_voyageur)
);
CREATE TABLE ExceptionnelC_Horaire(
id_horaire INTEGER,
exceptionnelC INTEGER,
FOREIGN KEY (id_horaire) REFERENCES Horaire(id),
FOREIGN KEY (exceptionnelC) REFERENCES ExceptionnelC(id)
);
CREATE VIEW verifLigne (code_ligne) AS
SELECT Horaire.code_ligne
FROM Horaire
JOIN Train ON Horaire.train = Train.num
WHERE Horaire.code_ligne <> Train.code_ligne
Cette requête ne doit rien retourner (={}).
CREATE VIEW verifTrain (train) AS
SELECT H.train
FROM Trajet T,Horaire H
WHERE T.horaire_depart = H.id
Ces deux résultats doivent être égaux.
=> Ces 2 contraintes complexes doivent être traitées dans la partie applicative avec des vues.
```
## Insertion de données
```sql
INSERT INTO Gare VALUES ('Gare de Compiègne', 'Creil', '7 rue de la Paix', 'UTC + 12');
INSERT INTO Gare VALUES('Gare Saint-Lussier', 'Le Havre', '107 rue de la jointure', 'UTC+12');
INSERT INTO Gare VALUES('Gare de Youcef', 'Compi', '18 avenue de la clé primaire', 'UTC+12');
INSERT INTO Ligne VALUES(12, 'Ligne de Compi');
INSERT INTO Hotel VALUES('12 rue de la Villette', 'Ibis budget', 2);
INSERT INTO Taxi VALUES (206318, 'tesla', 50, 0678903617);
INSERT INTO Transport VALUES (3, 'Ville de Compiegne', 4, 'bus');
INSERT INTO Transport VALUES (2, 'Vélotic', 5, 'velo');
INSERT INTO Voyageur(nom,prenom,adresse,num_tel,num_carte,regulier) VALUES('Jean','AIMARE','5 avenue Foch Paris','066666666', 1234563263526373, false );
INSERT INTO Train VALUES (212, 378, true, 200, 'TER');
INSERT INTO RegulierC VALUES (1,false,true,false,true,false,false,false);
INSERT INTO ExceptionnelC VALUES (1, true, '2021-10-23', '2021-11-04');
INSERT INTO Arret VALUES(1,12,'Gare de Compiègne','Creil');
INSERT INTO Arret VALUES(7,12,'Gare de Youcef','Compi');
INSERT INTO Horaire(arrivee, depart, train, rang,code_ligne) VALUES ('03:07:00','07:09:00', 212, 1, 12);
INSERT INTO Horaire(arrivee, depart, train, rang, code_ligne) VALUES ('11:00:00','11:00:30', 212, 7, 12);
INSERT INTO Billet VALUES(1, 'Gare de Compiègne','00:11:00','Gare Saint-Lussier','00:13:03',false,1);
INSERT INTO Trajet VALUES(1,58,1,2);
INSERT INTO Reservation VALUES(1, 1, 'CB');
INSERT INTO Propose_taxi VALUES(206318, 1, 1);
INSERT INTO Propose_hotel VALUES('12 rue de la Villette', 1,1);
INSERT INTO Propose_transport VALUES(2,1,1);
INSERT INTO ExceptionnelC_Horaire VALUES(1, 1);
```