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

Autor: , veröffentlicht: , letzte Änderung:

Kontakt

Copyright / License of sources

Copyright (c) 2007-2017, Udo Schmal <udo.schmal@t-online.de>

Permission to use, copy, modify, and/or distribute the software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Service Infos

CMS Info
UDOs Webserver

0.3.1.24

All in one Webserver

Udo Schmal

Sa, 21 Okt 2017 00:30:10
Development Info
Lazarus LCL 1.9.0.0

Free Pascal FPC 3.1.1

OS:Win64, CPU:x86_64
Hardware Info
Precision WorkStation T3500

Intel(R) Xeon(R) CPU W3530 @ 2.80GHz

x86_64, 1 physical CPU(s), 4 Core(s), 8 logical CPU(s), 2800 MHz