Nom des lieux qui finissent par 'um'.
SELECT nom_lieu FROM lieu WHERE nom_lieu LIKE '%um'
Nombre de personnages par lieu (trié par nombre de personnages décroissant).
SELECT COUNT(personnage.id_personnage), lieu.nom_lieu FROM lieu INNER JOIN personnage personnage ON lieu.id_lieu = personnage.id_lieu GROUP BY lieu.nom_lieu
Nom des personnages + spécialité + adresse et lieu d'habitation, triés par lieu puis par nom de personnage.
SELECT personnage.nom_personnage, specialite.nom_specialite, personnage.adresse_personnage, lieu.nom_lieu FROM specialite INNER JOIN personnage ON personnage.id_specialite = specialite.id_specialite INNER JOIN lieu ON personnage.id_lieu = lieu.id_lieu ORDER BY lieu.nom_lieu DESC, personnage.nom_personnage DESC
Nom des spécialités avec nombre de personnages par spécialité (trié par nombre de personnages décroissant).
SELECT nom_specialite, COUNT(personnage.id_personnage) AS nombre_personnages FROM specialite INNER JOIN personnage ON specialite.id_specialite = personnage.id_specialite GROUP BY specialite.nom_specialite ORDER BY nombre_personnage DESC
Nom, date et lieu des batailles, classées de la plus récente à la plus ancienne (dates affichées au format jj/mm/aaaa).
SELECT nom_bataille, nom_lieu, DATE_FORMAT(date_bataille, '%d %M %y') FROM bataille INNER JOIN lieu ON bataille.id_lieu = lieu.id_lieu ORDER BY YEAR(date_bataille) ASC, MONTH(date_bataille) ASC, DAY(date_bataille) DESC
Nom des potions + coût de réalisation de la potion (trié par coût décroissant).
SELECT nom_potion, SUM(qte * cout_ingredient) AS price_total_by_potion FROM potion INNER JOIN composer ON potion.id_potion = composer.id_potion INNER JOIN ingredient ON ingredient.id_ingredient = composer.id_ingredient GROUP BY nom_potion ORDER BY price_total_by_potion DESC
Nom des ingrédients + coût + quantité de chaque ingrédient qui composent la potion 'Santé'.
SELECT nom_ingredient, sum(cout_ingredient * qte) AS cout_ingredients FROM potion INNER JOIN composer ON potion.id_potion = composer.id_potion INNER JOIN ingredient ON ingredient.id_ingredient = composer.id_ingredient WHERE nom_potion = 'Santé' GROUP BY nom_ingredient
Nom du ou des personnages qui ont pris le plus de casques dans la bataille 'Bataille du village gaulois'.
SELECT nom_personnage FROM bataille INNER JOIN prendre_casque ON prendre_casque.id_bataille = bataille.id_bataille INNER JOIN personnage ON personnage.id_personnage = prendre_casque.id_personnage WHERE bataille.nom_bataille = 'Bataille du village gaulois'
Nom des personnages et leur quantité de potion bue (en les classant du plus grand buveur au plus petit).
SELECT nom_personnage, nom_potion, SUM(dose_boire) AS qte_bus FROM potion INNER JOIN boire ON potion.id_potion = boire.id_potion INNER JOIN personnage ON personnage.id_personnage = boire.id_personnage GROUP BY nom_personnage, nom_potion ORDER BY qte_bus DESC
Nom de la bataille où le nombre de casques pris a été le plus important.
Sous requête close HAVING SELECT
SELECT nom_bataille, MAX(qte) AS qte FROM bataille INNER JOIN prendre_casque ON prendre_casque.id_bataille = bataille.id_bataille GROUP BY nom_bataille HAVING qte = (SELECT MAX(qte) FROM prendre_casque)
Combien existe-t-il de casques de chaque type et quel est leur coût total ? (classés par nombre décroissant)
LEFT JOIN plutôt que INNER JOIN
SELECT nom_type_casque, COUNT(casque.id_casque), SUM(casque.cout_casque) AS total FROM casque LEFT JOIN type_casque ON type_casque.id_type_casque = casque.id_type_casque GROUP BY nom_type_casque ORDER BY total DESC
Nom des potions dont un des ingrédients est le poisson frais
SELECT nom_potion FROM potion INNER JOIN composer on composer.id_potion = potion.id_potion INNER JOIN ingredient ON ingredient.id_ingredient = composer.id_ingredient WHERE ingredient.nom_ingredient = 'Poisson frais'
Nom du / des lieu(x) possédant le plus d'habitants, en dehors du village gaulois.
Imbriqué avec cose HAVING et close ALLSELECT nom_lieu, COUNT(nom_lieu) AS nombre_personnage FROM personnage INNER JOIN lieu ON personnage.id_lieu = lieu.id_lieu GROUP BY lieu.nom_lieu HAVING COUNT(nom_lieu) = ALL ( SELECT 2 );
RANK() pour attribuer un classement à chaque village en fonction du nombre de personnages. Sélectionne les villages avec un rang égal à 2, ce qui correspond au deuxième village ayant le plus grand nombre de personnages.
Nom des personnages qui n'ont jamais bu aucune potion.
Utilisation de NOT INSELECT nom_personnage FROM personnage WHERE id_personnage NOT IN( SELECT id_personnage FROM boire ) GROUP BY nom_personnage
SELECT personnage.nom_personnage FROM personnage LEFT JOIN boire ON personnage.id_personnage = boire.id_personnage WHERE boire.id_personnage IS NULL GROUP BY personnage.nom_personnage
Nom du / des personnages qui n'ont pas le droit de boire de la potion 'Magique'.
Requête imbriqué NOT IN (autoiser boire), CREATE VIEWSELECT nom_personnage FROM personnage WHERE id_personnage NOT IN ( SELECT id_personnage FROM autoriser_boire a, potion pot WHERE pot.id_potion = a.id_potion AND pot.nom_potion = "Magique")
En écrivant toujours des requêtes SQL, modifiez la base de données comme suit :
Ajoutez le personnage suivant : Champdeblix, agriculteur résidant à la ferme Hantassion de Rotomagus.
Utilisation du SELECTINSERT INTO personnage (nom_personnage, adresse_personnage, image_personnage, id_lieu, id_specialite) VALUES ('Champdeblix', 'à la ferme', 'indisponible.jpg', (SELECT id_lieu FROM lieu WHERE nom_lieu = 'Rotomagus'), (SELECT id_specialite FROM specialite WHERE nom_specialite = 'Agriculteur') )
INSERT INTO personnage (nom_personnage, adresse_personnage, image_personnage, id_lieu, id_specialite) VALUE ("Champdeblix", "à la ferme", "indisponible.jpg", 6, 12)
Autorisez Bonemine à boire de la potion magique, elle est jalouse d'Iélosubmarine...
Le personnage était déjà autoriser dans la base. Je l'ai supprimer et créer à nouveau.
Utilisation avec SELECTINSERT INTO autoriser_boire(id_potion, id_personnage) VALUE( (SELECT id_potion FROM potion WHERE nom_potion = 'Magique' ), ( SELECT id_personnage FROM personnage WHERE nom_personnage = 'Bonemine') )
INSERT INTO autoriser_boire (id_potion, id_personnage) VALUE (1, 12)
Supprimez les casques grecs qui n'ont jamais été pris lors d'une bataille.
Imbriqué avec NOT INModifiez l'adresse de Zérozérosix : il a été mis en prison à Condate.
UPDATE personnage SET adresse_personnage = "il a été mis en prison", id_lieu = 9 WHERE nom_personnage = "Zérozérosix"
La potion 'Soupe' ne doit plus contenir de persil.
DELETE composer FROM composer LEFT JOIN potion ON potion.id_potion = composer.id_potion LEFT JOIN ingredient ON ingredient.id_ingredient = composer.id_ingredient WHERE potion.nom_potion = "Soupe" AND ingredient.nom_ingredient = "Persil"
Obélix s'est trompé : ce sont 42 casques Weisenau, et non Ostrogoths, qu'il a pris lors de la bataille 'Attaque de la banque postale'. Corrigez son erreur !
UPDATE prendre_casque INNER JOIN personnage ON personnage.id_personnage = prendre_casque.id_personnage INNER JOIN bataille ON prendre_casque.id_bataille = bataille.id_bataille SET prendre_casque.qte = 42 WHERE personnage.nom_personnage = "Obélix" AND bataille.nom_bataille = "Attaque de la banque postale"Ou
UPDATE prendre_casque SET id_casque = (SELECT id_casque FROM casque WHERE nom_casque = 'Weisenau'), qte = 42 WHERE id_personnage = (SELECT id_personnage FROM personnage WHERE nom_personnage = 'Obélix) AND id_bataille = (SELECT id_bataille FROM bataille WHERE nom_bataille = 'Attaque de la banque postale') AND id_casque = (SELECT id_casque FROM casque WHERE nom_casque = 'Ostrogoth')