105 Shells, Skripte und Datenverwaltung
Jump to navigation
Jump to search
mail
105.1 Die Shell Umgebung anpassen und verwenden
Kandidaten sollten in der Lage sein, Shellumgebungen gemäß der Anforderungen von Benutzern anzupassen. Kandidaten sollten in der Lage sein, globale Voreinstellungen und die von Benutzern zu ändern.
Ein ganz netter Link:
Wichtigste Wissensgebiete
- Umgebungsvariable (etwa PATH) beim Anmelden oder Erzeugen einer neuen Shell setzen
- Bash-Funktionen für häufig gebrauchte Kommandofolgen erstellen
- Skelett-Verzeichnisse für neue Benutzerkonten warten
- Den Kommando-Suchpfad mit den richtigen Verzeichnissen setzen
/etc/profile env set unset export ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc ~/.bash_logout function alias lists
export
- Ein Export kann NIE an eine übergeordnete Shell erfolgen!
root:~# TEST=Hallo root:~# bash root:~# echo $TEST root:~# export TEST=Hallo root:~# bash root:~# echo $TEST Hallo
env
- env − ein Programm in einer veränderten Umgebung laufen lassen
ÜBERSICHT env [OPTION]... [−] [NAME=WERT]... [BEFEHL [ARG]...] BESCHREIBUNG Jeden NAMEn in der Umgebung auf WERT setzen und BEFEHL ausführen. −i, −−ignore−environment Mit einer leeren Umgebung beginnen −0, −−null Jede Ausgabezeile mit einem Nullbyte statt des Zeilenumbruchs abschließen −u, −−unset=NAME Variable aus der Umgebung entfernen −−help Diese Hilfe anzeigen und beenden −−version Versionsinformation anzeigen und beenden Ein einzelnes »−« impliziert −i. Wenn kein BEFEHL angegeben ist, wird die resultierende Umgebung aus- gegeben. SIEHE AUCH Die vollständige Dokumentation für env wird als Texinfo−Handbuch gepflegt. Wenn die Programme info und env auf Ihrem Rechner ordnungsgemäß installiert sind, können Sie mit dem Befehl info coreutils 'env invocation' auf das vollständige Handbuch zugreifen.
set
- Umgebungsvariablen einsehen
- set | less
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HISTSIZE=500 ...
unset
- Umgebungsvariablen löschen
alias
- Mehrere Kommandos per ; trennen
- alias zum anzeigen aller aliase
alias ..='cd ..' alias ...='cd ../..' alias dir='cd ../..' alias ls='ls --color=auto'
- Which kann ein alias sein auf "type -p". Allerings nicht unter debian
Aliase escapen
alias ls='ls --color=auto' 'ls' #oder \ls
function
function Funktionsname() { kommando1 kommando2 kommandon }
- function kann weggelassen werden (die Bash erkennt die beiden Klammern)
- Rechenoperationen:
function addiere() { let summe=$1+$2 echo Das Ergebnis lautet "$summe" } funtion addiere() { let summe=$1+$2; echo Die Summe lautet $summe; }
- builtin : bash internes Kommando, damit Funktionen sich nicht selbst aufrufen:
function ls() { builtin ls -lisa } unter bt: root@bt:~# function ls() { builtin ls -lisa; } root@bt:~# ls bash: builtin: ls: not a shell builtin bash-builtins (7) - bash built-in commands, see bash(1) builtins (7) - bash built-in commands, see bash(1) man 7 builtins
declare
- declare -f zeigt verfügbare Funktionen an
Declare variables and give them attributes. SYNTAX declare [-afFrxi] [-p] [name[=value]] OPTIONS -a Each name is an array variable. -f Use function names only. -F Inhibit the display of function definitions; only the function name and attributes are printed. (implies -f) -i The variable is to be treated as an integer; arithmetic evaluation is performed when the variable is assigned a value. -p Display the attributes and values of each name. When `-p' is used, additional options are ignored. -r Make names readonly. These names cannot then be assigned values by subsequent assignment statements or unset. -x Mark each name for export to subsequent commands via the environment. If no names are given, then `declare' will display the values of variables instead. Using `+' instead of `-' turns off the attribute instead. When used in a function, declare makes each name local, as with the local command. The typeset command is supplied for compatibility with the Korn shell; however, it has been deprecated in favor of the declare builtin command. The return status is zero unless an invalid option is encountered, an attempt is made to define a function using `-f foo=bar', an attempt is made to assign a value to a readonly variable, an attempt is made to assign a value to an array variable without using the compound assignment syntax , one of the names is not a valid shell variable name, an attempt is made to turn off readonly status for a readonly variable, an attempt is made to turn off array status for an array variable, or an attempt is made to display a non-existent function with `-f'. "My mother never saw the irony in calling me a son-of-a-bitch." - Jack Nicholson Related: alias - Create an alias env - Display, set, or remove environment variables echo - Display message on screen export - Set an environment variable hostname - Print or set system name local - Create variables printenv - Print environment variables readonly - Mark variables/functions as readonly shift - Shift positional parameters Equivalent Windows command: SET - Display, set, or remove Windows environment variables
Konfigrationsdateien der Bash
Systemweit
- beginnen NIE mit einem Punkt
- /etc/profile - erfordert erneutes Anmelden nach Änderungen
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH ...
- /etc/bashrc - wird beim Start jeder Shell neu eingelesen
- /etc/bash.bashrc bzw. /etc/bash.bashrc.local - gilt nur für z.B. Debian und SuSE
Benutzer
- ~/.bash_profile - wird nur bei neuanmeldung eingelesen
- ~/.bash_login - wird nur abgearbeitet wenn .bash_profile nicht existiert
- ~/.profile - ursprünglich Config der Bash, wird nur von der Loginshell eingelesen und das auch nur wenn weder .bash_profile noch .bash_login existieren.
- ~/.bashrc - die andere ursprünglich Config der Bash, wird immer eingelesen auch beim Aufruf einer neuen Shell
- ~/.bash_logout - optionale Datei, wird beim Abmelden des Benutzers ausgeführt. z.B. den Monitor löschen.
- ~/.inputrc - Definitionen, die die Tastatur betreffen. z.B. Control-h: "cd ~"
/etc/skel
- Das "Knochengerüst" für neue User
- useradd -m hans - kopiert die Dateien und Ordner von /etc/skel nach /home/hans
homaar@bl01:/etc/skel$ ls -lah total 28K drwxr-xr-x 2 root root 4.0K Apr 22 2011 . drwxr-xr-x 117 root root 12K Dec 23 17:14 .. -rw-r--r-- 1 root root 220 May 12 2008 .bash_logout -rw-r--r-- 1 root root 3.2K Apr 10 2010 .bashrc -rw-r--r-- 1 root root 675 May 12 2008 .profile
105.2 Einfache Skripte anpassen oder schreiben
Kandidaten sollten in der Lage sein, existierende Skripte anzupassen oder einfache neue BASH-Skripte zu schreiben.
Wichtigste Wissensgebiete
- Standard-sh-Syntax verwenden (Schleifen, Fallunterscheidungen)
- Kommandosubstitution verwenden
- Rückgabewerte auf Erfolg, Misserfolg oder andere von einem Programm gelieferte Informationen prüfen
- Situationsabhängig Mail an den Superuser senden
- Den richtigen Skript-Interpreter über die Shebang-Zeile (#!) wählen
- Den Ort, die Eigentümerschaft, die Ausführungs- und SUID-Rechte von Skripten verwalten
for while test if read seq
Allgemeines
- Shebang
#!/path/to/interpreter
- Drei Ausführungsmethoden:
1.) /bin/bash /path/to/script 2.) source /path/to/script 3.) chmod a+x /path/to/script & /path/to/script
Ausführungsberechtigungen
chmod 600
- Ein administratives Script sollte immer die Berechtigungsstufe 600 haben
SUID Bit
- Das Programm wird im Sicherheitskontext des Besitzes ausgeführt
- Dies ist als gefährlich einzustufen!
chmod 4700 /path/to/script ls -lah -rws------ 1 root root 26 24. Dez 10:15 test
Sticky Bit
- Verhindert das Löschen oder umbenennen von Ordnern und Dateien
ls -lah . | grep test drwxr-xr-x 2 homaar homaar 4,0K Sep 24 10:00 test chmod 1700 test ls -lah . | grep test drwx-----T 2 homaar homaar 4,0K Sep 24 10:00 test
Position eines Scripts
im Dateisystem
- Wird ein Script häufig genutzt, so sollte es in einem Ordner der PATH Variable liegen
- echo $PATH
- z.B. /usr/bin für Userscripts und /usr/sbin für Adminscripts
im Prozessbaum
- Das Script wird in einem neuen Bash Prozess gestartet. D.h. es stehen nur exportierte Variablen zur Verfügung.
- Nochmal: ein export bezieht sich nur auf untergeordnete Shells!!!
- D.h. Variablen müssen für die spätere Verwendung zwischengespeichert werden, z.B. unter /tmp.
Übergabevariablen und Rückgabewerte
- $0 = Name des Programms inkl. Pfad
- $1-$n = Übergabeparamter
- $# = Anzahl der Parameter
- $? = Errorlevel (command not found = 127, Genereller Fehler= 1, OK = 0)
Schleifen und Bedingungen
while, test, do, done, shift, let
- shift verschiebt die Übergabeparamter um eine Stelle:
#!/bin/bash summe=0 while test $# -gt 0 do let summe=summe+$1 shift done echo Die Summe lautet $summe unset summe exit 0
Dateioperatoren
- Überprüfung von Dateien hinsichtlich bestimmter Eigenschaften:
-r ist die Datei lesbar? -w ist die Datei beschreibbar? -x ist die Datei ausführbar? -d existiert das Verzeichnis? -b ist die Datei in blockorientiertes Gerät? -c ist die Datei in zeichenorientiertes Gerät? -g ist das SGID-Bit gesetzt? -k ist das Sticky-Bit gesetzt? -u ist das SUID-Bit gesetzt? //WICHTIG -e die Datei existiert? -f es handelt sich um eine reguläre Datei? -L es handelt sich um einen Symlink? file1 -nt file2 ist die Datei neuer als ... ? file1 -ot file2 ist die Datei älter als ... ?
Variablenoperatoren
- Überprüfung von Variablen hinsichtlich bestimmter Eigenschaften:
WertA -eq WertB Equal WertA -ne WertB Not equal WertA -gt WertB Greater than WertA -ge WertB Greater or equal WertA -lt WertB Less then WertA -le WertB Less or equal
Schleifen mit for, Befehlssubstitution, echo, find
#!/bin/bash #Home nach *.old durchsuchen #for z in $(find /home -name *.old) for z in `find ~ -type f -name *.old` do echo -e "\nDie Datei $z kann vermutlich gelöscht werden" done unset z exit 0
- Die Ausgabe des find Befehls wird einzeln an die Variable z übergeben
- echo -e aktiviert Escapesequenzen -> so ist es möglich mit \n eine Leerzeile am Anfang einzufügen
Weitere Escapezeichen
- \\ Escapter Backslash
- \a Alert - piepst einmal
- \b Backspace
- \c Unterdrückt das "Newline-Zeichen"
- \f Form feed - Leerseite
- \n Newline
- \r Carriage return
- \t Horizontal tabulator (8 Leerzeichen breit)
- \v Vertical tabulator (8 Leerzeichen hoch)
echo "Test" | mail -s Test root
if, fi, elif, else, read, clear und einfaches Rechnen in der Bash
#!/bin/bash #Die 4 Grundrechenarten clear; echo -e "Welche Rechenart?\nBiite den ersten Buchstaben eingeben und mit Enter bestätigen!\n" echo -e "[a]ddieren [s]ubtrahieren [d]ividieren [m]ultiplizieren " read operator clear; echo -e "\nBitte erste Zahl eingeben" read a clear; echo -e "\nBitte zweite Zahl eingeben" read b if [ $operator = a ]; then let c=a+b clear; echo -e "\nAddition $a + $b = $c" elif [ $operator = s ]; then let c=a-b clear; echo -e "\nSubtration $a - $b = $c" elif [ $operator = m ]; then let c=a*b clear; echo -e "\nMultiplikation $a * $b = $c" elif [ $operator = d ]; then let c=a\b clear; echo -e "\nDivision $a / %b = $c" else clear; echo -e "\nKein gueltiger Operator" exit 1 fi
case, esac, read, clear und einfaches Rechnen in der Bash
- Ein case muss immer mit ";;" geschlossen werden
- Entsprechend zum else steht das *)
- case esac
#!/bin/bash #Die 4 Grundrechenarten clear; echo -e "Welche Rechenart?\nBiite den ersten Buchstaben eingeben und mit Enter bestätigen!\n" echo -e "[a]ddieren [s]ubtrahieren [d]ividieren [m]ultiplizieren " read operator clear; echo -e "\nBitte erste Zahl eingeben" read a clear; echo -e "\nBitte zweite Zahl eingeben" read b case "$operator" in a) let c=a+b clear; echo $c;; s) let c=a-s clear; echo $c;; m) let c=a*s clear; echo $c;; d) let c=a/s clear; echo $c;; *) clear; echo -e "\nKein gueltiger Operator" exit1;; esac
105.3 SQL-Datenverwaltung
Kandidaten sollten in der Lage sein, mit einfachen SQL-Kommandos Datenbanken abzufragen und Daten zu manipulieren. Dieses Lernziel umfasst auch Anfragen, die 2 Tabellen verbinden und/oder Subselects verwenden.
Wichtigste Wissensgebiete
- Gebrauch einfacher SQL-Kommandos
- Einfache Datenmanipulation
insert update select delete from where group by order by join
Allgemeines
- SQL = Structured Query Language
- SQL ist von ISO und ANSI standardisiert
yum/apt-get install mysql-server mysql-client mysql -u root -pPASS -h localhost mysql --user=user_name --password=your_password db_name mysql db_name < script.sql > output.tab mysql> status -------------- mysql Ver 14.14 Distrib 5.1.49, for debian-linux-gnu (x86_64) using readline 6.1 Connection id: 24642 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.1.49-3 (Debian) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 46 days 6 hours 38 min 7 sec Threads: 16 Questions: 13853122 Slow queries: 82 Opens: 9748 Flush tables: 1 Open tables: 64 Queries per second avg: 3.464 --------------
Hilfe
mysql> \h oder help mysql> help contents You asked for help about help category: "Contents" For more information, type 'help <item>', where <item> is one of the following categories: Account Management Administration Compound Statements Data Definition Data Manipulation Data Types Functions Functions and Modifiers for Use with GROUP BY Geographic Features Help Metadata Language Structure Plugins Table Maintenance Transactions User-Defined Functions Utility mysql> help data types ... mysql> help VARCHAR
SQL Befehlstypen - Query, Manipulation, Definition & Control
- DQL - SELECT, ORDER BY, DISTINCT - Data Query Language (DISTINCT = keine Dubletten)
- DML - INSET, UPDATE, COMMIT, ROLLBACK - Data Manipulation Language
- DDL - CREATE TABLE, ALTER TABLE, DROP TABLE - Data Definition Langunage
- DCL - GRANT, REVOKE - Data Control Language
Datenbank anzeigen, etc.
- SHOW DATABASES;
- CREATE DATABASE kontake;
- USE kontakte;
- DESCRIBE rufnummern;
CREATE TABLE
- Es folgt immer ein Komma auf eine Definition, es darf aber nicht mit Komma abgeschlossen werden!
- AUTO_INCREMENT = erster freier Wert
- NOT NULL = nicht leer (es handelt sich NICHT um den numerischen Wert 0!)
- PRIMARY KEY = Primärschlüssel
mysql> CREATE TABLE rufnummern ( id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, vorname VARCHAR(128), nachname VARCHAR(128), vorwahl VARCHAR(32), rufnummer VARCHAR(32) );
INSERT
- VARCHAR Values immer Quoten
mysql> INSERT INTO rufnummern (id,vorname,nachname,vorwahl,rufnummer) VALUES (1, 'Hans', 'Wurst', '12345', '67890' ); oder mysql> INSET INTO rufnummern (id, vorname, nachname, vorwahl, rufnummer) VALUES (2, 'Peter', 'Lustig', '54321', '0988776651');
- Hier noch mal ein besseres Beispiel von diesem Thread:
http://www.daniweb.com/web-development/databases/mysql/threads/72364
create table TEST ( column1 int AUTO_INCREMENT, column2 varchar(10) ) Methode A: insert into TEST values(1, 'apple') insert into TEST values(2, 'strawbery') Methode B: // Autmoatische Vergabe des AUTO_INCREMENT Wertes INSERT INTO TABLE table_name (column1, column3, column8) values(value1, value3, value8)
Textdatei in MySQL einlesen
CREATE DATABASE dummy; USE dummy; CREATE TABLE dummytable( id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, value VARCHAR(32) ); INSERT INTO dummytable (value) VALUES('value1'); INSERT INTO dummytable (value) VALUES('value2');
mysql> source /path/to/file windows: mysql> source c:/file/to/path
SELECT und WHERE
- Leere Werte werden als NULL dargestellt.
mysql> SELECT * FROM rufnummern mysql> SELECT vorname, nachname FROM rufnummern; ODER > SELECT rufnummern.vorname, rufnummern.nachname FROM rufnummern; +---------+----------+ | vorname | nachname | +---------+----------+ | hans | Wurst | | hans | Wurst | | peter | lustig | +---------+----------+ 3 rows in set (0.00 sec) mysql> SELECT vorwahl,rufnummmer FROM rufnummern WHERE vorname='peter'; mysql> SELECT * FROM rufnummern WHERE id > 2 and id < 4;
UPDATE
mysql> UPDATE rufnummern set test = 'y', rn = 'lalala' WHERE id = 3; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from rufnummern where id = 3; +----+---------+----------+---------+------------+------+--------+ | id | vorname | nachname | vorwahl | rufnummmer | test | rn | +----+---------+----------+---------+------------+------+--------+ | 3 | peter | lustig | 123 | 321 | y | lalala | +----+---------+----------+---------+------------+------+--------+ 1 row in set (0.00 sec) mysql> UPDATE rufnummern SET rufnummer = '1234567890', kategorie_id = 2, vorname = 'Peter' WHERE vorname = 'peter';
ORDER BY
mysql> SELECT * FROM rufnummern ORDER BY vorname; +----+---------+----------+---------+------------+------+--------+ | id | vorname | nachname | vorwahl | rufnummmer | test | rn | +----+---------+----------+---------+------------+------+--------+ | 2 | Egon | Wurm | NULL | NULL | NULL | NULL | | 1 | hans | Wurst | 123 | 321 | NULL | NULL | | 3 | peter | lustig | 123 | 321 | y | lalala | +----+---------+----------+---------+------------+------+--------+ 3 rows in set (0.00 sec)
LIMIT
mysql> SELECT * FROM rufnummern ORDER BY vorname LIMIT 1; +----+---------+----------+---------+------------+------+------+ | id | vorname | nachname | vorwahl | rufnummmer | test | rn | +----+---------+----------+---------+------------+------+------+ | 2 | Egon | Wurm | NULL | NULL | NULL | NULL | +----+---------+----------+---------+------------+------+------+ 1 row in set (0.00 sec)
GROUP BY
- Nur der erste gefundene Treffer wird ausgegeben.
- ORDER BY + GROUP BY zusammen = crash :)
mysql> SELECT * FROM rufnummern GROUP BY vorwahl; +----+---------+----------+---------+------------+------+------+ | id | vorname | nachname | vorwahl | rufnummmer | test | rn | +----+---------+----------+---------+------------+------+------+ | 2 | Egon | Wurm | NULL | NULL | NULL | NULL | | 1 | hans | Wurst | 123 | 321 | NULL | NULL | +----+---------+----------+---------+------------+------+------+ 2 rows in set (0.00 sec)
Anpassen von Datenbanken
ALTER TABLE kategorie RENAME TO kategorien;
mysql> ALTER TABLE rufnummern ADD (kategorie_id INT(5)); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE rufnummern ADD COLUMN rufnummer VARCHAR(32) AFTER vorwahl; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE rufnummern DROP COLUMN rn; Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
mysql> UPDATE rufnummern set kategorie_id = 1 WHERE vorname = 'hans'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
Überprüfung von Tabellen
mysql> CHECK TABLE rufnummern EXTENDED; +---------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+----------+ | kontakte.rufnummern | check | status | OK | +---------------------+-------+----------+----------+ 1 row in set (0.00 sec)
- EXTENDED kann bei großen Datenbanken sehr lange dauern!
mysql> help CHECK TABLE CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED} CHECK TABLE checks a table or tables for errors. CHECK TABLE works for MyISAM, InnoDB, and ARCHIVE tables. Starting with MySQL 5.1.9, CHECK TABLE is also valid for CSV tables, see http://dev.mysql.com/doc/refman/5.1/en/csv-storage-engine.html. For MyISAM tables, the key statistics are updated as well. CHECK TABLE can also check views for problems, such as tables that are referenced in the view definition that no longer exist. Beginning with MySQL 5.1.27, CHECK TABLE is also supported for partitioned tables. Also beginning with MySQL 5.1.27, you can use ALTER TABLE ... CHECK PARTITION to check one or more partitions; for more information, see [HELP ALTER TABLE], and http://dev.mysql.com/doc/refman/5.1/en/partitioning-maintenance.html. URL: http://dev.mysql.com/doc/refman/5.1/en/check-table.html
Subselects
- SELECT feld FROM tabelle WHERE bedingung IN (SUBSELECT);
mysql> SELECT vorname,nachname FROM rufnummern WHERE kategorie_id IN (SELECT id FROM kategorien WHERE kategorie = 'Nase'); ODER > SELECT rufnummern.vorname,rufnummern.nachname FROM rufnummern WHERE kategorie_id IN (SELECT id FROM kategorien WHERE kategorie = 'Nase'); +---------+----------+ | vorname | nachname | +---------+----------+ | hans | Wurst | +---------+----------+ 1 row in set (0.00 sec)
Aliase in SQL
- Tabellennamen mit z.B. "FROM tabellenname t" mit einem Alias versehen.
- Die Aliase gelten im Statement auch rückwirkend.
- Die ausgeschriebenen Tabellennamen können nicht mehr verwendet werden.
mysql> SELECT r.vorname, r.nachname, r.vorwahl, r.rufnummer FROM rufnummern r;
JOIN
- Bei LEFT und RIGHT JOINS spricht man von "Outer Joins". Diese liefern auch ein Ergebnis, wenn das überprüfte Feld leer ist.
LEFT JOIN
- Bei einem LEFT JOIN steht die Quelltabelle links von der Verknüpfungstabelle steht. (siehe Beispiel: ... FROM rufnummern r LEFT JOIN kategorien k ON ...)
- Die Reihenfolge nach dem ON ist egal.
mysql> SELECT r.vorname, r.nachname, r.vorwahl, r.rufnummer, k.kategorie FROM rufnummern r LEFT JOIN kategorien k ON r.kategorie_id = k.id; +---------+----------+---------+------------+------------+ | vorname | nachname | vorwahl | rufnummer | kategorie | +---------+----------+---------+------------+------------+ | Hans | Wurst | 123 | 1234567890 | Nase | | Egon | Wurm | NULL | 1234567890 | Obernase | | Peter | lustig | 123 | 890123456 | Riesennase | +---------+----------+---------+------------+------------+ 3 rows in set (0.00 sec)
RIGHT JOIN
- Analog zum LEFT JOIN, Die Quelltabelle steht rechts von der Verweistabelle
mysql> SELECT r.vorname, r.nachname, r.vorwahl, r.rufnummer, k.kategorie -> FROM kategorien k -> RIGHT JOIN rufnummern r ON k.id = r.kategorie_id; +---------+----------+---------+------------+------------+ | vorname | nachname | vorwahl | rufnummer | kategorie | +---------+----------+---------+------------+------------+ | Hans | Wurst | 123 | 1234567890 | Nase | | Egon | Wurm | NULL | 1234567890 | Obernase | | Peter | lustig | 123 | 890123456 | Riesennase | +---------+----------+---------+------------+------------+ 3 rows in set (0.00 sec)
INNER JOIN
- Outer Joins zeigen auch Datensätze an, bei denen die Referenz nicht stimmt, Beispiel:
mysql> UPDATE rufnummern SET kategorie_id = 1337 WHERE vorname = 'Hans'; mysql> SELECT r.vorname, r.nachname, r.vorwahl, r.rufnummer, k.kategorie FROM kategorien k RIGHT JOIN rufnummern r ON k.id = r.kategorie_id; +---------+----------+---------+------------+------------+ | vorname | nachname | vorwahl | rufnummer | kategorie | +---------+----------+---------+------------+------------+ | Hans | Wurst | 123 | 1234567890 | NULL | | Egon | Wurm | NULL | 1234567890 | Obernase | | Peter | lustig | 123 | 890123456 | Riesennase | +---------+----------+---------+------------+------------+ 3 rows in set (0.00 sec)
Lösung:
- Bei einem INNERJOIN werden nur "valide Verknüpfungen" ausgegeben:
mysql> SELECT r.vorname, r.vorwahl, r.rufnummer, k.kategorie FROM rufnummern r INNER JOIN kategorien k ON k.id = r.kategorie_id; +---------+---------+------------+------------+ | vorname | vorwahl | rufnummer | kategorie | +---------+---------+------------+------------+ | Egon | NULL | 1234567890 | Obernase | | Peter | 123 | 890123456 | Riesennase | +---------+---------+------------+------------+ 2 rows in set (0.00 sec)
Destruktive Kommandos
Alle Datensätze löschen:
mysql > DELETE FROM rufnummern;
Einzelnen DS löschen:
mysql > DELETE FROM rufnummern WHERE vorname "Egon" AND nachname = "Wurm";
Eine Tabelle löschen:
mysql > DROP TABLE kontake;
Datenbank droppen:
mysql > DROP DATABASE kontakte;