SQL Gaulois

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 ALL
            SELECT 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 IN
            SELECT 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 VIEW
            SELECT 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 SELECT
            INSERT 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 SELECT
            INSERT 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 IN
            
        

Modifiez 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')