Vous êtes sur la page 1sur 53

1.1.

- Siret < <PK> > - Provenance - Nom - Nom


Cinema - Date parution - - Prénom - Prénom
Note - Sex - Sex
Programmation - - ID_film < <PK> > Genre
ID_prog < <PK> > Film - ID_genre < <PK> > -
- Nom
Film Type de film
- Localisation
- Nombre de salles - - Public concerné
- Titre
- Date début - Année
ID_critique < <PK> > - Date fin Rôle
- Réalisateur
- ID_rôle < <PK> >
Critique - Type de personnage -
- ID_acteur < <PK> > - ID_perso < <PK> > Raison sociale
Acteur Personnage

a e

- Siret < <PK> > Cinema - Date début r

g - ID_film < <PK> > Film d

- Date fin
o s

r s

- ID_prog < <PK> > P o

Programmation Film
e

1..*
m

m
- ID_genre < <PK> > Genre - Type de film - Public concerné - ID_critique < <PK> > Critique

e
1..* 1..* 0..*
- Nom Diffuse u
1..* - Date parution - Note
- Titre
o

- Localisation Interprète
- Nombre de salles - Année - Provenance - ID_acteur < <PK> > Acteur
- Réalisateur
- ID_rôle < <PK> > 1..* - Nom - Nom
Rôle - ID_perso < <PK> >
J
- Prénom - Prénom - Sex
- Sex
Personnage
- Type de personnage - Raison sociale
CREATE TABLE Cinema (
siret INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
adresse TEXT NOT NULL,
ville TEXT NOT NULL,
nbSalles INTEGER NOT NULL
);
CREATE TABLE Film (
idFilm INTEGER PRIMARY KEY ,
titre TEXT NOT NULL,
annee TEXT NOT NULL,
realisateur TEXT NOT NULL,
idG INTEGER NOT NULL,
FOREIGN KEY (idG) REFERENCES Genre (idGenre)
);

CREATE TABLE Programmation (


idProg INTEGER PRIMARY KEY ,
dateDebut DATE NOT NULL,
dateFin DATE NOT NULL,
idF INTEGER,
idCine INTEGER,
FOREIGN KEY (idF) REFERENCES Film (idFilm),
FOREIGN KEY (idCine) REFERENCES Cinema (siret)
);

CREATE TABLE Genre (


idGenre TEXT PRIMARY KEY ,
type TEXT NOT NULL,
public TEXTNOT NULL
);

CREATE TABLE Critique (


idCritique INTEGER PRIMARY KEY ,
Provenance TEXT NOT NULL,
dateParution TEXT NOT NULL,
note INTEGER,
idF INTEGER,
FOREIGN KEY (idF) REFERENCES Film (idFilm)
);

CREATE TABLE Personnage (


idPerso INTEGER PRIMARY KEY ,
nom TEXT,
prenom TEXT NOT NULL,
sex TEXT NOT NULL,
idR INTEGER NOT NULL,
FOREIGN KEY (idR) REFERENCES Role (idRole)
);
CREATE TABLE Role (
idRole INTEGER PRIMARY KEY ,
typePerso TEXT NOT NULL,
raisonSociale TEXT NOT NULL
);

CREATE TABLE Casting (


idC INTEGER PRIMARY KEY ,
idA INTEGER,
idF INTEGER,
idP INTEGER,
FOREIGN KEY (idA) REFERENCES Acteur (idActeur),
FOREIGN KEY (idF) REFERENCES Film (idFilm),
FOREIGN KEY (idP) REFERENCES Personnage (idPerso)
);

CREATE TABLE Acteur (


idActeur INTEGER PRIMARY KEY ,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
sexe TEXT NOT NULL
);

DROP TABLE Acteur ;


DROP TABLE Casting;
DROP TABLE Role;
DROP TABLE Personnage;
DROP TABLE Critique;
DROP TABLE Genre;
DROP TABLE Programmation;
DROP TABLE Film;
- Indiana Jones
- Matrix
- MAD MAX : Fury road
- Skyfall
- Interstellar
- Vilaine
- Qu’est-ce qu’on a fait au bon dieu ?
- Qu’est-ce qu’on a encore fait au bon dieu ?

insert into statut values ('etudiant',3,21);

-
o
o
o
o
o

INSERT INTO Cinéma (Siret, nom, adresse, ville, nbSalles) VALUES


(43839079100038, 'Gaumont Nantes', '12 place du commerce', 'Nantes', 12),
(85580165000018, 'Katorza', '3 Rue Corneille', 'Nantes', 6), (34780600200031,
'UGC Atlantis', '12bis Rue des Carmélites', 'Nantes', 5), (53914477400012,
'Le Concorde', '79 Boulevard de l’Égalité', 'Nantes', 4), (66178022100031,
'CGR Angoulême', ' 30 Rue Saint-Roch', 'Angoulême', 10), (50157795100012,
'Cinéma de la Cité', '60 Avenue de Cognac', 'Angoulême', 4);

o
o
o
o
o
INSERT INTO Film (idFilm, titre, annee, realisateur, idG) VALUES
(0, 'Indiana Jones', 1989, 'Steven Spielberg', 13), /* Action*/
(1,'Matrix', 1999,'Lana & Lilly Wachowski',12), /* Fiction*/ (2,
'MAD MAX: Fury road', 2015,'George Miller',13),/* Action*/
(3,'Skyfall', 2012,'Sam Mendes',10),/* Espionnage*/
(4, 'Interstellar', 2014, 'Christopher Nolan', 12), /* Fiction*/ (5,
'Vilaine', 1945, 'Jean Berry Benes & Allan Mauduit', 11), /* Comédie*/ (6,
'Qu’est-ce qu’on a fait au bon dieu ?', 2014, 'Philippe de Chauveron', 11),
(7,'Qu’est-ce qu’on a encore fait au bon dieu ?', 2019,'Philippe de
Chauveron',11);
.

-- Requête 1: liste des cinémas de Nantes, avec leur nom et


localisation SELECT nom, adresse, ville
FROM Cinéma
WHERE ville = 'Nantes';
-- Requête 2: Liste des journaux ayant donné des notes supérieur ou égale à
3 SELECT provenance, note,idf
FROM Critique
WHERE note >= 3;
-- Requête 3: Liste des journaux ayant donné une note supérieure à la moyenne
globale des notes
SELECT provenance, note, idf
FROM Critique
WHERE note >= (SELECT AVG(note)
FROM Critique);
WHERE note >= 3;
--Requête 4: Liste des noms de réalisateurs de film de science-
fiction SELECT realisateur, type
FROM Film
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE type = 'Science fiction';

-- Requête 5: Liste des critiques (provenance et étoile) pour un film donné


(titre, année)
SELECT titre, annee, provenance, note
FROM Film
JOIN Critique
ON Critique.idF = Film.idFilm
WHERE titre = 'Interstellar' AND '11/2014';

-- Requête 6: Liste des films (titre) dans un cinéma (choisir un nom du cinéma)
visibles à une date donnée (choisir une date),
SELECT titre
FROM Film
JOIN Programmation
ON Film.idFilm = Programmation.idF
JOIN Cinema
ON Programmation.idCine = Cinema.siret
WHERE Cinema.nom = 'CGR Angoulême' AND '2014-12-10' BETWEEN dateDebut AND dateFin;
-- Requête 7: Liste des titres de films avec la note moyenne donnée par les
critiques SELECT titre, AVG(note)
FROM Film
JOIN Critique
ON Film.idFilm = Critique.idF
GROUP BY titre;
-- Requête 8: Liste des films (titre) ayant été diffusés à Nantes dans au moins
deux cinémas à une date donnée (choisir une date),
CREATE VIEW Diffusion AS
SELECT titre
FROM Film
JOIN Programmation
ON Film.idFilm = Programmation.idF
JOIN Cinema
ON Programmation.idCine = Cinema.siret
WHERE Cinema.ville = 'Nantes'
AND '1989-09-10' BETWEEN dateDebut AND dateFin;

SELECT titre, COUNT(*) AS nbDiffusion FROM Diffusion


GROUP BY titre
HAVING nbDiffusion >= 2;

-- Requête 9: Liste des acteurs ou actrices (prénom et nom) avec le nombre de


films tournés.
SELECT prenom, nom, COUNT (idF) AS nbFilmsTournes
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
GROUP BY prenom;
-- Requête 10: Liste des actrices ayant tourné le plus de
comédies, CREATE VIEW ActriceComedie AS
SELECT prenom, nom, COUNT(titre) AS nbreComedie
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE sexe = 'F' AND type = 'Comédie'
GROUP BY nom;

SELECT nom, prenom, MAX(nbreComedie)


FROM ActriceComedie;
-- Requête 11: Listes des actrices n’ayant jamais joué dans des
comédies, SELECT prenom, nom
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE sexe = 'F' AND type != 'Comédie';
-- Requête 12 : Liste des acteurs (sexe masculin) ayant joué le rôle de détective
dans un film réalisé par un réalisateur donné (nom du réalisateur), SELECT nom,
prenom
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Personnage
ON Casting.idP = Personnage.idPerso
JOIN Role
ON Personnage.idR = Role.idRole
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'M'
AND raisonSociale = 'espion'
AND realisateur = 'Sam Mendes';
-- Requête 13: Liste des couples d’acteurs (un acteur et une actrice) n’ayant
jamais joué ensemble dans un même film.

CREATE VIEW ActeursFilms AS


SELECT nom, prenom, titre
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'M';

CREATE VIEW ActricesFilms AS


SELECT nom, prenom, titre
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'F';

CREATE VIEW Duos AS


SELECT DISTINCT ActeursFilms.nom AS nomM, ActeursFilms.prenom AS
prenomM, ActricesFilms.nom AS nomF, ActricesFilms.prenom AS prenomF
FROM ActeursFilms
JOIN ActricesFilms
WHERE ActeursFilms.titre != ActricesFilms.titre;

CREATE VIEW Duos_fait AS


SELECT DISTINCT ActeursFilms.nom AS nomM, ActeursFilms.prenom AS
prenomM, ActricesFilms.nom AS nomF, ActricesFilms.prenom AS prenomF
FROM ActeursFilms
JOIN ActricesFilms
WHERE ActeursFilms.titre = ActricesFilms.titre;

SELECT Duos.nomM, Duos.prenomM, Duos.nomF, Duos.prenomF


FROM Duos
EXCEPT
SELECT Duos_fait.nomM, Duos_fait.prenomM, Duos_fait.nomF,
Duos_fait.prenomF FROM Duos_fait;
// Driver Manager configuration
// Pilote for SQLite
Class.forName("org.sqlite.JDBC");

// Locating DataBase
String location=getLocationOfDataBase("DBcinema.db");

// Connecting DataBase
String url="jdbc:sqlite:"+location;
connection = DriverManager.getConnection(url);

public static String getLocationOfDataBase(String dbFileName){


// Retrieve the working directory:
String path=System.getProperty("user.dir");
File file = new File(path);

// Retrieve the parent directory


String parentPath = file.getAbsoluteFile().getParent();

// Concatenate the database file name


String result=parentPath+"\\"+dbFileName;
return result;
}

System.out.println("Location of database: "+location);


System.out.println("Connexion reussie");
Console:

Location of database: D:\User\Documents\Polytech\S8\projetBD\


DBcinema.db Connexion reussie

try {
Code
}
catch (Exception e)
{
// Failure
System.out.println("Echec de la connexion");
e.printStackTrace();
}

connection.close();

// Menu
System.out.println("\nMenu :");
System.out.println("\t1 - Trouver un film a partir de la date de diffusion et du
genre"); System.out.println("\t2 - Inserer une nouvelle programmation\n");
System.out.print("Faites votre choix : ");

Console :

Menu :
1 - Trouver un film a partir de la date de diffusion et du genre
2 - Inserer une nouvelle programmation

Faites votre choix :


System.in

// Retrieve choice of user


Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
. . . Fin du code . . .
sc.close();

// Executing query
switch(choice)
{
case 1:
requete_1(connection);
break;

case 2:
requete_3(connection);
break;
}

statement = connection.createStatement();
resultset = statement.executeQuery(query);

String query =
"SELECT idFilm, titre FROM Film \n" +
"JOIN Genre ON Film.idG = Genre.idGenre \n" +
"JOIN Programmation ON Film.idFilm = Programmation.idF \n" +
"WHERE type = '" +type+ "' AND '" +date+ "' BETWEEN dateDebut AND dateFin\
n" + "GROUP BY titre\n" +
"ORDER BY idFilm;";

// Display result
if(!resultset.next()) System.out.println("Aucun film de ce genre trouvé à cette
date."); else {
System.out.println("Liste des films :");
System.out.println("\t"+resultset.getInt("idFilm")+ " - "+
resultset.getString("titre"));

while(resultset.next()) {
System.out.println("\t"+resultset.getInt("idFilm")+ " - "+
resultset.getString("titre"));
}
}

Console:

Menu :
1 - Trouver un film a partir de la date de diffusion et du genre
2 - Inserer une nouvelle programmation

Faites votre choix : 1


Date de diffusion (format 'YYYY-MM-DD') : 2014-10-10
Genre du film : Science fiction

Commande SQL :
SELECT idFilm, titre FROM Film
JOIN Genre ON Film.idG = Genre.idGenre
JOIN Programmation ON Film.idFilm = Programmation.idF
WHERE type = 'Science fiction' AND '2014-10-10' BETWEEN dateDebut AND
dateFin GROUP BY titre
ORDER BY idFilm;
Liste des films :
4 - Interstellar

Console :
Quel film souhaitez-vous regarder :x4x

Commande SQL :
SELECT nom, adresse, ville FROM Cinema
JOIN Programmation ON Cinema.siret = Programmation.idCine
JOIN Film ON Film.idFilm = Programmation.idF
WHERE idFilm = '4' AND '2014-10-10' BETWEEN dateDebut AND dateFin ;

Liste des cinemas proposant la diffusion :


1 - Gaumont Nantes
12 place du commerce
Nantes

2 - UGC Atlantis
12bis Rue des Carmélites
Nantes

3 - CGR Angoulême
30 Rue Saint-Roch
Angoulêmes

4 - Cinéma de la Cité
60 Avenue de Cognac
Angoulême

Console :
Menu :
1 - Trouver un film a partir de la date de diffusion et du genre
2 - Inserer une nouvelle programmation

Faites votre choix : 2

Nouvelle programmation.
Film : Matrix

Format des dates : AAAA-MM-JJ


Date de début : 1996-03-06
Date de fin : 1996-10-12

Cinema : CGR Angoulême

La programmation va se faire avec les informations suivantes :


idProg = 238
idFilm = 1
dateDebut = 1996-03-06
dateFin = 1996-10-12
idCine = 6.6178022100031E13

INSERT INTO Programmation VALUES (238, '1996-03-06', '1996-10-12', 1, 6.6178022100031E13)


-- Requête 1: liste des cinémas de Nantes, avec leur nom et
localisation SELECT nom, adresse, ville
FROM Cinéma
WHERE ville = 'Nantes';

--Création de la table Cinéma


CREATE TABLE Cinema (
siret INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
adresse TEXT NOT NULL,
ville TEXT NOT NULL,
nbSalles INTEGER NOT NULL
);
--Création de la table Film
CREATE TABLE Film (
idFilm INTEGER PRIMARY KEY ,
titre TEXT NOT NULL,
annee TEXT NOT NULL,
realisateur TEXT NOT NULL,
idG INTEGER NOT NULL,
FOREIGN KEY (idG) REFERENCES Genre (idGenre)
);
--Création de la table Programmation
CREATE TABLE Programmation (
idProg INTEGER PRIMARY KEY ,
dateDebut DATE NOT NULL,
dateFin DATE NOT NULL,
idF INTEGER,
idCine INTEGER,
FOREIGN KEY (idF) REFERENCES Film (idFilm),
FOREIGN KEY (idCine) REFERENCES Cinema (siret)
);
--Création de la table Genre
CREATE TABLE Genre (
idGenre TEXT PRIMARY KEY ,
type TEXT NOT NULL,
public TEXTNOT NULL
);
--Création de la table Critique
CREATE TABLE Critique (
idCritique INTEGER PRIMARY KEY ,
Provenance TEXT NOT NULL,
dateParution TEXT NOT NULL,
note INTEGER,
idF INTEGER,
FOREIGN KEY (idF) REFERENCES Film (idFilm)
);
--Création de la table Personnage
CREATE TABLE Personnage (
idPerso INTEGER PRIMARY KEY ,
nom TEXT ,
prenom TEXT NOT NULL,
sex TEXT NOT NULL,
idR INTEGER NOT NULL,
FOREIGN KEY (idR) REFERENCES Role (idRole)
);
--Création de la table Rôle
CREATE TABLE Role (
idRole INTEGER PRIMARY KEY ,
typePerso TEXT NOT NULL,
raisonSociale TEXT NOT NULL
);

--Création de la table Casting


CREATE TABLE Casting (
idC INTEGER PRIMARY KEY ,
idA INTEGER,
idF INTEGER,
idP INTEGER,
FOREIGN KEY (idA) REFERENCES Acteur (idActeur),
FOREIGN KEY (idF) REFERENCES Film (idFilm),
FOREIGN KEY (idP) REFERENCES Personnage (idPerso)
);
--Création de la table Acteur
CREATE TABLE Acteur (
idActeur INTEGER PRIMARY KEY ,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
sexe TEXT NOT NULL
);

-- supression de table dans l'ordre inverse de création pour supprimer les clef
associé avant la réalisation des tables
DROP TABLE Acteur ;
DROP TABLE Casting;
DROP TABLE Role;
DROP TABLE Personnage;
DROP TABLE Critique;
DROP TABLE Genre;
DROP TABLE Programmation;
DROP TABLE Film;
DROP TABLE Cinema;

INSERT INTO Genre (idGenre, type, public)


VALUES
(10, 'Espionnage', 'tout public'),
(11, 'Comédie', 'tout public'),
(12, 'Science fiction', 'tout public'),
(13, 'Action', 'plus de 10 ans'),
(14, 'Horreur', 'plus de 16 ans'); /* pas utilisé*/

INSERT INTO Acteur (idActeur, nom, prenom, sexe)


VALUES
/* Indiana Jones */
(112, 'Ford', 'Harrison', 'M'),
(113, 'Connery', 'Sean', 'M'),
(114, 'Doody', 'Alison', 'F'),
/* Matrix */
(115, 'Reeves', 'Keanu', 'M'),
(116, 'Fishburne', 'Laurence', 'M'),
(117, 'Moss', 'Carrie-Anne', 'F'),
/*MAD MAX*/
(118, 'Hardy', 'Tom', 'M'),
(119, 'Theron', 'Charlize', 'F'),
(120, 'Kravitz', 'Zoë', 'F'),
/*Skyfall*/
(121, 'Craig', 'Daniel', 'M'),
(122, 'Dench', 'Judi', 'F'),
(123, 'Bardem', 'Javier', 'M'),
/*Interstellar*/
(124,'McConaughey','Matthew','M'),
(125,'Hathaway','Anne','F'),
(126,'Caine','Michael','M'),
/*Vilaine*/
(127,'Berry','Marilou','F'),
(128,'Bel','Frédérique','F'),
/*Qu'est ce qu'on a fait au bon dieu ? & Qu'est ce qu'on a encore fait au bon
dieu ? */
(129,'Clavier','Christian','M'),
(130,'Abittan','Ary','M'),
(131,'Sadoun','Medi','M'),
(132,'Chau','Frédéric','M'),
(133,'Lauby','Chantal','F'),
(134,'Piaton','Julia','F'),
(135,'Fontan','Elodie','F');

INSERT INTO Film(idFilm, titre, annee, realisateur, idG)


VALUES
(0, 'Indiana Jones', 1989, 'Steven Spielberg', 13), /* Action*/
(1,'Matrix',1999,'Lana & Lilly Wachowski',12), /* Fiction*/ (2, 'MAD
MAX : Fury road',2015,'George Miller',13),/* Action*/
(3,'Skyfall',2012,'Sam Mendes',10),/* Espionnage*/
(4, 'Interstellar', 2014, 'Christopher Nolan', 12), /* Fiction*/ (5, 'Vilaine',
1945, 'Jean Berry Benes & Allan Mauduit', 11),/* Comedie*/ (6, 'Qu est-ce qu on a
fait au bon dieu ?', 2014, 'Philippe de Chauveron', 11),/* Comedie*/
(7,'Qu est-ce qu on a encore fait au bon dieu ?',2019,'Philippe de
Chauveron',11);

INSERT INTO Critique(idCritique, provenance, dateParution, note,


idF) VALUES
/*Critique Film Indiana Jones */
(20,'La Croix','10/1989',4,0),
(21,'Le nouvel Observateur','10/1989',4,0),
(22,'Liberation','10/1989',3,0),
(23,'Cahiers du Cinema','10/1989',2,0),
/*Critique Film Matrix */
(24,'Ciné Live','06/1999',4,1),
(25,'Le Figaro','06/1999',3,1),

(26,'Liberation','06/1999',2,1),
(27,'Les Echos','06/1999',1,1),
/*Critique Film MAD MAX */
(28,'L Express','05/2015',4,2),
(29,'Metro','05/2015',4,2),
(30,'Charlie Hebdo','05/2015',3,2),
(31,'Le Monde','05/2015',3,2),
/*Critique Film Skyfall */
(32,'20 Minutes','10/2012',4,3),
(33,'Paris Match','10/2012',4,3),
(34,'Le journal du Dimanche','10/2012',3,3),
(35,'L Humanité','10/2012',1,3),
/*Critique Film Interstellar */
(36,'Closer','11/2014',4,4),
(37,'Voici','11/2014',4,4),
(38,'Première','11/2014',3,4),
(39,'Téléramea','11/2014',3,4),
(40,'La voix du Nord','11/2014',2,4),
/*Critique Film Vilaine*/
(41,'Cahiers du Cinema','04/1945',2,5),
(42,'France Soir','04/1945',1,5),
(43,'Le Monde','04/1945',3,5),
(44,'Les Echos','04/1945',0,5),
/*Critique Qu'est ce qu'on a fait au bon dieu ? */
(45,'20 Minutes','11/2011',4,6),
(46,'Télé 7 jours','11/2011',3.5,6),
(47,'Libération','11/2011',2,6),
(48,'La Croix','11/2011',2,6),
/*Critique Qu'est ce qu'on a fait au bon dieu ? */
(49,'Metro','11/2011',4,7),
(50,'Télé 7 jours','11/2011',3,7),
(51,'Le Journal du Dimanche','11/2011',2,7),
(52,'Les Fiches du Cinéma','11/2011',1,7);

INSERT INTO Role(idRole, typePerso, raisonSociale)


VALUES
(60, 'Positif', 'espion'),
(61, 'Positif', 'Aventurier'),
(62, 'Neutre', 'Chercheur'),
(63, 'Negatif', 'Criminel'),
(64, 'positif', 'autres'),
(65, 'Negatif', 'autres'),
(66, 'Neutre', 'autres');

INSERT INTO Cinema(siret, nom, adresse, ville, nbSalles)


VALUES
(43839079100038, 'Gaumont Nantes', '12 place du commerce', 'Nantes', 12),
(85580165000018, 'Katorza', '3 Rue Corneille', 'Nantes', 6), (34780600200031,
'UGC Atlantis', '12bis Rue des Carmélites', 'Nantes', 5), (53914477400012, 'Le
Concorde', '79 Boulevard de l Égalité', 'Nantes', 4), (66178022100031, 'CGR
Angoulême', ' 30 Rue Saint-Roch', 'Angoulêmes', 10), (50157795100012, 'Cinéma de
la Cité', '60 Avenue de Cognac', 'Angoulême', 4);

INSERT INTO Personnage(idPerso, nom, prenom,sex, idR)


VALUES
/* Indiana Jones */
(150, 'Indiana', 'Jones','M', 61),
(151, 'Professeur', 'Henri','M', 62),
(152, 'Docteur Schneider', 'Elsa','F', 62),
/* Matrix */
(153, NULL, 'Neo','M',64 ),
(154, NULL, 'Morpheus','M', 63),
(155, NULL, 'Trinity','F', 66),
/*MAD MAX*/
(156, 'Rockatansky', 'Max','M', 64),
(157, 'L imperatrice', 'Furiosa','F',64),
(158, NULL, 'Toast','F', 66),
/*Skyfall*/
(159, 'Bond', 'James','M', 60),
(160, NULL, 'M','F', 64),
(161, 'Silva', 'Raoul','M', 63),
/*Interstellar*/
(162,NULL,'Cooper','M',61),
(163,NULL,'Brand','M',66),
(164,'Professeur','Brand','F',66),
/*Vilaine*/
(165,'Vilaine','Melanie','F',64),
(166,NULL,'Aurore','F',65),
/*Qu'est ce qu'on a fait au bon dieu*/
(167,'Verneuil','Claude','M',65),
(168,'Verneuile','Marie','F',65),
(169,'Benichou','David','M',64),
(170,'Benassem','Rachid','M',64),
(171,'Ling','Chao','M',64),
(172,'Verneuil','Laure','F',64),
(173,'Verneuil','Isabelle','F',64),
(174,'Verneuil','Odile','F',64);

INSERT INTO Casting(idC, idA, idF, idP)


VALUES
/* Indiana Jones */
(79, 112,0,150),
(80, 113, 0, 151),
(81, 114, 0, 152),
/* Matrix */
(82, 115, 1, 153),
(83, 116, 1, 154),
(84, 117, 1, 155),
/*MAD MAX*/
(85, 118, 2, 156),
(86, 119, 2, 157),
(87, 120, 2, 158),
/*Skyfall*/
(88, 121, 3, 159),
(89, 122, 3, 160),
(90, 123, 3, 161),
/*Interstellar*/
(91, 124, 4, 162),
(92, 125, 4, 163),
(93, 126, 4, 164),
/*Vilaine*/
(94,127,5,165),
(95,128,5,166),
/*Qu'est ce qu'on a fait au bon dieu ?*/
(96,129,6,167),
(97,130,6,169),
(98,131,6,170),
(99,132,6,171),
(100,133,6,168),
(101,134,6,172),
(102,135,6,174),
(103,128,6,173),
/*Qu'est ce qu'on a encore fait au bon dieu ?*/
(104,129,7,167),
(105,130,7,169),
(106,131,7,170),
(107,132,7,171),
(108,133,7,168),
(109,134,7,172),
(110,135,7,174),
(111,128,7,173);
INSERT INTO Programmation(idProg, dateDebut, dateFin, idF,
idCine) VALUES
/*Gaumont Nantes*/
(200, '1989-09-10', '1999-12-10', 0, 43839079100038),
(201, '1999-06-10', '1999-08-10', 1, 43839079100038),
(202, '2015-09-10', '2015-12-10', 2, 43839079100038),
(203, '2012-10-10', '2012-12-10', 3, 43839079100038),
(204, '2014-09-10', '2014-12-10', 4, 43839079100038),
(205, '2008-06-10', '2008-07-10', 5, 43839079100038),
(206,'2014-04-16','2014-05-20',6,43839079100038),
(207,'2019-01-31','2019-02-26',7,43839079100038),
/*Katorza*/
(208, '1989-09-10', '1999-12-10', 0, 85580165000018),
(209, '1999-06-10', '1999-08-10', 1, 85580165000018),
(210, '2015-09-10', '2015-12-10', 2, 85580165000018),
(211, '2012-10-10', '2012-12-10', 3, 85580165000018),
(212,'2014-04-16','2014-05-20',6,85580165000018),
(213,'2019-01-31','2019-02-26',7,85580165000018),
/*UGC Atlantis*/
(214, '2015-09-10', '2015-12-10', 2, 34780600200031),
(215, '2012-10-10', '2012-12-10', 3, 34780600200031),
(216, '2014-09-10', '2014-12-10', 4, 34780600200031),
(217, '2008-06-10', '2008-07-10', 5, 34780600200031),
(218,'2014-04-16','2014-05-20',6,34780600200031),
(219,'2019-01-31','2019-02-26',7,34780600200031),
/*Le Concorde*/
(220, '1989-09-10', '1999-12-10', 0, 53914477400012),
(221, '1999-06-10', '1999-08-10', 1, 53914477400012),
(222, '2015-09-10', '2015-12-10', 2, 53914477400012),
(223, '2008-06-10', '2008-07-10', 5, 53914477400012),
(224,'2014-04-16','2014-05-20',6,53914477400012),
(225,'2019-01-31','2019-02-26',7,53914477400012),
/*CGR Angoulê30me*/
(226, '1989-09-10', '1999-12-10', 0, 66178022100031),
(227, '1999-06-10', '1999-08-10', 1, 66178022100031),
(228, '2015-09-10', '2015-12-10', 2, 66178022100031),
(229, '2012-10-10', '2012-12-10', 3, 66178022100031),
(230, '2014-09-10', '2014-12-10', 4, 66178022100031),
(231, '2008-06-10', '2008-07-10', 5, 66178022100031),
(232,'2014-04-16','2014-05-20',6,66178022100031),
(233,'2019-01-31','2019-02-26',7,66178022100031),
/*Cinéma de la Cité*/
(234, '1989-09-10', '1999-12-10', 0, 50157795100012),
(235, '1999-06-10', '1999-08-10', 1, 50157795100012),
(236, '2015-09-10', '2015-12-10', 2, 50157795100012),
(237, '2014-09-10', '2014-12-10', 4, 50157795100012);
-- Requête 1: liste des cinémas de Nantes, avec leur nom et
localisation SELECT nom, adresse, ville
FROM Cinema
WHERE ville = 'Nantes';

-- Requête 2: Liste des journaux ayant donné des notes supérieur ou égale à
3 SELECT provenance, note,idf
FROM Critique
WHERE note >= 3;

-- Requête 3: Liste des journaux ayant donné une note supérieure à la moyenne
globale des notes
SELECT provenance, note,idf
FROM Critique
WHERE note >= (SELECT AVG(note)
FROM Critique);

--Requête 4: Liste des noms de réalisateurs de film de science-


fiction SELECT realisateur, type
FROM Film
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE type = 'Science fiction';

-- Requête 5: Liste des critiques (provenance et étoile) pour un film donné (titre,
année)
SELECT titre, annee, provenance, note
FROM Film
JOIN Critique
ON Critique.idF = Film.idFilm
WHERE titre = 'Interstellar' AND '11/2014';

-- Requête 6: Liste des films (titre) dans un cinéma (choisir un nom du cinéma)
visibles à une date donnée (choisir une date),
SELECT titre
FROM Film
JOIN Programmation
ON Film.idFilm = Programmation.idF
JOIN Cinema
ON Programmation.idCine = Cinema.siret
WHERE Cinema.nom = 'CGR Angoulême' AND '2014-12-10' BETWEEN dateDebut AND dateFin;

-- Requête 7: Liste des titres de films avec la note moyenne donnée par les
critiques SELECT titre, AVG(note)
FROM Film
JOIN Critique
ON Film.idFilm = Critique.idF
GROUP BY titre;

-- Requête 8: Liste des films (titre) ayant été diffusés à Nantes dans au moins deux
cinémas à une date donnée (choisir une date),
CREATE VIEW Diffusion AS
SELECT titre
FROM Film
JOIN Programmation

ON Film.idFilm = Programmation.idF
JOIN Cinema
ON Programmation.idCine = Cinema.siret
WHERE Cinema.ville = 'Nantes'
AND '1989-09-10' BETWEEN dateDebut AND dateFin;

SELECT titre, COUNT(*) AS nbDiffusion FROM Diffusion


GROUP BY titre
HAVING nbDiffusion >= 2;
-- Requête 9: Liste des acteurs ou actrices (prénom et nom) avec le nombre de films
tournés.
SELECT prenom, nom, COUNT(idF) AS nbFilmsTournes
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
GROUP BY prenom;

-- Requête 10: Liste des actrices ayant tourné le plus de comédies,


CREATE VIEW ActriceComedie AS
SELECT prenom, nom, COUNT(titre) AS nbreComedie
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE sexe = 'F' AND type = 'Comédie'
GROUP BY nom;

SELECT nom, prenom, MAX(nbreComedie)


FROM ActriceComedie;

-- Requête 11: Listes des actrices n’ayant jamais joué dans des comédies,
SELECT prenom, nom
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
JOIN Genre
ON Film.idG = Genre.idGenre
WHERE sexe = 'F' AND type != 'Comédie';

-- Requête 12 : Liste des acteurs (sexe masculin) ayant joué le rôle de détective
dans un film réalisé par un réalisateur donné (nom du réalisateur), SELECT nom,
prenom
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Personnage
ON Casting.idP = Personnage.idPerso
JOIN Role
ON Personnage.idR = Role.idRole
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'M' AND raisonSociale = 'espion' AND realisateur = 'Sam Mendes';

-- Requête 13: Liste des couples d’acteurs (un acteur et une actrice) n’ayant jamais
joué ensemble dans un même film.
CREATE VIEW ActeursFilms AS
SELECT nom, prenom, titre
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'M';

CREATE VIEW ActricesFilms AS


SELECT nom, prenom, titre
FROM Acteur
JOIN Casting
ON Acteur.idActeur = Casting.idA
JOIN Film
ON Casting.idF = Film.idFilm
WHERE sexe = 'F';

CREATE VIEW Duos AS


SELECT DISTINCT ActeursFilms.nom AS nomM, ActeursFilms.prenom AS prenomM,
ActricesFilms.nom AS nomF, ActricesFilms.prenom AS prenomF FROM
ActeursFilms
JOIN ActricesFilms
WHERE ActeursFilms.titre != ActricesFilms.titre;

CREATE VIEW Duos_fait AS


SELECT DISTINCT ActeursFilms.nom AS nomM, ActeursFilms.prenom AS prenomM,
ActricesFilms.nom AS nomF, ActricesFilms.prenom AS prenomF FROM
ActeursFilms
JOIN ActricesFilms
WHERE ActeursFilms.titre = ActricesFilms.titre;

SELECT Duos.nomM, Duos.prenomM, Duos.nomF, Duos.prenomF


FROM Duos
EXCEPT
SELECT Duos_fait.nomM, Duos_fait.prenomM, Duos_fait.nomF, Duos_fait.prenomF
FROM Duos_fait;

/* ------------------------------------------------------------------------ *
Acces a une base de donnees dont le nom est contenu dans la chaine
dbFileName.
* On suppose que la base de donnees est dans le meme dossier que le projet
Java.
* Verifiez bien que c'est le cas en consultant Eclipse :
* La localisation du projet est donne par le menu
Project/Properties/Resource/Location.
* Ce dossier doit etre le meme que celui renfermant la base de donnees. *
----------------------------------------------------------------------*/
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
import java.util.*;
public class Acces {

public static String getLocationOfDataBase(String dbFileName){


//1. Retrieve the working directory:
// the location of the java project (identical to
Project/Properties/Resource/Location
String path=System.getProperty("user.dir");
File file = new File(path);
// 2. Retrieve the parent directory
String parentPath = file.getAbsoluteFile().getParent(); // 3.
concatenate the database file name
String result=parentPath+"\\"+dbFileName;
return result;
}

// Requete 1
// Trouver un film a partir de la date de diffusion et du genre
public static void requete_1(Connection connection) {
Statement statement = null;
ResultSet resultset = null;

// Date of diffusion and type of movie


// Retrieve choice of user
Scanner sc = new Scanner(System.in);

System.out.print("Date de diffusion (format 'YYYY-MM-DD') : ");


String date = sc.next(); sc.nextLine();
System.out.print("Genre du film : ");
String type = sc.nextLine();

// String date = "2011-12-06";


// String type = "Comédie";

// Creating SQL query


String query =
"SELECT idFilm, titre FROM Film \n"
+ "JOIN Genre ON Film.idG = Genre.idGenre \n"
+ "JOIN Programmation ON Film.idFilm =
Programmation.idF \n"
+ "WHERE type = '" +type+ "' AND '" +date+ "'
BETWEEN dateDebut AND dateFin\n"

+ "GROUP BY titre\n"
+ "ORDER BY idFilm;";

System.out.println("\nCommande SQL :\n"+query+"\n");

// Executing query
try
{
statement = connection.createStatement();
resultset = statement.executeQuery(query);

// Display result
if(!resultset.next()) System.out.println("Aucun film de
ce genre trouvé à cette date.");
else {
System.out.println("Liste des films :");
System.out.println("\t"+resultset.getInt("idFilm")+
" - "+ resultset.getString("titre"));

while(resultset.next()) {

System.out.println("\t"+resultset.getInt("idFilm")+ " - "+


resultset.getString("titre"));
}
}
}
// If error
catch (Exception e) {
e.printStackTrace();
}

// Trouver le cinema dans lequel est programmé le film choisi


requete_2(connection, date);

// Close Scanner
sc.close();
}

// Requete 2
// Trouver le cinema dans lequel est programmé le film choisi (a
partir de son ID)
public static void requete_2(Connection connection, String date) {
Statement statement = null;
ResultSet resultset = null;

// Choice of the movie


// Retrieve choice of user
Scanner sc = new Scanner(System.in);

System.out.print("\nQuel film souhaitez-vous regarder : ");


int nb = sc.nextInt();

// Creating SQL query


String query =
"SELECT nom, adresse, ville FROM Cinema\n" +
"JOIN Programmation ON Cinema.siret =
Programmation.idCine\n" +
"JOIN Film ON Film.idFilm = Programmation.idF\n" +
"WHERE idFilm = '" + nb + "' AND '" +date+ "'
BETWEEN dateDebut AND dateFin ;";

System.out.println("\nCommande SQL :\n"+query+"\n");

// Executing query
try
{
statement = connection.createStatement();
resultset = statement.executeQuery(query);

// Display result
if(!resultset.next()) System.out.println("Aucun cinema ne
propose ce film"); // Ne devrait jamais arriver a ce stade else {
System.out.println("Liste des cinemas proposant la
diffusion :");
System.out.println("1 -\t"
+resultset.getString("nom")+ "\n\t" +resultset.getString("adresse")+ "\n\t"
+resultset.getString("ville"));

int i=1;
while(resultset.next()) {
i++;
System.out.println("\n" +i+ " -\t"
+resultset.getString("nom")+ "\n\t" +resultset.getString("adresse")+ "\n\t"
+resultset.getString("ville"));
}
}
}
// If error
catch (Exception e) {
e.printStackTrace();
}

// Close Scanner
sc.close();
}
// Requete 3
// Insérer une nouvelle programmation
public static void requete_3(Connection connection) {
Statement statement = null;
ResultSet resultset = null;
String query;
int idProg = 0, idF = 0;
double idCine = 0;

// Determine ID programmation
query = "SELECT MAX(idProg) FROM Programmation;";
try
{
statement = connection.createStatement();
resultset = statement.executeQuery(query);

// Read max ID programmation, new ID is incremented


idProg = resultset.getInt("MAX(idProg)");
idProg ++;
}
// If error
catch (Exception e) {

e.printStackTrace();
}

// Retrieve information
Scanner sc = new Scanner(System.in);

System.out.println("\nNouvelle programmation.");

// Retrieve idFilm from name


System.out.print("\tFilm\t\t: ");
String film = sc.nextLine();

query =
"SELECT idFilm FROM Film\n"
+ "WHERE titre = '" +film+ "';" ;
try
{
statement = connection.createStatement();
resultset = statement.executeQuery(query);

// Read ID Film
idF = resultset.getInt("idFilm");
}
// If error
catch (Exception e) {
e.printStackTrace();
}

// Retrieve begin and end


System.out.println("\nFormat des dates : AAAA-MM-JJ");
System.out.print("\tDate de début\t: ");
String dateDebut = sc.nextLine();

System.out.print("\tDate de fin \t: ");


String dateFin = sc.nextLine();

// Retrieve idCine from name


System.out.print("\n\tCinema \t\t: ");
String cinema = sc.nextLine();

query =
"SELECT siret FROM Cinema\n"
+ "WHERE nom = '" +cinema+ "';" ;
try
{
statement = connection.createStatement();
resultset = statement.executeQuery(query);
// Read ID Cine
idCine = resultset.getDouble("siret");
}
// If error
catch (Exception e) {
e.printStackTrace();
}

System.out.println("\nLa programmation va se faire avec les


informations suivantes :");
System.out.println("\tidProg = \t"+idProg);
System.out.println("\tidFilm = \t"+idF);
System.out.println("\tdateDebut = \t"+dateDebut);

System.out.println("\tdateFin = \t"+dateFin);
System.out.println("\tidCine = \t"+idCine);

// Scheduling
// Creating SQL query
query =
"INSERT INTO Programmation VALUES ("
+ idProg + ", '"
+ dateDebut +"', '"
+ dateFin + "', "
+ idF + ", "
+ idCine + ")";

System.out.println("\n"+query);

try
{
int val = statement.executeUpdate(query);
System.out.println("Nombre de lignes détruites : "+val);
}
// If error
catch (Exception e) {
e.printStackTrace();
}

// Close Scanner
sc.close();
}

public static void main(String[] args)


{
Connection connection = null;
try
{
// Locating DataBase
String location=getLocationOfDataBase("DBcinema.db");
System.out.println("Location of database: "+location); //
Connecting DataBase
String url="jdbc:sqlite:"+location;
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection(url);
// Success
System.out.println("Connexion reussie");

// Menu
System.out.println("\nMenu :");
System.out.println("\t1 - Trouver un film a partir de la
date de diffusion et du genre");
System.out.println("\t2 - Inserer une nouvelle
programmation\n");
System.out.print("Faites votre choix : ");

// Retrieve choice of user


Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();

// Executing query
switch(choice)
{

case 1:
requete_1(connection);
break;

case 2:
requete_3(connection);
break;
}

// Close Scanner
sc.close();
}

// Connection Failure
catch (Exception e)
{
// Failure
System.out.println("Echec de connexion");
e.printStackTrace();
}

finally
{
try
{
connection.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}

Vous aimerez peut-être aussi