Files
mindflux/src/main/resources/static/finalflux/ap2-fiae/sql.html
T
AliceDarkest 501ecc0c1e AP3 A11y-Widget perfektioniert (Focus-Trap, aria-Semantik, tote CSS, Cache)
- accessibility.js: Focus-Trap im Panel (Tab/Shift+Tab zyklisch ueber Close + 9
  Optionen), aria-modal="true" beim Oeffnen, Klick-ausserhalb schliesst (Escape +
  Fokus-Rueckgabe bestehen). Font-Button: aria-pressed ersetzt durch dynamisches
  aria-label ("... aktuell 115 %") + .is-active ab >100 %; Reset-Button ohne
  aria-pressed (Aktion statt Toggle). Hochkontrast-Untertitel "immer dunkel".
- accessibility.css: toten Legacy-Dock-Code entfernt (72px body-padding, .mf-a11y-dock,
  Fixed-Trigger, Dock-Media-Query); .is-active am Aktiv-Styling; Kommentar, dass
  Hochkontrast bewusst immer dunkel bleibt.
- accessibility-placement.css: obsoleten Padding-Reset entfernt; .is-active ergaenzt.
- Cache-Buster: theme.js injiziert accessibility.css v6 / placement v10 /
  accessibility.js v9 / fluxtimer.css v5; theme.css?v=4 und theme.js?v=5 in allen
  80 Templates/Finalflux-Seiten vereinheitlicht.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WFxcjtc9HNP4VECT6Ur1tE
2026-07-21 00:16:05 +02:00

111 lines
5.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de" data-theme="dark">
<head>
<meta charset="UTF-8">
<title>SQL - FinalProtocol AP2</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/theme.css?v=4">
<link rel="stylesheet" href="/css/finalflux.css">
<script src="/js/theme.js?v=5"></script>
</head>
<body class="finalflux-page">
<div class="mf-theme-float"><button class="mf-theme"></button></div>
<main>
<a href="/finalflux" class="back-link">Zurück zu FinalProtocol</a>
<h1>SQL</h1>
<section>
<h2>Lernfokus</h2>
<p>AP2 Anwendungsentwicklung: Daten über mehrere Tabellen verknüpfen, gruppieren, verändern und Tabellen sauber normalisieren.</p>
<ul class="key-list">
<li>Join-Typen sicher unterscheiden und passend wählen.</li>
<li>Mit GROUP BY/HAVING gruppieren und aggregieren.</li>
<li>DDL/DML einordnen und die Normalformen 1NF–3NF anwenden.</li>
</ul>
</section>
<section>
<h2>Joins</h2>
<p>Ein Join verknüpft Zeilen mehrerer Tabellen über eine Bedingung – meist Fremdschlüssel gleich Primärschlüssel.</p>
<ul class="key-list">
<li><strong>INNER JOIN:</strong> nur Zeilen mit Partner in <em>beiden</em> Tabellen.</li>
<li><strong>LEFT (OUTER) JOIN:</strong> alle Zeilen der linken Tabelle, fehlende Partner werden <code>NULL</code> – ideal, um „ohne Partner" zu finden (<code>IS NULL</code>).</li>
<li><strong>CROSS JOIN:</strong> kartesisches Produkt, jede Zeile mit jeder (5 × 4 = 20).</li>
</ul>
<p class="merksatz"><strong>Merksatz:</strong> Kunden ohne Bestellung findest du mit LEFT JOIN und <code>WHERE bestellung.id IS NULL</code>.</p>
</section>
<section>
<h2>GROUP BY &amp; HAVING</h2>
<p>GROUP BY fasst Zeilen zu Gruppen zusammen, über die Aggregatfunktionen (COUNT, SUM, AVG, MIN, MAX) rechnen.</p>
<ul class="key-list">
<li><strong>WHERE vs. HAVING:</strong> WHERE filtert einzelne Zeilen <em>vor</em> der Gruppierung, HAVING filtert Gruppen <em>nach</em> der Gruppierung (z. B. <code>HAVING COUNT(*) &gt; 3</code>).</li>
<li><strong>SELECT-Regel:</strong> ohne Aggregat dürfen nur die Gruppierungsspalten in der SELECT-Liste stehen.</li>
</ul>
<p class="merksatz"><strong>Merksatz:</strong> Aggregate (COUNT, SUM …) gehören in HAVING, nie in WHERE.</p>
</section>
<section>
<h2>DDL &amp; DML</h2>
<p>SQL-Befehle werden nach ihrer Aufgabe gruppiert.</p>
<ul class="key-list">
<li><strong>DDL (Definition):</strong> CREATE, ALTER, DROP – definiert und ändert die Struktur.</li>
<li><strong>DML (Manipulation):</strong> INSERT, UPDATE, DELETE – ändert die Daten.</li>
<li><strong>FOREIGN KEY:</strong> sichert die referenzielle Integrität – erlaubt nur Werte, die als Primärschlüssel in der Zieltabelle existieren.</li>
</ul>
</section>
<section>
<h2>Normalisierung</h2>
<p>Normalisierung zerlegt Tabellen, um Redundanz und Anomalien zu vermeiden.</p>
<ul class="key-list">
<li><strong>1NF:</strong> atomare Werte, keine Mehrfachwerte oder Wiederholgruppen je Feld.</li>
<li><strong>2NF:</strong> 1NF und jedes Nichtschlüsselattribut hängt vom <em>gesamten</em> Schlüssel ab (keine Teilschlüssel-Abhängigkeit).</li>
<li><strong>3NF:</strong> 2NF und keine transitiven Abhängigkeiten (Nichtschlüssel → Nichtschlüssel, z. B. PLZ → Ort).</li>
</ul>
<p class="merksatz"><strong>Merksatz:</strong> „Der Schlüssel, der ganze Schlüssel und nichts als der Schlüssel" – 1NF, 2NF, 3NF in einem Satz.</p>
</section>
<section>
<h2>Prüfungsmodus</h2>
<p>Dieser ProtocolCheck führt dich durch die wichtigsten AP2-Aspekte dieses Themas. Du kannst Antworten prüfen, Fragen überspringen und bekommst am Ende eine Auswertung nach Kategorie.</p>
</section>
<section class="finalflux-test" data-finalflux-test aria-live="polite">
<div class="test-meta">
<span data-question-counter>Frage 1</span>
<span data-score-counter>0 richtig</span>
</div>
<div class="category-block">
<p class="eyebrow">Kategorie</p>
<h2 data-category-title>SQL</h2>
<p data-category-hint>AP2-Training</p>
</div>
<div class="question-card">
<h3 data-question-text></h3>
<div data-answer-options class="answer-options"></div>
<div data-answer-feedback class="fluxcheck-result"></div>
</div>
<div class="test-actions">
<button type="button" data-check-answer>Antwort prüfen</button>
<button type="button" data-skip-question class="secondary">Überspringen</button>
<button type="button" data-next-question class="secondary" disabled>Weiter</button>
</div>
</section>
<section data-test-result class="finalflux-panel" hidden>
<h2>Auswertung</h2>
<p data-result-summary></p>
<ul data-category-summary class="key-list"></ul>
<div class="finalflux-actions">
<button type="button" data-restart-test>Test neu starten</button>
<a href="/finalflux">Zurück zur Übersicht</a>
</div>
</section>
</main>
<script src="/js/finalflux-test.js" data-questions-src="/finalflux/questions/ap2_fiae_sql.json" defer></script>
</body>
</html>