MySQL, komplexer SELECT MySQL, komplexer SELECT SELECT Bestandteile Begriff Beschreibung Optionen zur Beeinflussung der Verarbeitung ALL wird benutzt um alle unterschiedliche Werte zu erhalten (das ist der Standard) DISTINCT wird benutzt um lediglich unterschiedliche Werte zu erhalten DISTINCTROW wird benutzt um lediglich unterschiedliche Werte zu erhalten auch wenn durch die Verbindung in der Abfrage doppelte Einträge entstehen HIGH_PRIORITY gibt dem SELECT höhere Priorität als eine Anweisung, die eine Tabelle aktualisiert STRAIGHT_JOIN zwingt den Optimierer die Tabellen in der Reihenfolge in der sie in der FROM-Klausel aufgeführt sind einzubinden MAX_STATEMENT_TIME = N setzt ein Anweisungsausführungs-Timeout abweichend von der System Variable max_statement_time Erweiterungen von MySQL die nicht in Standard-SQL enthalten sind SQL_SMALL_RESULT / SQL_BIG_RESULT Optimierung im Zusammenhang mit GROUP BY / DISTINCT unter Verwendung von temporären Tabellen SQL_BUFFER_RESULT Erzwingt ein zwischenspeichern des Ergebnisses in eine temporäre Tabelle SQL_CACHE / SQL_NO_CACHE Zwischenspeichern des Ergebnisses im Abfragecache SQL_CALC_FOUND_ROWS ermittelt die Ergebnismenge (Anzahl der Datensätze) Eingrenzung der Ergebnismenge WHERE Eingrenzung durch Vergleiche von Feldwerten GROUP Zusammenfassung bei Übereinstimmung von Feldwerten HAVING Eingrenzung durch Vergleich der Ergebniswerte, am Ende vor der Übermittlung der Werte (Achtung: ohne Optimierung)) LIMIT Beschränkung der Ergebnismenge (Übergabe Start, Anzahl) PARTITION Eingrenzungen auf Bereiche die zuvor in der Tabelle definiert werden müssen Sortierung der Ergebnismenge ORDER BY Sortierung nach den angegebenen Feldern unter Angabe der Sortierrichtung (ASC = aufsteigend, DESC = absteigend) --------------------------------------------- JOINS Equi-Join, Inner-Join (oder auch nur Join) & Cross-Join Liefert alle Ergebnisse (Werte der selektierten Felder) aus beiden Tabellen wo die Schlüsselfelder der Zuordnung zusammenpassen. z.B. alle Artikel die einem Autor zugeordnet sind und den zugeordneten Autor. Der Cross-Join liefert ein Ergebnis aus beiden Tabellen es gibt ein kartesische Produkt der verknüpften Tabellen zurück falls keine Where-Bedingung angegeben wird. Ist in der Where-Bedingung die Verknüpfungseigenschaft angegeben entspricht das Ergebnis dem des Inner-Join ohne Where-Bedingung. SELECT p.title, p.subtitle, a.name, a.image FROM pages p, author a WHERE p.authorid = a.uid;SELECT p.titel, p.subtitel, a.name, a.image FROM pages p INNER JOIN author a ON p.authorid = a.uid;SELECT p.titel, p.subtitel, a.name, a.image FROM pages p CROSS JOIN author a WHERE p.authorid = a.uid; Left-Join Liefert alle Ergebnisse aus der ersten (links stehenden) Tabelle und die dazu passenden Werte aus der zweiten (rechts stehenden) Tabelle.  z.B. alle Artikel und die falls vorhanden ihre Autoren SELECT p.titel, p.subtitel, a.name, a.image FROM pages p LEFT JOIN author a ON p.authorid = a.uid; Right-Join Liefert alle Ergebnisse aus der zweiten (rechts stehenden) Tabelle und die dazu passenden Werte aus der ersten (links stehenden) Tabelle.  z.B. alle Autoren (auch mehrfach) mit den Artikeln die dem Autor zugeordnet sind SELECT p.title, p.subtitle, c.body, c.image FROM pages p RIGHT JOIN content c ON p.uid = c.pid; Outher-Join Lifert alle Ergebnisse aus beiden Tabellen. z.B. alle Autoren (auch mehrfach) mit allen Artikeln, auch Artikel ohne Autor und Autoren ohne Artikel. SELECT p.title, p.subtitle, c.body, c.image FROM pages p OUTHER JOIN content c ON p.uid = c.pid; Self-Join Eine Tabelle wird mit sich selbst verknüpft, die folgende Abfrage würde z.B. alle Seiten der zweiten Ebene der Tabelle pages als Ergebnis liefern. SELECT p2.uid, p2.title FROM pages AS p1, pages AS p2 WHERE p1.pid =0 AND p2.pid = p1.uid; --------------------------------------------- UNION SELECT Wird genutzt um mehrere SELECTS zu verbinden zu einem Ergebnis, es ermöglicht also auch Ergebnisse aus unterschiedlichen Tabellen zu kombinieren, z.B. alle Autoren und Redakteure über 65 im Verlag. (SELECT 'author', a.uid, a.name, a.image FROM author a WHERE age>65) UNION (SELECT 'redakteur', r.uid, r.name, r.image FROM redakteur r WHERE age>65); --------------------------------------------- Operatoren Name Beschreibung AND, && logisches UND (AND) = Weist einen Wert zu, im Zusmenhang mit dem SET / UPDATE statement := Wert zuweisen BETWEEN ... AND ... Überprüfen ob ein Wert in einem Bereich von Werten liegt BINARY Wandelt eine Zeichenkette in einen Binärzeichenkette & bitweise UND-Verknüpfung ~ bitweise Invert (Umkehrung) | bitweise ODER-Verknüpfung ^ bitweise Exclusive-ODER-Verknüpfung CASE Fall-Unterscheidungs Operator DIV Ganzahlen Teilung (Division) / Division Operator <=> IS NOT DISTINCT Gleichheits Überprüfung NULL-safe = Gleichheits Operator >= größer/gleich Operator > größer als Operator IS NOT NULL ist nicht NULL, Wertüberprüfung IS NOT ist nicht, boolscher Wertevergleich IS NULL ist NULL, Wertüberprüfung IS ist, boolscher Wertevergleich << bitweise Schiebeoperation nach links (shl) <= kleiner/gleich Operator < kleiner als Operator LIKE Bestandteil (Teilzeichenkette), einfache Mustererkennung - Minus Operator MOD, % Divisionsrest (Modulo) Operator NOT BETWEEN ... AND ... Überprüfen ob ein Wert nicht in einem Bereich von Werten liegt !=, <> Ungleich Operator NOT LIKE kein Bestandteil (Teilzeichenkette), einfache Mustererkennung NOT REGEXP entspricht nicht der Regular Expression NOT, ! Negation des Wertes ||, OR logisches ODER (OR) + Addition Operator REGEXP, RLIKE entspricht der Regular Expression >> bitweise Schiebeoperation nach rechts (SHR) SOUNDS LIKE Klingt ähnlich, Vergleich des Soundex Strings * Multiplikation Operator - Change the sign of the argument XOR logisches Exklusive-ODER (XOR) --------------------------------------------- Funktionen Name Beschreibung Ablaufsteuerung IF() IF/ELSE Konstrukt auf der Basis einer Überprüfung auf True IFNULL() IF/ELSE Konstrukt auf der Basis einer Überprüfung auf NULL NULLIF() Ergebnis ist NULL wenn der Ausdruck True ist Zeichenketten Funktionen ASCII() numerischer Wert des ersten Zeichens einer Zeichenkette. Gibt bei einem Leer-String 0 zurück und NULL wenn der String den Wert NULL hat. BIN() Liefert eine Zeichenkettendarstellung eines Binärwertes (Zahl) zurück CHAR() Umwandlung Zahl in Zeichen CHAR_LENGTH(), CHARACTER_LENGTH() Anzahl der Zeichen einer Zeichenkette CONCAT_WS() Verketten von Zeichenketten mit Separator CONCAT() Verketten von Zeichenketten ELT() Liefert eine Zeichenkette aus einer Liste von Zeichenketten ENCODE() Kodieren einer Zeichenkette ENCRYPT() Verschlüsseln einer Zeichenkette FIELD() Liefert die Position einer Zeichenkette in einer Liste von Zeichenketten FROM_BASE64() dekodiert eine BASE64 kodierte Zeichenkette HEX() hexadezimale Darstellung einer Dezimalzahl oder einer Zeichenkette INSERT() Einfügen einer Zeichenkette in einer Zeichenkette an einer definierten Stelle INSTR() Position des ersten Auftretens einer Zeichenkette in einer Zeichenkette LEFT() Anzahl von Zeichen einer Zeichenkette beginnend von links LENGTH(), OCTET_LENGTH() Länge der Zeichenkette in Bytes LOCATE(), POSITION() Position des ersten Auftreten eines einer Teil-Zeichenkette in einer Zeichenkette LOWER(), LCASE() Zeichekette in Kleinbuchstaben LPAD() Zeichenkette links mit Füllzeichen(kette) auffüllen LTRIM() Führende Leerzeichen entfernen MAKE_SET() Umformen eines Bitwertes in eine Kommaseparierte Zeichenkette MID() Teilzeichenkette aus einer Zeichenkette ab einer Position mit einer definierten Länge ORD() Zeichencode des Ersten Zeichens einer Zeichenkette QUOTE() Zeichenkette codieren um sie in SQL-Syntax benutzen zu können REPEAT() Zeichenkette mehrfach wiederholen REPLACE() Teilzeichenkette in einer Zeichenkette ersetzen REVERSE() Reihenfolge der Zeichen einer Zeichenkette umkehren RIGHT() Anzahl von Zeichen einer Zeichenkette beginnend von rechts RPAD() Zeichenkette rechts mit Füllzeichen(kette) auffüllen RTRIM() Leerzeichen am Ende einer Zeichenkette entfernen SOUNDEX() soundex Zeichenkette SPACE() Zeichenkette mit einer Anzahl von Leerzeichen STRCMP() zwei Zeichenketten vergleichen SUBSTR(), SUBSTRING() Teilzeichenkette aus Zeichenkette extrahieren SUBSTRING_INDEX() Teilzeichenkette aus Zeichenkette extrahieren an Hand des Auftretens eines Trennzeichens TO_BASE64() kodiert eine Zeichenkette BASE64 TRIM() Leerzeichen am Anfang und Ende einer Zeichenkette entfernen UCASE(), UPPER() Zeichenkette in Großbuchstaben UNHEX() hexadezimale Darstellung zurück wandeln, Umkehrung der Funktion HEX() WEIGHT_STRING() Gewichtung einer Zeichenkette, ist z.B. unabhängig von Groß-/Kleinschreibung mathematische Funktionen ABS() absoluten Wert, also ohne Vorzeichen ACOS() Arkuskosinus ASIN() Arcussinus ATAN(), ATAN2() Arcustangens AVG() Durchschnittswert vom Argument CEIL(), CEILING() Liefert die kleinste ganze Zahl nicht kleiner als das Argument CONV() Wandelt Zahlen zwischen verschiedenen Zahlensystemen COS() Kosinus COT() Kotangens DEGREES() Konvertierung Bogenmaß in Grad EXP() Exponent zur Basis e (die Basis des natürlichen Logarithmus) FLOOR() Liefert die größte ganze Zahl nicht größer als das Argument LN() natürlicher Logarithmus LOG() natürlicher Logarithmus des ersten Argumentes LOG10() Logarithmus zur Basis 10 LOG2() Logarithmus zur Basis 2 MIN() kleinster Wert einer Werteliste MOD() Divisionsrest PI() Zahl pi (π) POW(), POWER() Potenzrechnung RADIANS() Konvertierung Grad in Bogenmaß RAND() Zufallszahl (Gleitkommazahl) ROUND() mathematisches Runden SIGN() Vorzeichen, - = -1, 0 = 0, + = 1 SIN() Sinus SQRT() Quadratwurzel, Wurzel SUM() Summe TAN() Tangens TRUNCATE() Anteil von Nachkommastellen abschneiden Datum/Zeit Funktionen ADDDATE() Zeit-/Datum Intervall auf ein Datum aufaddieren ADDTIME() Zeit-Intervall auf eine Zeit aufaddieren CONVERT_TZ() Wandelt Datumszeit-Werte unter Berücksichtigung von Zeit-Zonen CURDATE(), CURRENT_DATE(), CURRENT_DATE aktuelles Datum CURTIME(), CURRENT_TIME(), CURRENT_TIME aktuelle Zeit CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP, NOW(), LOCALTIME(), LOCALTIME, LOCALTIMESTAMP, LOCALTIMESTAMP() aktueller Datum-/Zeit-Stempel in unterschiedlichen Formaten (z.B. 'YYYY-MM-DD HH:MM:SS') DATE_ADD() Zeit-/Datum Intervall auf ein Datum aufaddieren DATE_FORMAT() formatiert den Datenwert entsprechend dem Format-String DATE_SUB(), SUBDATE() Zeit-/Datum Intervall von einem Datum abziehen DATE() Extrahieren des Datum-Teils eines Datum oder Datetime-Ausdruckes DATEDIFF() Zeitdifferent DAY(), DAYOFMONTH() Tag des Monats (0-31) DAYNAME() Name des Wochentages, abhängig von lc_time_names DAYOFWEEK() Wochentag als Index, (1 = Sunday, 2 = Monday, …, 7 = Saturday) DAYOFYEAR() Tag des Jahres (1-366) EXTRACT() Extrahiert einen Teil eines Datums FROM_DAYS() Tageszahl in Datum konvertieren FROM_UNIXTIME() formatiert UNIX timestamp als Datum GET_FORMAT() ermittelt Format, z.B. in Kombination mit DATE_FORMAT() und STR_TO_DATE() zu gebrauchen HOUR() Extrahiert den Stunden-Wert LAST_DAY Datum des letzten Tages des Monats MAKEDATE() Datum aus Jahr, Monat und Tag MAKETIME() Zeit aus Stunde, Minute und Sekunde MICROSECOND() Mikrosekundenanteil einer Zeitwertes MINUTE() Minutenanteil einer Zeitwertes MONTH() Monatsanteil eines Datumswertes MONTHNAME() Monatsname eines Datumswertes PERIOD_ADD() Monat(e) hinzufügen zu einer Periode (Jahr und Monats Wert) PERIOD_DIFF() Monatsdifferenz einer Periode (Jahr und Monats Wert) QUARTER() Quartal des Jahres SEC_TO_TIME() Sekunden in Uhrzeit wandeln SECOND() Sekundenanteil eines Zeitwertes STR_TO_DATE() konvertiert Zeichenkette in Datum SUBTIME() Zeit-Intervall von einer Zeit abziehen TIME_FORMAT() Formatierung der Datums-/Zeit-Ausgabe TIME_TO_SEC() Zeit in Sekunden wandeln TIME() Zeit aus Datums-/Zeit-Wert TIMEDIFF() Zeitdifferenz TIMESTAMP() Datum in Zeitstempel wandeln TIMESTAMPADD() Zeit-Intervall auf Zeitstempel aufaddieren TIMESTAMPDIFF() Differenz zweier Zeitstempel TO_DAYS() Tage seit 01.01.0000 TO_SECONDS() Sekunden seit 01.01.0000 00:00:00 UNIX_TIMESTAMP() UNIX Zeitstempel, Sekunden seit 1970-01-01 00:00:00 UTC UTC_DATE() aktuelles UTC Datum UTC_TIME() aktuelle UTC Zeit UTC_TIMESTAMP() aktuelles UTC Datum und Zeit WEEK() Woche des Jahres WEEKDAY() Wochentag als Zahl WEEKOFYEAR() Kalenderwoche (1-53) YEAR() Jahresanteil eines Datums YEARWEEK() Jahr und Monat eines Datums