MySQL – Kurzreferenz Teil 2: Abfragen und Programmierung – Beispiele Abfragen: Abfragen:Einfache EinfacheAbfragen Abfragen Beispiel 1: Abruf aller Zeilen und Spalten SELECT * FROM Person; Beispiel 2: Filterung mit WHERE und Sortierung mit ORDER BY, Sortierung erst nach P_Nachname (DESC, absteigend) und dann nach P_Vorname (automatisch aufsteigend) SELECT FROM WHERE ORDER P_Vorname, P_Nachname Person year(P_Geburtstag) >= 1978 BY P_Nachname DESC, P_Vorname; Beispiel 3: Ausblendung von Duplikaten im Ergebnis SELECT DISTINCT A_Stadt FROM Adresse; Beispiel 4: Sortierung durch Angabe der Spaltennummer in der Spaltenliste SELECT P_Vorname, P_Nachname FROM Person ORDER BY 2 DESC, 1; Beispiel 5: Anwenden von Funktionen auf Spalten in SELECT und in WHERE, Erstellung von Spaltenaliasnamen und ihre Verwendung in der Sortierung SELECT FROM WHERE ORDER concat(P_Vorname, ‘ ‘, P_Nachname) AS Name Person concat(P_Vorname, ‘ ‘, P_Nachname) LIKE ‘%Ebenhof’ BY Name; Beispiel 6: Verschiedene Operatoren in der WHERE-Klausel SELECT FROM WHERE AND AND P_Vorname, P_Nachname Person P_Nr BETWEEN 1 AND 5 month(P_Geburtstag) IN (4, 5, 6) (P_Nachname LIKE ‘_ben%’ OR P_Nachname LIKE ‘Hülze%’); Import Importund undExport Export Beispiel 1: Laden einer CSV-Datei als Import LOAD DATA LOCAL INFILE ‘C:\\person.csv’ REPLACE INTO TABLE ‘person’ FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘“‘ ESCAPED BY ‘\\’ LINES TERMINATED BY ‘\r\n’ Beispiel 2: Schreiben einer CSV-Datei als Export SELECT INTO FIELDS LINES FROM P_Vorname, P_Nachname OUTFILE ‘C:\\xampp\\mysql\\ergebnis.csv’ TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘“‘ TERMINATED BY ‘\r\n’ Person; Abfragen: Abfragen:Verknüpfungen Verknüpfungen Beispiel 1: Standardfall von zwei verknüpften Tabellen. Verknüpfung über mehrere Spalten gelingt mit ON t1.spalte1 = t2.spalte1 AND t1.spalte2 = t2.spalte2. SELECT P_Nachname AS Nachname, K_Wert AS Email FROM Kontakt k INNER JOIN Person p ON k.P_Nr = p.P_Nr WHERE P_Nachname = ‘Ebenhof’ AND K_Art = ‘Email’; Beispiel 2: Standardfall von drei (und mehr) verknüpften Tabellen SELECT P_Nachname AS Nachname, A_Stadt AS Stadt, K_Wert AS Email FROM Kontakt k INNER JOIN Person p ON k.P_Nr = p.P_Nr INNER JOIN Adresse a ON a.P_Nr = p.P_Nr WHERE P_Nachname = ‘Ebenhof’ AND K_Art = ‘Email’; Beispiel 3: Standardfall der äußeren Verknüpfung, die sowohl alle Daten aus Person (linke äußere Verknüpfung) sowie ggf. gefundene Datensätze aus Adresse und Kontakt (ansonsten Auffüllung mit NULL). SELECT P_Nachname AS Nachname, A_Stadt AS Stadt, K_Wert AS Email FROM Person p LEFT OUTER JOIN Adresse a ON a.P_Nr = p.P_Nr LEFT OUTER JOIN Kontakt k ON k.P_Nr = p.P_Nr; Beispiel 4: Natürliche Verknüpfung über gleich lautende Spaltennamen (empfehlenswerte Modellierung). SELECT P_Nachname AS Nachname, K_Art AS KontaktArt, K_Wert AS Wert FROM Kontakt k NATURAL JOIN Person p; Beispiel 5: Alternative Formulierung mit USING für gleich lautende Spaltennamen SELECT P_Nachname AS Nachname, K_Art AS KontaktArt, K_Wert AS Wert FROM Kontakt k INNER JOIN Person p USING (P_Nr); Abfragen: Abfragen:Gruppierung Gruppierung Beispiel 1: Anzahl der Personen gruppiert nach dem Geburtsjahr und gefiltert bei mehr als seiner Person pro Jahr SELECT year(P_Geburtstag) AS Jahr, COUNT(*) AS Anzahl FROM Person GROUP BY Jahr HAVING Anzahl > 1; Beispiel-Tabellen Beispiel-Tabellen PERSON (P_Nr, P_Vorname, P_Nachname, P_Geburtstag) ADRESSE (A_Nr, P_Nr, A_Strasse, A_PLZ, A_Stadt) KONTAKT (K_Nr, P_Nr, K_Art, K_Wert ) Beispiel 2: Kombinierte Gruppierung von Jahr und Stadt SELECT year(P_Geburtstag) AS Jahr, A_Stadt AS Stadt, COUNT(*) AS Anzahl FROM Person NATURAL JOIN Adresse GROUP BY Jahr, A_Stadt; Sichten Sichten Beispiel 1: Erstellung einer Sicht mit den OriginalSpaltennamen CREATE VIEW v_Adressbuch AS SELECT P_Nr, P_Vorname, P_Nachname FROM Person; Beispiel 2: Sicht mit neuen Spaltennamen, die im Sicherheitskontext des Erstellers ausgeführt wird CREATE SQL SECURITY DEFINER VIEW v_Adressbuch (Nr, Vorname, Nachname) AS SELECT P_Nr, P_Vorname, P_Nachname FROM Person; Beispiel 3: Abfrage der Sicht (genauso wie bei einer Tabelle) SELECT Vorname, Nachname FROM v_Adressbuch WHERE Nachname = ‘Ebenhof’; Beispiel 4: Verwendung einer aktualisierbaren Sicht als Ziel von DML-Operationen INSERT INTO v_Adressbuch VALUES (4, ‘Heidi’, ‘Stern’); SQL-Programmierung: SQL-Programmierung:Fallunterscheidungen Fallunterscheidungen Beispiel 1: Fallunterscheidung mit CASE und Prüfung auf Gleichheit SELECT P_Nr AS Person, CASE K_Art WHEN ‘Email’ THEN ‘Internet’ WHEN ‘Fest’ THEN ‘Telefon’ ELSE ‘Handy’ END AS K_Art, K_Wert FROM Kontakt; Beispiel 2: Prüfung von Werten und Bereichen ohne einfache Gleichheit SELECT A_Stadt AS Stadt, CASE WHEN COUNT(*) < 5 THEN ‘A’ WHEN COUNT(*) BETWEEN 5 AND 10 THEN ‘B’ ELSE ‘C’ END AS Typ FROM Adresse GROUP BY A_Stadt; MySQL – Kurzreferenz Teil 2: Abfragen und Programmierung – Beispiele Datenmanipulation: Datenmanipulation:Einfügen Einfügen Datenmanipulation: Datenmanipulation:Ersetzen Ersetzen Beispiel 1: Einfügen in alle Spalten (keine Nennung der Spalten) Beispiel 1: Ersetzen von Daten mit VALUES-Klausel INSERT INTO ‘Adressverwaltung’.’Person’ VALUES ( 1, ‘Anton’, ‘Ebenhof’, ‘1968-04-06’ ); Beispiel 2: Ersetzen mit SET-Klausel und einzelner Spaltenzuweisung REPLACE INTO ‘Adressverwaltung’.’Person’ SET P_Nr = 1, P_Vorname = ‘Anton’, P_Nachname = ‘Ebenhof’, P_Geburtstag = ‘1978-04-06’ ; INSERT INTO Person ( P_Nr , P_Vorname , P_Nachname ) VALUES ( 2, ‘Elvira’, ‘Hülzemann’), ( 3, ‘Anna-Mae’, ‘Bullock’); Beispiel 3: Ersetzen aus Abfrage REPLACE INTO ‘Adressverwaltung’.’Person’ SELECT Nr+4, Vorname, Nachname, GebDatum FROM Person_Import; Beispiel 3: Einfügen aus Abfragen (auto_increment-Schlüssel in Tabelle Person hier einfacher, +3 steht für höchsten Schlüsselwert in Person) Beispiel 4: Einfügen oder Aktualisierung INSERT INTO Person SET P_Nr = 1, P_Vorname = ‘Anton’, P_Nachname = ‘Ebenhof’, P_Geburtstag = ‘1978-04-06’ ON DUPLICATE KEY UPDATE P_Vorname = ‘Anton’, P_Nachname = ‘Ebenhof’, P_Geburtstag = ‘1978-04-06’; Datenmanipulation: Datenmanipulation:Löschen Löschen Beispiel 1: Leeren einer Tabelle DELETE FROM ‘Adressverwaltung’.’Kontakt’; Beispiel 2: Löschen von gefilterten Datensätzen DELETE FROM ‘Adressverwaltung’.’Kontakt’ WHERE ‘K_Nr’ = 1; Beispiel 3a: Löschen von Datensätzen aus einem Verbund DELETE k, p FROM ‘Adressverwaltung’.’Kontakt’ k INNER JOIN ‘Adressverwaltung’.’Person’ p ON k.P_Nr = p.P_Nr; Beispiel 3b: Alternative Formulierung zu 3a DELETE FROM k, p USING ‘Adressverwaltung’.’Kontakt’ k INNER JOIN ‘Adressverwaltung’.’Person’ p ON k.P_Nr = p.P_Nr; Zusammengestellt von Marco Skulschus Layout und Satz: Nadine Kilian © 2012 Comelio Medien Beispiel 1 : Prozedur für eine parametrisierte Abfrage REPLACE INTO ‘Adressverwaltung’.’Person’ VALUES ( ‘1’, ‘Anton’, ‘Ebenhof’, ‘1971-04-27’); Beispiel 2: Einfügen in eine Unterauswahl der Spalten und Einfügen mehrerer Zeilen INSERT INTO Person SELECT Nr+4, Vorname, Nachname, GebDatum FROM Person_Import; Prozeduren Prozeduren Datenmanipulation: Datenmanipulation:Aktualisieren Aktualisieren INSERT INTO Kontakt ( P_Nr, K_Art, K_Wert ) VALUES ( ‘1’, ‘Email’, ‘[email protected]’ ); UPDATE Kontakt SET K_Wert = ‘[email protected]’ WHERE P_Nr = 1 AND K_Art = ‘Email’; Beispiel 2: Prozedur mit Ausgabeparameter und lokalen Variablen SQL-Programmierung: SQL-Programmierung:Schleifen Schleifen Beispiel 1: Einfacher LOOP mit Ausstiegsbedingung DECLARE nr INT; SET nr = 0; zaehler: LOOP SET nr = nr + 1; SELECT nr; IF nr = 10 THEN LEAVE zaehler; END IF; END LOOP zaehler; Beispiel 2: Einfaches WHILE mit Fortsetzungsanweisung Trigger Trigger Beispiel 1: Papierkorb-Tabelle für gelöschte Datensätze mit Trigger für Lösch-Aktion und Zugriff auf die gerade gelöschten Datensätze. Weiterer sinnvoller Trigger: Aktualisierungsaktion. CREATE TABLE ‘PersonPapierkorb’ ( ‘P_Nr’ INT NOT NULL, ‘P_Nachname’ VARCHAR(30) NOT NULL, ‘P_Aktion’ SET (‘DEL’, ‘UPD’) NOT NULL, ‘P_Datum’ DATETIME DEFAULT now() ); DELIMITER $$ CREATE TRIGGER trg_Person AFTER DELETE ON Person FOR EACH ROW BEGIN INSERT INTO PersonPapierkorb SET P_Nr = OLD.P_Nr, P_Nachname = OLD.P_Nachname, P_Aktion = ‘DEL’; END; $$ Comelio GmbH Goethestr. 34, 13086 Berlin Web: www.comelio.com DELIMITER $$ CREATE PROCEDURE getKontaktDetails(IN pnr INT) BEGIN SELECT K_Art, K_Wert FROM Kontakt WHERE P_Nr = pnr; END; $$ -- Aufruf CALL getKontaktDetails(1); DECLARE nr INT; SET nr = 0; zaehler: WHILE nr <= 5 DO SET nr = nr + 1; IF nr = 3 THEN ITERATE zaehler; END IF; SELECT nr; END WHILE zaehler; Beispiel 3: Einfacher REPEAT mit Ausstiegsbedingung DECLARE nr INT; SET nr = 0; zaehler: REPEAT SET nr = nr + 1; IF nr = 5 THEN ITERATE zaehler; END IF; SELECT nr; UNTIL nr <= 10 END REPEAT zaehler; Terrashop GmbH Lise-Meitner-Str. 8, 53332 Bornheim Web: www.terrashop.de DELIMITER $$ CREATE PROCEDURE getKontakt(IN nr INT, OUT kontakt CHAR(100) ) BEGIN -- Variablendeklaration DECLARE vorname CHAR(30); DECLARE nachname CHAR(30); -- Abruf von Werten aus DB SELECT P_Vorname, P_Nachname INTO vorname, nachname FROM Person WHERE P_Nr = nr; -- Zuweisung an Ausgabe-Parameter SET kontakt = concat(vorname, ‘ ‘, nachname); END; $$ -- Aufruf CALL getKontakt(1, @text); SELECT @text; Beispiel 3: Funktion für Aufruf in SQL DELIMITER $$ CREATE FUNCTION getAdresse (pnr INT) RETURNS CHAR(100) DETERMINISTIC READS SQL DATA BEGIN DECLARE adresszeile CHAR(100); SELECT concat(A_PLZ, ‘ ‘, A_Stadt) INTO adresszeile FROM Adresse WHERE P_Nr = pnr; RETURN adresszeile; END; $$ -- Aufruf SELECT P_Nachname, getAdresse(P_Nr) AS Adresse FROM Person; ISBN 978-3-939701-78-1 9 783939 701781