-- ============================================
-- DONNEES SUPPLEMENTAIRES POUR LES COURS SQL
-- ============================================
-- Ce script ajoute plus de leçons, exemples et exercices

-- Variables pour stocker les IDs
VARIABLE v_module_2_id NUMBER;
VARIABLE v_lecon_where_id NUMBER;
VARIABLE v_lecon_order_id NUMBER;

-- ============================================
-- MODULE 2: LECONS
-- ============================================

-- Leçon WHERE
INSERT INTO COURS_LECONS (lecon_id, module_id, slug, titre, sous_titre, contenu_html, objectifs, ordre_affichage, duree_minutes, difficulte)
VALUES (
    SEQ_COURS_LECON.NEXTVAL,
    2,
    'where',
    'WHERE - Filtrer les Données',
    'Utiliser la clause WHERE pour filtrer les résultats',
    '<h2>La Clause WHERE</h2>
    <p>La clause WHERE permet de filtrer les lignes retournées par une requête SELECT selon une ou plusieurs conditions.</p>

    <h3>Syntaxe</h3>
    <pre><code>SELECT colonnes
FROM table
WHERE condition;</code></pre>

    <h3>Opérateurs de Comparaison</h3>
    <ul>
        <li><code>=</code> : Égal</li>
        <li><code>!=</code> ou <code>&lt;&gt;</code> : Différent</li>
        <li><code>&gt;</code> : Supérieur</li>
        <li><code>&lt;</code> : Inférieur</li>
        <li><code>&gt;=</code> : Supérieur ou égal</li>
        <li><code>&lt;=</code> : Inférieur ou égal</li>
    </ul>

    <h3>Exemples de Base</h3>
    <pre><code>-- Employés du département 1
SELECT nom, prenom, dept_id
FROM EMPLOYES
WHERE dept_id = 1;

-- Employés avec un salaire supérieur à 4000
SELECT nom, prenom, salaire
FROM EMPLOYES
WHERE salaire > 4000;</code></pre>

    <div class="alert alert-warning">
        <strong>Important :</strong> En SQL, les chaînes de caractères doivent être entourées de guillemets simples.
    </div>',
    '<ul>
        <li>Comprendre le rôle de la clause WHERE</li>
        <li>Utiliser les opérateurs de comparaison</li>
        <li>Filtrer par valeur numérique et texte</li>
        <li>Comprendre la sensibilité à la casse</li>
    </ul>',
    1,
    20,
    'DEBUTANT'
) RETURNING lecon_id INTO :v_lecon_where_id;

-- Leçon ORDER BY
INSERT INTO COURS_LECONS (lecon_id, module_id, slug, titre, sous_titre, contenu_html, objectifs, ordre_affichage, duree_minutes, difficulte)
VALUES (
    SEQ_COURS_LECON.NEXTVAL,
    2,
    'order-by',
    'ORDER BY - Trier les Résultats',
    'Trier les données par ordre croissant ou décroissant',
    '<h2>La Clause ORDER BY</h2>
    <p>ORDER BY permet de trier les résultats d''une requête selon une ou plusieurs colonnes.</p>

    <h3>Syntaxe</h3>
    <pre><code>SELECT colonnes
FROM table
ORDER BY colonne [ASC|DESC];</code></pre>

    <h3>Ordre Croissant et Décroissant</h3>
    <ul>
        <li><code>ASC</code> : Ordre croissant (par défaut)</li>
        <li><code>DESC</code> : Ordre décroissant</li>
    </ul>

    <h3>Exemples</h3>
    <pre><code>-- Trier par nom (ordre alphabétique)
SELECT nom, prenom
FROM EMPLOYES
ORDER BY nom;

-- Trier par salaire décroissant
SELECT nom, prenom, salaire
FROM EMPLOYES
ORDER BY salaire DESC;</code></pre>

    <h3>Tri sur Plusieurs Colonnes</h3>
    <pre><code>SELECT nom, prenom, dept_id, salaire
FROM EMPLOYES
ORDER BY dept_id ASC, salaire DESC;</code></pre>

    <div class="alert alert-info">
        <strong>Astuce :</strong> Vous pouvez aussi utiliser la position de la colonne : <code>ORDER BY 1, 2</code> pour trier par les première et deuxième colonnes.
    </div>',
    '<ul>
        <li>Comprendre ORDER BY</li>
        <li>Trier en ordre croissant (ASC) et décroissant (DESC)</li>
        <li>Trier sur plusieurs colonnes</li>
        <li>Combiner WHERE et ORDER BY</li>
    </ul>',
    4,
    18,
    'DEBUTANT'
) RETURNING lecon_id INTO :v_lecon_order_id;

-- ============================================
-- EXEMPLES POUR WHERE
-- ============================================
INSERT INTO COURS_EXEMPLES (exemple_id, lecon_id, titre, code_sql, resultat_attendu, explication, ordre_affichage)
SELECT SEQ_COURS_EXEMPLE.NEXTVAL, :v_lecon_where_id,
       'Employés du département Informatique',
       'SELECT nom, prenom, poste FROM EMPLOYES WHERE dept_id = 1;',
       'Liste des employés travaillant dans le département 1 (Informatique)',
       'Filtre les employés en fonction de leur département',
       1
FROM DUAL;

INSERT INTO COURS_EXEMPLES (exemple_id, lecon_id, titre, code_sql, resultat_attendu, explication, ordre_affichage)
SELECT SEQ_COURS_EXEMPLE.NEXTVAL, :v_lecon_where_id,
       'Employés avec salaire élevé',
       'SELECT nom, prenom, salaire FROM EMPLOYES WHERE salaire >= 4000;',
       'Employés dont le salaire est supérieur ou égal à 4000',
       'Utilise l''opérateur >= pour la comparaison numérique',
       2
FROM DUAL;

-- ============================================
-- EXERCICES POUR WHERE
-- ============================================
INSERT INTO COURS_EXERCICES (exercice_id, lecon_id, titre, enonce, solution_sql, indice, difficulte, ordre_affichage)
SELECT SEQ_COURS_EXERCICE.NEXTVAL, :v_lecon_where_id,
       'Exercice 1 : Filtrer par poste',
       'Affichez le nom, prénom et email de tous les employés dont le poste est "Développeur Senior".',
       'SELECT nom, prenom, email FROM EMPLOYES WHERE poste = ''Développeur Senior'';',
       'Utilisez WHERE avec l''opérateur = et n''oubliez pas les guillemets simples',
       'FACILE',
       1
FROM DUAL;

INSERT INTO COURS_EXERCICES (exercice_id, lecon_id, titre, enonce, solution_sql, indice, difficulte, ordre_affichage)
SELECT SEQ_COURS_EXERCICE.NEXTVAL, :v_lecon_where_id,
       'Exercice 2 : Produits en stock faible',
       'Trouvez tous les produits dont le stock_disponible est inférieur au stock_minimum.',
       'SELECT nom_produit, stock_disponible, stock_minimum FROM PRODUITS WHERE stock_disponible < stock_minimum;',
       'Comparez les deux colonnes avec l''opérateur <',
       'MOYEN',
       2
FROM DUAL;

-- ============================================
-- EXEMPLES POUR ORDER BY
-- ============================================
INSERT INTO COURS_EXEMPLES (exemple_id, lecon_id, titre, code_sql, resultat_attendu, explication, ordre_affichage)
SELECT SEQ_COURS_EXEMPLE.NEXTVAL, :v_lecon_order_id,
       'Trier les employés par nom',
       'SELECT nom, prenom FROM EMPLOYES ORDER BY nom ASC;',
       'Liste alphabétique des employés',
       'Tri par ordre alphabétique croissant',
       1
FROM DUAL;

INSERT INTO COURS_EXEMPLES (exemple_id, lecon_id, titre, code_sql, resultat_attendu, explication, ordre_affichage)
SELECT SEQ_COURS_EXEMPLE.NEXTVAL, :v_lecon_order_id,
       'Employés les mieux payés',
       'SELECT nom, prenom, salaire FROM EMPLOYES ORDER BY salaire DESC;',
       'Employés classés du salaire le plus élevé au plus bas',
       'Tri décroissant pour voir les salaires les plus élevés en premier',
       2
FROM DUAL;

-- ============================================
-- EXERCICES POUR ORDER BY
-- ============================================
INSERT INTO COURS_EXERCICES (exercice_id, lecon_id, titre, enonce, solution_sql, indice, difficulte, ordre_affichage)
SELECT SEQ_COURS_EXERCICE.NEXTVAL, :v_lecon_order_id,
       'Exercice 1 : Trier les produits',
       'Affichez tous les produits triés par prix_unitaire du plus cher au moins cher.',
       'SELECT nom_produit, prix_unitaire FROM PRODUITS ORDER BY prix_unitaire DESC;',
       'Utilisez ORDER BY avec DESC',
       'FACILE',
       1
FROM DUAL;

INSERT INTO COURS_EXERCICES (exercice_id, lecon_id, titre, enonce, solution_sql, indice, difficulte, ordre_affichage)
SELECT SEQ_COURS_EXERCICE.NEXTVAL, :v_lecon_order_id,
       'Exercice 2 : Tri multiple',
       'Listez les employés triés par dept_id croissant, puis par salaire décroissant.',
       'SELECT nom, prenom, dept_id, salaire FROM EMPLOYES ORDER BY dept_id ASC, salaire DESC;',
       'Séparez les colonnes par une virgule dans ORDER BY',
       'MOYEN',
       2
FROM DUAL;

COMMIT;

PROMPT
PROMPT ================================================
PROMPT Données supplémentaires insérées avec succès !
PROMPT ================================================
