SQL - Structured Query Language INT UNSIGNED 0 .. 4.294.967.295 Alle relationalen Datenbanken benutzen zur Verwaltung und Auswertung von Daten eine Kommandosprache. Selbst MS Access speichert Abfragen in einem SQL-Dialekt (ist also nicht kompatibel zum ANSI-Standard...). BIGINT -3402823e+31 .. 3402823e+31 DECIMAL(length,dec) Kommazahl der Länge length und mit dec Dezimalstellen; die Länge beträgt: Stellen vor dem Komma + 1 Stelle für Komma + Stellen nach dem Komma Geschichte 1974 Chamberlin u.a. definieren die Sprache SEQUEL für die ersten relationalen Prototypen von DBSystemen. Weiterentwicklung unter dem Namen SQL (Structured Query Language) für die Systeme R und DB2. 1980 SQL wurde in seiner IBM-Implementierung zum Quasi-Standard. 1986 Normierung durch das American National Standard Institute (ANSI X3.135). 1987 Der ANSI - Standard wird zum ISO Standard. (International Standard Organization). 1989 Ergänzung um Sprachelemente zur Beschreibung von Integritätsbedingungen. Sprachkonzept SQL ist eine 4GL- Language, d. h. eine Sprache der Vierten Generation. SQL ist wie PROLOG eine deskriptive Programmiersprache. In SQL werden nicht wie bei den prozeduralen Programmiersprachen Sequenzen, Selektionen und Iterationen programmiert, sondern es werden Schachtelungen aus relationalen Operationen definiert. Der SQL-Anwender muß nicht beschreiben, wie die Ergebnisse zu generieren sind, sondern es müssen nur die gewünschten Ergebnisse spezifiziert werden. Man sagt auch SQL ist nicht eine How-Type-Language, sondern eine What-Type-Language. SQL ist eine mengenorientierte und nicht satzorientierte Sprache. In SQL gilt nicht, wie beispielsweise in COBOL, C und PASCAL "one record at one time", sondern es werden grundsätzlich Mengen verarbeitet und Mengen ausgegeben. SQL ist keine universelle Programmiersprache, sondern auf Datenbanken spezialisiert. SQL besteht aus vier Kommandogruppen zur: Datenauswertung Kommandos für Auswahlabfragen SELECT Datenmanipulation (DML, Data Manipulation Language) INSERT,UPDATE,DELETE Datendefinition (DDL, Data Definition Language) CREATE, ALTER, DROP.... Datenzugriffskontrolle (DCL, Data Control Language) GRANT, REVOKE, LOCK.. SQL-Befehle Tabellen erstellen CREATE TABLE table_name (create_definition,...) Für `create_definition` kann man folgendes einsetzen: Feld-Name Typ [NOT NULL] [AUTO_INCREMENT] [UNIQUE] [PRIMARY KEY] oder PRIMARY KEY (Feldname,...) oder UNIQUE (Feldname,...) oder FOREIGN KEY (Feldname,...) [reference_definition] Für `reference_definition` muß man folgendes einsetzen: REFERENCES table_name[(index_spalte,...)] Hinweise: NOT NULL: Eingabe notwendig AUTO_INCREMENT: nur einmal pro Tabelle in einem Primärschlüsselfeld verwendet werden. UNIQUE: Werte müssen eindeutig sein. (bei Primärschlüsseln automatisch). PRIMARY KEY: Feld wird Primärschlüssel. Schließt „NOT NULL“ und „UNIQUE“ ein. FOREIGN KEY: Fremdschlüsselbeziehung wird von. MySQL ignoriert. Mögliche Datentypen: Typbezeichner Beschreibung TINYINT -128 .. 127 TINYINT UNSIGNED 0 .. 255 INT -2.147.483.648 .. 2.147.483.647 CHAR(NUM) Zeichenkette fester Länge VARCHAR(NUM) [BINARY] Zeichenkette variabler Länge mit max NUM Stellen (1<= NUM <=255). Alle Leerstellen am Ende werden gelöscht. Solange nicht BINARY angegeben wurde, wird bei Vergleichen nicht auf Groß-/Kleinschreibung geachtet. TEXT Text mit einer max. Länge von 65535 Zeichen (gegenüber CHAR und VARCHAR nur eingeschränkte Such- und Sortiermöglichkeiten) BLOB Binärobjekte bzw. Binärdateien (Binary Large Objects) MEDIUMTEXT Text mit einer max. Länge von 16.777.216 Zeichen TIME Zeit; Format: HH:MM:SS, HHMMSS, HHMM oder HH DATE Datum; Format: YYYY-MM-DD, wobei - jedes nicht numerische Zeichen sein kann TIMESTAMP setzt einen Datumswert beim Einfügen/Updaten einzelner Felder automatisch auf das Systemdatum. Format: YYYYMMDDHHMMSS. Wenn mehrere Felder den Typ TIMESTAMP haben, wird immer nur das erste automatisch geändert! Vorhandene Tabellen anzeigen SHOW TABLES Tabellenstruktur anzeigen: SHOW COLUMNS FROM table Indizes... ... werden für ausgewählte Felder angelegt und beschleunigen den Zugriff auf und die Sortierung von Datensätze deutlich. Pflichtfeld definieren: mysql> alter table daten change note note int(11) not null; Index erstellen: mysql> alter table daten add index notind (note); Informationen über Indizes der Tabelle anzeigen: mysql> show index from daten; Tabelle löschen DROP TABLE table_name Datensatz einfügen INSERT INTO table_name [ (feld_name,...) ] VALUES (werte,...) Feldnamen können weggelassen werden, wenn in alle Felder etwas eingefügt werden soll. Werte müssen dann in genau der Reihenfolge eingeben werden, wie die Felder in der CREATE TABLE Anweisung definiert wurden. Zeichenketten und Datum in Hochkomma, Zahlen nicht. mysql> INSERT INTO Mitarbeiter (Name,GebDat) -> VALUES ('Christoph Reeg','1979-5-13'); Datenbankabfragen (SELECT) SELECT [DISTINCT | ALL] select_expression,... FROM tables ... [WHERE where_definition] [GROUP BY feld,...] [ORDER BY feld [ASC | DESC] ,...] [LIMIT [offset,] rows]; Auch wenn die meisten Klauseln optional sind, ist ihre Reihenfolge zwingend. Ein Kommando kann beliebig viele Zeilen enthalten. Leerzeichen, Tabulatoren (Whitespaces) sowie Groß- und Kleinschreibung spielen keine Rolle. Sämtliche Datensätze, alle Felder ausgeben: SELECT * FROM table DISTINCT: identische Zeilen nur einmal ausgeben ALL: sich wiederholenden Werte mehrmals ausgeben (Vorgabe) ORDER BY: nach welchen Spalten soll sortiert werden? ASC: aufsteigende Sortierung DESC: absteigende Sortierung Bsp.: mysql> SELECT * from Mitarbeiter ORDER BY GebDat,Name; GROUP BY-Anweisung: Mehrere Datensätze gruppieren. Bsp.: mysql> SELECT count(*), AbtNr from Mitarbeiter GROUP BY AbtNr; Anzahl der Zeilen, die ausgegeben werden sollen: LIMIT [offset,] rows select_expression Angeben, was angezeigt werden soll. Im einfachsten Fall ist das ein `*`. Bsp.: mysql> select Mitarbeiter.Name, Mitarbeiter.Telefon from Mitarbeiter; Aliase... kann man sowohl für Spalten als auch für Tabellen definieren. Tabellen-Aliase Bsp.: mysql> select M.Name, M.Telefon, M.AbtNr -> FROM Mitarbeiter M; Spalten-Aliase Bsp.: mysql> SELECT count(*) AS Anzahl -> FROM Mitarbeiter; where_definition Mehrere Teilbedingungen können kombiniert werden, z.B. mit AND und OR verknüpft, aber auch mit NOT verneint werden. Bei Vergleichen mit Strings (=VARCHAR) wird im Normalfall nicht auf die Groß-/Kleinschreibung geachtet. Wenn man jedoch unterscheiden will, so muss beim Anlegen der Tabelle bei VARCHAR die Option BINARY angegeben werden. Bsp.: mysql> select * from daten -> where famnam='Müller' and fach='Informatik'; mysql> select * from daten where vornam like "_a%"; Daten sortiert ausgeben: mysql> select * from daten where fach = 'Informatik' order by 'famnam','vornam'; Operator AND OR NOT LIKE BETWEEN IN = <> >(>=) <(<=) Bedeutung beide Kriterien müssen erfüllt sein eines der beiden Kriterien muss erfüllt sein Kriterium wird verneint Vergleichsoperator: Platzhalter "%" für mehrere Zeichen und "_" für genau ein Zeichen wählt alle Spalten aus, die zwischen dem oberen und unteren Wert liegen. Kann bei Textspalten, Datumsspalten und numerischen Spalten verwendet werden. vergleiche mit einer Wertemenge. Kann bei Textspalten, Datumsspalten und numerischen Spalten verwendet werden. Bsp.: mysql> SELECT * FROM schueler -> WHERE Telefon IN ('123','0351/123'); beide Ausdrücke sind "gleich" "ungleich" "größer" ("größer gleich") "kleiner" ("kleiner gleich") order by ... (Datenfeldname)... desc (asc) Datensätze werden absteigend (aufsteigend) sortiert ausgegeben Bei Vergleichen mit NULL-Werten kann nicht mit den normalen Operatoren gearbeitet werden. Statt dessen ist nur IS NULL oder, verneint, IS NOT NULL möglich. Funktionen Bei select_expression und where_expression können neben Konstanten und Spaltenwerten auch Funktionen verwendet werden. Es gibt zwei Arten von Funktionen, zum einen die sog. ,,singlerow``Funktionen und zum anderen die Gruppenfunktionen. Singlerow-Funktionen werden auf jede Zeile angewendet, während die Gruppenfunktionen immer auf eine Gruppe von Zeilen angewendet werden. Mathematische Funktionen (Auswahl) +-*/% ABS() COS() DEGREES() MOD() PI() POW(X,Y) RAND() ROUND() ROUND(x,n) SQRT() TRUNCATE(x,n) addieren/subtrahieren/multiplizieren/dividieren/modulo (ganzzahliger Rest) Betrag von Cosinus in rad Umrechnung von rad in deg (Grad) Modulo (ganzzahliger Rest) die Zahl Pi rechnet X hoch Y aus liefert eine Zufallszahl zwischen 0 und 1 rundet Wert rundet Wert von x auf n Stellen Wurzel schneidet nach n Kommastellen von x ab Sonstige Funktionen NOT / ! logisches NOT. Gibt 1 zurück, wenn das Argument 0 ist, sonst 0. Ausnahme: NOT NULL gibt NULL zurück. AND / && logisches UND. Gibt 0 zurück, wenn eines der Argumente 0 oder NULL ist, sonst 1. OR / || logisches ODER. Gibt 1 zurück, wenn eines der Argumente nicht 0 und nicht NULL ist, sonst 1. | bitweises ODER & bitweises UND CONCAT(str1, str2, ...) Gibt den String zurück, der durch Zusammenführen der Argumente entstanden ist. Sobald ein Argument NULL ist, wird NULL zurückgegeben. LEFT(str,n) schneidet n Buchstaben von `str` ab und gibt diese zurück LTRIM(str) löscht alle Leerzeichen am Anfang von `str` PASSWORD(str) verschlüsselt den Klartext `str` REVERSE(str) dreht `str` um, d.h. letzter Buchstabe ist dann am Anfang LCASE(str) LOWER(str) Wandelt `str` in Kleinbuchstaben und gibt das Ergebnis zurück UCASE(str) UPPER(str) Wandelt `str` in Großbuchstaben und gibt das Ergebnis zurück DAYOFWEEK(date) Gibt den Wochentag-Index des Datums zurück (1 = Sonntag, 2 = Montag, ..., 7 = Samstag) DAYOFMONTH(date) Gibt den Tag des Monats zurück DAYOFYEAR(date) Gibt den Tag im Jahr zurück WEEK(date) WEEK(date,first) Gibt die Woche des Datums zurück. Wenn `first` nicht angegeben wird bzw. 0 ist, fängt die Woche mit Sonntag an. Ist `first` z.B. 1, fängt die Woche mit Montag an. MONTH(date) Gibt den Monat zurück YEAR(date) Gibt das Jahr zurück DATE_FORMAT Formatiert das Datum entsprechend dem übergebenen format String. (date,format) UNIX_TIMESTAMP Gibt den Unix-Timestamp (Sekunden seit dem 1.1.1970) des Datums date zurück. (date) Datums-Format-Funktionen Mit Hilfe von DATE_FORMAT kann man Datumswerte aus Tabellen so formatieren, wie man sie gerne hätte. Die Funktion erwarten zwei Parameter. Zum einen das Datumsfeld, zum anderen den Formatierungs-String. Die Formatierungszeichen (Tabelle) werden durch die entsprechenden Werte ersetzt. Alle anderen Zeichen werden so wie sie sind ausgegeben. In PHP gibt es auch eine Datum-Formatierungsfunktion. Ob man nun mit der MySQL-Funktion das Datum formatiert und dann mit PHP ausgibt oder mit Hilfe der PHP-Funktion das Datum formatiert, ist häufig egal. %W Wochentag %w Tag in der Woche (0 = Sonntag, ..., 6=Samstag) %d Tag des Monats (00 - 31) %e Tag des Monats (0 - 31) %j Tag im Jahr (001 - 366) %U Woche, mit Sonntag als 1. Tag der Woche (00 - 52) %u Woche, mit Montag als 1. Tag der Woche (00 - 52) %M Monatsname %m Monat, numerisch (01 - 12) %c Monat, numerisch (1 - 12) %Y Jahr (4stellig) %y Jahr (2stellig) %T Uhrzeit (24 Std.) (hh:mm:ss) %S Sekunden (00 - 59) %s Sekunden (00 - 59) %i Minuten (00 - 59) %H Stunde (00 - 23) %k Stunde (0 - 23) %h Stunde (00 - 12) %I Stunde (00 - 12) %l Stunde (0 - 12) %% % Gruppenfunktionen (Auswahl) COUNT(expr) zählt die Zeilen, deren Werte ungleich NULL sind AVG(expr) durchschnittlicher Wert MAX(expr) kleinster Wert MIN(expr) größter Wert SUM(expr) Summe (`expr`: Name der Spalte, mit der die Operation erfolgen soll) Joins ... dienen der Verknüpfung 2er Tabellen (Relationen, Master-Detail-Beziehungen etc.). Bsp.: Eine Tabelle enthält die Bestellung, die andere die passende Kundenadresse. mysql> kunden.vornam, kunden.famnam, bestellung.artikel, bestellung.preis -> from kunden,bestellung -> where kunden.nummer = bestellung.kundnu; Equi-Join Bsp.: mysql> SELECT m.Name, m.AbtNr, a.Name, a.AbtNr -> FROM Mitarbeiter m, Abteilung a -> WHERE m.AbtNr = a.AbtNr; Über die AbtNr entsteht die Verbindung zwischen den beiden Tabellen. Self-Join So, wie man mehrere Tabellen miteinander verbinden kann, ist es auch möglich, eine Tabelle mit sich selbst zu verbinden. Bsp.: mysql> SELECT m.Name, m.VNr, v.Name, v.MNr -> FROM Mitarbeiter m, Mitarbeiter v -> WHERE m.VNr = v.MNr; Die Tabelle `Mitarbeiter` kommt zwei Mal innerhalb der FROM-Anweisung auftauchen. Um die Spalten eindeutig bezeichnen zu können, müssen zwei Tabellen-Aliase vergeben werden. Outer-Join Um beim Join alle Tupel der Haupttabelle mit den dazu passenden Tupeln der nachgeordneten Tabelle zu bekommen, wenn nicht zu jedem Tupel der Haupttabelle ein passender Tupel existiert, wird der Outer-Join benötigt. Die Syntax unter mySQL lautet (wo sonst die Tabellennamen stehen): haupttabelle LEFT JOIN tabelle2 ON bedingung oder haupttabelle LEFT JOIN tabelle2 USING (spalte) Bei der unteren Möglichkeit müssen die Spaltennamen in den beiden Tabellen, über die die Verbindung entsteht, gleich sein. Bei der oberen Möglichkeit muss an die Stelle, wo `bedingung` steht, das eingesetzt werden, was man beim Equi-Join als `where_condition` schreiben würde. Bsp.: mysql> SELECT m.Name, m.VNr, v.Name, v.MNr -> FROM Mitarbeiter m LEFT JOIN Mitarbeiter v ON m.VNr = v.MNr; DELETE FROM - Datensätze löschen DELETE FROM table_name [WHERE where_definition] UPDATE - Attribute ändern UPDATE table_name SET column=expression,... [WHERE where_definition] ALTER TABLE - Tabellenstruktur ändern ALTER TABLE table_name alter_spec mit ‘alter_spec’: ADD [COLUMN] create_definition [AFTER column_name | FIRST] oder CHANGE old_column_name create_definition oder ADD PRIMARY KEY (index_spalte,...) oder ADD INDEX (index_spalte,...) oder ADD UNIQUE (index_spalte,...) oder DROP column_name oder DROP PRIMARY KEY oder RENAME new_table_name `create_definition` funktioniert wie bei `CREATE TABLE`. Kommentare: mit /* und */ umrahmen MySQL - relationales Datenbanksystem (RDBMS), - hervorragend für die Entwicklung von Webanwendungen geeignet, - für private Zwecke kostenlos (kein OpenSource-Projekt) - Umgebung: LAMP (Linux...) oder WAMP (Windows - Apache - MySQL - PHP). Benutzer- und Rechteverwaltung Man kann natürlich auch ein grafisches Administrationstool verwenden wie phpMyAdmin... Passwort für Root-User setzen: /usr/bin/mysqladmin -u root -h server -p password 'new-password' Aufruf der MySQL-Kommandozeile: mysql -p{Passwort} -u{Benutzername} {DB-Name} Einige Befehle zur Übung MySQL-Server starten Kommandozeile starten Datenbank anlegen Datenbank verbinden Tabellen anlegen Datenbanken freigeben Betrifft Tabelle 'db' der Datenbank 'mysql'. 1. Datenbank 'mysql' verwenden: mysql> use mysql; 2. Datenbank in die Tabelle 'db' eintragen: mysql> insert into db values -> ('%','testdb','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); 3. Privilegientabelle aktualisieren: mysql> flush privileges; Struktur anzeigen lassen Tabellenstruktur verändern: ... Datenfeld hinzufügen ... Datenfeld entfernen ... Datenfeldtyp ändern ... Datenfeldgröße ändern ... Datenfeldnamen ändern ... Tabellennamen ändern neue Datensätze in bestehende Tabelle eintragen Datensätze anzeigen: ... alle ... ausgewählte Felder ... gefiltert Datensatz ändern Die Datenbank ‘testdb’ kann nun von allen Rechnern aus und von allen MySQL-Usern verwendet werden. Alle Rechte wurden vergeben Datensatz löschen: Benutzer anlegen 1. Datenbank 'mysql' verwenden: mysql> use mysql; 2. User in die Tabelle 'user' eintragen: mysql> insert into user values -> ('localhost','test','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); 3. Privilegientabelle aktualisieren: mysql> flush privileges; Benutzer 'test' ist nun mit allen Rechten ausgestattet, wenn er vom Rechner 'localhost' eingeloggt ist. Berechtigungen erteilen Betrifft Tabelle 'user': Privileg Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv mysql> describe user; Zugehörige Berechtigung Datensätze suchen neue Datensätze einfügen vorhandene Datensätze ändern Datensätze löschen Datenbanken und Tabellen erstellen Datenbanken und Tabellen entfernen MySQL-Einstellungen neu laden MySQL-Server herunterfahren Status-Informationen über Server abrufen Dateien am Server lesen und schreiben Rechte vergeben ... derzeit nicht benutzt Index-Dateien erstellen oder entfernen Tabellen oder Indexdateien verändern Dateirechte setzen Betrifft Tabelle 'db': mysql> describe db; Veränderte Rechte werden wirksam, nachdem die Berechtigungstabelle mit dem Befehl 'flush privileges' aktualisiert wurde. Mit MySQL-Server im Netz verbinden mysql -h butler.nuss -u username -p mysql> select user(); MySQL benutzen Batch-Betrieb: mysql -p{Passwort} -u{Benutzername} {DB-Name} < dateiname rcmysql start mysql -p mysql> create database kurs; mysql> connect kurs; mysql> create table daten (vornam varchar (30), -> famnam varchar (30), fach varchar (20), note int); mysql> describe daten; mysql> alter table daten add adr varchar(50); mysql> alter table daten drop adr; mysql> alter table daten change note note char(3); mysql> alter table daten change fach fach varchar(40); mysql> alter table daten change fach gegenstand varchar(20); mysql> alter table daten rename schueler; mysql> insert into daten values ('Morty','Maus','Informatik','2'); mysql> select * from daten; mysql> select famnam, note from daten; mysql> select * from daten where famnam='Müller'; mysql> update daten -> set note='1' -> where note='3'; mysql> delete from daten -> where vornam='Gustav';