SQL requetes

Bonjour à tous,

Voilà je suis nouveau sur le forum et j'apprends actuellement la créations de tables et les requêtes SQL. Je viens vers vous afin de savoir si c'est celles-ci sont correctes et pouvoir progresser. Je m'excuse par avance de mes erreurs.... :oups:

Voici mon schéma (BDD d'un zoo)

ANIMAL (id_a ,nom_a, datenaiss_a, id_m, id_endroit, race_fam, ori_fam)
ENFANT (id_enf, nom_enf,datenaiss_enf, id_a_pere,id_a_mere)
FAMILLE(race_fam,ori_fam)
ENDROIT (id_e, type_e, superf_e,nbmaxoccupant_e)
MENU (id_menu,quteviande_menu,qutelegume_menu)

Voici ma table animal qui je pense est fausse car je n'ai pas intégré les clés étrangères id_e,race_fam et origine_fam mais je ne sais pas où mentionner ""FOREIGN KEY" "

CREATE TABLE ANIMAL
( id_a CHAR(6) NOT NULL PRIMARY KEY
, nom_a VARCHAR(20) NOT NULL
, datenaiss_a DATE(10) NOT NULL
, id_menu CHAR(6) NOT NULL REFERENCES MENU (ID_MENU)
, id_endroit CHAR(6) NOT NULL REFERENCES ENDROIT(ID_ENDROIT)
, race_fam VARCHAR 20) NOT NULL
, race_fam VARCHAR(30) NOT NULL REFERENCES FAMILLE(RACE_FAM)
, ori_fam VARCHAR(30) NOT NULL REFERENCES FAMILLE(ORI_FAM);)

Et voici mes requêtes :

1.Liste de tous les animaux qui sont parents et le nombre d'enfants qu'ils ont

SELECT nom_a
FROM ANIMAL
GROUP BY ENFANT

2.Liste des animaux dont les deux parents sont connus
SELECT id_a_pere,id_a_mere
FROM ENFANT

3.Moyenne de la qté de viande servie dans le menu des singes
SELECT AVG(quteviande_menu)
FROM MENU
WHERE FAMILLE='singe'

Je vous remercie par avance pour votre aide et vos corrections
Bonne journée
H.

3 réponses

  1. C'est quel genre de BD ?

    Oracle ?

    Exemple :

    ALTER TABLE
    ALTER TABLE ZOA_ANIMAL ADD
    CONSTRAINT ZOA_ANIMAL_f1 FOREIGN KEY (
    ZOA_ID_ENDROIT )
    REFERENCES ZOE_ENDROIT (
    ZOE_ID_ENDROIT

    Par contre, il faut que ZOE_ID_ENDROIT soit une PK.

    Pour les autres, je n'ai malheureusement pas d'exemple.
    0
    1. Bonsoir,

      Merci beaucoup pour votre réponse, c'est vrai que c'est beaucoup plus clair ! :)

      Cependant, je n'ai pas encore compris pour les clé étrangère (fk)... Est-ce que le script SQL de ma table est tout de même correct en terme de données ? Et en gardant ma table de base avec "enfant" à la place de "parent"

      CREATE TABLE ANIMAL
      ( id CHAR(6) NOT NULL PRIMARY KEY
      , nom VARCHAR(20) NOT NULL
      , date_naiss DATE(10) NOT NULL
      , menu CHAR(6) NOT NULL REFERENCES MENU (ID_MENU)
      , zoa_id_endroit CHAR(6) NOT NULL REFERENCES ENDROIT(ID_ENDROIT)
      , zoa_race_fam VARCHAR(30) NOT NULL REFERENCES FAMILLE(RACE_FAM)
      , zoa_ori_fam VARCHAR(30) NOT NULL REFERENCES FAMILLE(ORI_FAM)
      ;)

      Encore merci !
      H.
      0
      1. Il faudrait optimiser le modèle et les tables.

        ZOA_ANIMAL (
        ZOA_ID_ANIMAL
        ZOA_NOM_ANIMAL
        ZOA_DESCRIPTION
        ZOA_DATE_NAISS
        ZOA_ID_MENU
        ZOA_ID_ENDROIT
        ZOA_ID_FAMILLE
        ZOA_ID_PERE
        ZOA_ID_MERE)

        ZOP_PARENT (
        ZOP_ID_PARENT
        ZOP_ID_ENFANT
        ZOP_DESCRIPTION)

        ZOE_ENDROIT (
        ZOE_ID_ENDROIT
        ZOE_TYPE_ENDROIT
        ZOE_DESCRIPTION
        ZOE_SUPERFICIE
        ZOE_MAX_OCC)

        ZOM_MENU (
        ZOM_ID_MENU,
        ZOM_QTE_VIANDE
        ZOM_QTE_LEGUME)

        ZOF_FAMILLE (
        ZOF_ID_FAMILLE
        ZOF_RACE_FAMILLE
        ZOF_ORIGINE)

        Pour ce qui est des index, chaque ID de chaque table (sauf la table ENF_ENFANT) est
        une pk.
        Pour les FK, ce sont des contraintes qu'il faut ajouter aux tables.

        Requêtes :

        1. Liste de tous les animaux qui sont parents et le nombre d'enfants qu'ils ont :
        SELECT ZOP_ID_PARENT, ZOP_ID_ENFANT, ZOP_DESCRIPTION FROM ZOP_PARENT GROUP BY ZOP_ID_PARENT, ZOP_DESCRIPTION;
        // Comme cela, on a tous les parents avec leurs enfants et leur lien (description : PERE, MERE)

        2. SELECT ZOP_ID_ENFANT, ZOP_ID_PARENT GROUP BY ZOP_ID_ENFANT HAVING COUNT (*) > 1;

        3. SELECT AVG (ZOM_QTE_VIANDE)
        FROM ZOM_MENU,
        ZOF_FAMILLE,
        ZOA_ANIMAL
        WHERE ZOF_ID_FAMILLE = ZOA_ID_FAMILLE
        AND ZOF_RACE_FAMILLE = 'SINGE'
        AND ZOA_ID_MENU = ZOM_ID_MENU;

        Pourquoi j'ai mis des ZO devant les tables, c'est simplement pour les associer à un système quelconque.
        Dans votre cas, on parle de ZOO. alors j'ai mis ZO. De plus, le fait de mettre le préfixe de 3 lettres de la table
        devant chaque colonne de celle-ci fait en sorte que si j'avais un SELECT A.DESCRIPTION FROM ANIMAL A
        c'est moins évident à lire que SELECT ZOA_DESCRIPTION FROM ZOA_ANIMAL.
        On voit immédiatement de quelle table ça provient.

        C'est encore plus pratique quand on a 3 colonnes descriptions (imaginez a.description, b.description, c.description).
        1