9 Einfache Auswertungen

9.1 Ausdrücke

9.1.1 Konstanten

In MySQL können verschiedene Arten von Konstanten verwendet werden:

-- Zahlen
SELECT 42;                  -- Integer
SELECT 3.14;               -- Dezimalzahl
SELECT -17;                -- Negative Zahl

-- Zeichenketten
SELECT 'Hallo Welt';       -- String in Anführungszeichen
SELECT "Auch möglich";     -- Alternative Schreibweise

-- Datum und Zeit
SELECT DATE '2024-01-15';  -- Datum
SELECT TIME '14:30:00';    -- Zeit

9.1.2 Wie kann ich Berechnungen vornehmen?

MySQL bietet umfangreiche mathematische Funktionen:

-- Grundrechenarten
SELECT 10 + 5;             -- Addition
SELECT 10 - 5;             -- Subtraktion
SELECT 10 * 5;             -- Multiplikation
SELECT 10 / 5;             -- Division
SELECT 10 % 3;             -- Modulo (Rest)

-- Mit Spalten rechnen
SELECT 
    produktname,
    preis,
    menge,
    preis * menge as gesamtpreis
FROM bestellungen;

-- Mathematische Funktionen
SELECT ROUND(3.14159, 2);  -- Runden auf 2 Stellen
SELECT CEIL(3.14);         -- Aufrunden
SELECT FLOOR(3.14);        -- Abrunden
SELECT ABS(-17);           -- Betrag
SELECT POWER(2, 3);        -- Potenz

9.1.3 Wie ermittele ich Zufallszahlen?

Die RAND()-Funktion erzeugt Zufallszahlen:

-- Zufallszahl zwischen 0 und 1
SELECT RAND();

-- Zufallszahl in bestimmtem Bereich
SELECT FLOOR(RAND() * 100);        -- 0 bis 99
SELECT 1 + FLOOR(RAND() * 6);      -- Würfel (1-6)

-- Zufällige Datensätze
SELECT * FROM produkte 
ORDER BY RAND() 
LIMIT 5;

9.1.4 Wie stecke ich das Berechnungsergebnis in eine Variable?

MySQL-Variablen können Berechnungsergebnisse speichern:

-- Benutzervariable setzen
SET @preis = 99.99;

-- Wert aus Abfrage
SET @max_preis = (
    SELECT MAX(preis) 
    FROM produkte
);

-- Mehrere Variablen
SET @min_preis = 10, @max_preis = 100;

-- Variablen in Abfragen verwenden
SELECT * FROM produkte 
WHERE preis BETWEEN @min_preis AND @max_preis;

9.2 Zeilen- und Spaltenwahl

Die Auswahl bestimmter Spalten und Zeilen ist grundlegend für Abfragen:

-- Bestimmte Spalten
SELECT vorname, nachname, email 
FROM mitarbeiter;

-- Alle Spalten
SELECT * FROM mitarbeiter;

-- Mit Bedingung
SELECT vorname, nachname 
FROM mitarbeiter 
WHERE abteilung = 'Vertrieb';

-- Mit Alias
SELECT 
    vorname as vorname_mitarbeiter,
    nachname as nachname_mitarbeiter
FROM mitarbeiter;

-- Mit Berechnung
SELECT 
    produktname,
    preis,
    menge,
    preis * menge as gesamtpreis
FROM bestellungen;

9.3 Sortierung

Die Sortierung von Ergebnissen erfolgt mit ORDER BY:

-- Aufsteigende Sortierung
SELECT * FROM produkte 
ORDER BY preis ASC;

-- Absteigende Sortierung
SELECT * FROM produkte 
ORDER BY preis DESC;

-- Mehrere Sortierkriterien
SELECT * FROM mitarbeiter 
ORDER BY nachname ASC, vorname ASC;

-- Mit Berechnung
SELECT 
    produktname,
    preis * menge as gesamtpreis
FROM bestellungen 
ORDER BY gesamtpreis DESC;

9.3.1 Was muss ich bei der Sortierung von Texten beachten?

Bei der Sortierung von Texten spielen Zeichensatz und Collation eine wichtige Rolle:

-- Standard-Sortierung
SELECT * FROM mitarbeiter 
ORDER BY nachname;

-- Mit bestimmter Collation
SELECT * FROM mitarbeiter 
ORDER BY nachname COLLATE utf8mb4_german2_ci;

-- Akzente ignorieren
SELECT * FROM mitarbeiter 
ORDER BY nachname COLLATE utf8mb4_unicode_ci;

9.3.2 Wird zwischen Groß- und Kleinschreibung unterschieden?

Standardmäßig wird nicht zwischen Groß- und Kleinschreibung unterschieden:

-- Case-insensitive (Standard)
SELECT * FROM produkte 
ORDER BY name;

-- Case-sensitive
SELECT * FROM produkte 
ORDER BY BINARY name;

9.3.3 Wie werden Datums- und Uhrzeitwerte sortiert?

Datums- und Zeitwerte werden chronologisch sortiert:

-- Datum sortieren
SELECT * FROM bestellungen 
ORDER BY bestelldatum;

-- Komplexere Datumssortierung
SELECT *,
    YEAR(bestelldatum) as jahr,
    MONTH(bestelldatum) as monat
FROM bestellungen 
ORDER BY jahr DESC, monat DESC;

-- Mit Zeitanteil
SELECT * FROM protokoll 
ORDER BY zeitstempel DESC;

9.3.4 Wie kann ich das Sortieren beschleunigen?

Indizes können die Sortierung beschleunigen:

-- Index für häufige Sortierung
CREATE INDEX idx_nachname 
ON mitarbeiter(nachname, vorname);

-- Index für berechnete Sortierung
CREATE INDEX idx_gesamtpreis 
ON bestellungen((preis * menge));

9.4 Mehrfachausgaben unterbinden

Mit DISTINCT werden Duplikate entfernt:

-- Eindeutige Werte
SELECT DISTINCT abteilung 
FROM mitarbeiter;

-- Mehrere Spalten
SELECT DISTINCT 
    stadt, 
    land 
FROM kunden;

9.4.1 Fallstudie: Datenimport von Bankdaten

-- Vor dem Import: Duplikate finden
SELECT blz, COUNT(*) as anzahl 
FROM bankimport 
GROUP BY blz 
HAVING COUNT(*) > 1;

-- Beim Import: Duplikate vermeiden
INSERT IGNORE INTO banken 
SELECT DISTINCT * FROM bankimport;

9.4.2 Was muss ich beim DISTINCT bzgl. der Performance beachten?

DISTINCT kann die Performance beeinträchtigen:

-- Besser: WHERE statt DISTINCT
SELECT firma 
FROM kunden 
WHERE land = 'DE';

-- Statt
SELECT DISTINCT firma 
FROM kunden;

9.5 Ergebnismenge ausschneiden

9.5.1 Wie kann ich die ersten n Datensätze ausschneiden?

LIMIT beschränkt die Anzahl der Ergebnisse:

-- Erste 10 Datensätze
SELECT * FROM produkte 
ORDER BY preis DESC 
LIMIT 10;

-- Alternative Schreibweise
SELECT * FROM produkte 
ORDER BY preis DESC 
LIMIT 0, 10;

9.5.2 Wie kann ich Teilmengen mittendrin ausschneiden?

Für Pagination wird LIMIT mit OFFSET kombiniert:

-- Seite 1 (Datensätze 1-10)
SELECT * FROM produkte LIMIT 0, 10;

-- Seite 2 (Datensätze 11-20)
SELECT * FROM produkte LIMIT 10, 10;

-- Alternativ mit OFFSET
SELECT * FROM produkte 
LIMIT 10 OFFSET 10;

9.6 Ergebnisse exportieren

9.6.1 Wie lege ich eine Exportdatei auf dem Server an?

Ergebnisse können in eine Datei exportiert werden:

-- In CSV exportieren
SELECT * 
INTO OUTFILE '/pfad/export.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM mitarbeiter;

9.6.2 Wie lege ich eine Exportdatei auf dem Client an?

Der Client kann Ergebnisse lokal speichern:

-- Mit MySQL-Client
mysql -e "SELECT * FROM mitarbeiter" > export.txt

-- Mit mysqldump
mysqldump -u user -p --no-create-info 
    meine_db mitarbeiter > export.sql

Tipps für effiziente Abfragen:

  1. Verwenden Sie Indizes:
-- Index für häufige Abfragen
CREATE INDEX idx_datum 
ON bestellungen(bestelldatum);
  1. Vermeiden Sie SELECT *:
-- Besser: Nur benötigte Spalten
SELECT vorname, nachname 
FROM mitarbeiter;
  1. Nutzen Sie EXPLAIN:
-- Abfrage analysieren
EXPLAIN SELECT * FROM produkte 
WHERE preis > 100;
  1. Begrenzen Sie große Ergebnismengen:
-- Mit LIMIT arbeiten
SELECT * FROM protokoll 
ORDER BY datum DESC 
LIMIT 1000;