Für die Abfrage von Datenbanken steht eine umfangreiche Befehlsstruktur zur Verfügung. Dabei werden alle Abfragen mit dem select
-Befehl durchgeführt.
In diesem Artikel wird der Aufbau des select
-Befehls gezeigt und die verschiedenen Abfragemöglichkeiten, wie Filterung, Berechnungen, die Abfrage aus verschiedenen Tabellen u.v.m. erklärt.
Mit Hilfe des select
-Befehls werden Datensätze aus einer Datenbank abgerufen.
Als Grundlage zum Testen der Befehlsstruktur dient die hier aufgeführte Tabelle, mit Kunden aus Tettnang, Friedrichshafen und Lindau.
Befehl | Bedeutung |
---|---|
select <colname> |
Auswahl einer Spalte |
from <tbname> |
Auswahl der Tabellen |
where <condition> |
Auswahl mit Bedingung begrenzen |
group by <colname> |
Zusammenfassen bestimmter Datensätze |
having <condition> |
Auswahl der Datensätze mit Bedingung auf Gruppenebene begrenzen |
order by <colname> [asc|desc]; |
Sortieren in auf- oder absteigender Reihenfolge |
Einfache select
-Abfragen beinhalten die Ausgabe aller Daten mit select * ...
oder sortierte Ausgaben mit order by ... asc
. Des weiteren lassen sich mit where
Datensätze filtern und auch Ausgaben ohne Berücksichtigung doppelter Einträge ist möglich.
knr | name | plz | umsatz |
---|---|---|---|
1 | Brecht | 88069 | 60 |
2 | Müller | 88069 | 70 |
3 | Bachmann | 88131 | 55 |
4 | Kraus | 88046 | 32 |
drop table if exists kunde;
create table kunde (knr int not null auto_increment primary key, name varchar(30), plz varchar(5), umsatz int);
insert into kunde (name,plz,umsatz) values("Brecht","88069",60);
insert into kunde (name,plz,umsatz) values("Müller","88069",70);
insert into kunde (name,plz,umsatz) values("Bachmann","88131",55);
insert into kunde (name,plz,umsatz) values("Kraus","88046",32);
select * from kunde;
knr | name | plz | umsatz |
---|---|---|---|
3 | Bachmann | 88131 | 55 |
1 | Brecht | 88069 | 60 |
4 | Kraus | 88046 | 32 |
2 | Müller | 88069 | 70 |
select * from kunde order by name asc;
knr | name | plz | umsatz |
---|---|---|---|
4 | Kraus | 88046 | 32 |
select * from kunde where name="Kraus";
plz |
---|
88131 |
88069 |
88046 |
select distinct plz from kunde;
Operatoren eignen sich zum Filtern von Datensätzen. Man unterscheidet: arithmetische, relationale, logische und sonstige Operatoren
Operatortyp | Beispiele |
---|---|
arithmetisch (berechnen) | + - * / |
relational (vergleichen) | < <= > >= != = |
logisch (verknüpfen) | and/&& or/|| not/! |
sonstige | is null is not null like between in |
Man beachte das der like
-Operator eine Suche auf auf Basis von Textmustern ermöglicht.
Des weiteren können neu berechnete Spalten ausgegeben werden. Der Spaltenname wird mit dem Schlüsselwort as
angegeben.
knr | name | umsatz |
---|---|---|
3 | Bachmann | 55 |
1 | Brecht | 60 |
2 | Müller | 70 |
select knr, name, umsatz from kunde
where umsatz > 50 order by umsatz asc;
knr | name | brutto |
---|---|---|
1 | Brecht | 71.40 |
2 | Müller | 83.30 |
3 | Bachmann | 65.45 |
4 | Kraus | 38.08 |
select knr, name, umsatz*1.19 as brutto from kunde;
Mit Wildcards und dem like
-Operator kann man nach Textmustern filtern. Man beachte, dass durch entsprechende Klammersetzung Prioritäten bei der Suche gesetzt werden können.
Funktion | Bedeutung |
---|---|
count() |
Anzahl der Datensätze |
avg() |
Durchschnitt berechnen |
max() |
Maximalwert bestimmen |
min() |
Minimalwert bestimmen |
sum() |
Summe berechnen |
knr | name | plz | umsatz |
---|---|---|---|
1 | Brecht | 88069 | 60 |
4 | Kraus | 88046 | 32 |
select * from kunde where (name like 'B%' or name like 'K%') and plz like '880%';
count(*) | max(umsatz) | avg(umsatz) |
---|---|---|
4 | 70 | 54.25 |
select count(*), max(umsatz), avg(umsatz) from kunde;
Möchte man bestimmte Datensätze zusammenfassen, kann man diese mit group by
gruppieren. In der Regel werden auf diese Gruppen dann Funktionen angewandt.
Mit Hilfe von having
anstelle von where
kann man diese dann filtern. So lassen sich bspw. alle PLZ (die Gruppe) auflisten aus denen mindestens zwei Kunden kommen.
plz | anzahl |
---|---|
88046 | 1 |
88069 | 2 |
88131 | 1 |
select plz, count(*) as anzahl from kunde group by plz;
PLZ | Anzahl |
---|---|
88069 | 2 |
select plz, count(*) as Anzahl from kunde group by plz having Anzahl >= 1;
Der eingeschlossene Nagel
Wie kommt der Nagel dort hinein? Ein Nagel im Holz eingeschlossen. Wie geht das?
idtnr | name | plz | fkkurs |
---|---|---|---|
1 | Brecht | 88069 | 2 |
2 | Müller | 88069 | 1 |
3 | Bachmann | 88131 | 3 |
4 | Kraus | 88046 | 4 |
5 | Stroh | 88046 | 4 |
6 | Wolters | 88046 | 2 |
7 | Blaich | 88046 | 4 |
drop table if exists teilnehmer;
create table teilnehmer (idtnr int not null auto_increment primary key, name varchar(30), plz varchar(5), fkkurs int);
insert into teilnehmer (name,plz,fkkurs) values("Brecht","88069",2);
insert into teilnehmer (name,plz,fkkurs) values("Müller","88069",1);
insert into teilnehmer (name,plz,fkkurs) values("Bachmann","88131",3);
insert into teilnehmer (name,plz,fkkurs) values("Kraus","88046",4);
insert into teilnehmer (name,plz,fkkurs) values("Stroh","88046",4);
insert into teilnehmer (name,plz,fkkurs) values("Wolters","88046",2);
insert into teilnehmer (name,plz,fkkurs) values("Blaich","88046",4);
select * from teilnehmer;
idkurs | inhalt | beitrag | dauer |
---|---|---|---|
1 | Webdesign | 120 | 20 |
2 | Office | 350 | 35 |
3 | Java Beginner | 230 | 18 |
4 | Java Expert | 470 | 32 |
drop table if exists kurs;
create table kurs (idkurs int not null auto_increment primary key, inhalt varchar(30), beitrag int, dauer int);
insert into kurs (inhalt,beitrag,dauer) values("Webdesign",120,20);
insert into kurs (inhalt,beitrag,dauer) values("Office",350,35);
insert into kurs (inhalt,beitrag,dauer) values("Java Beginner",230,18);
insert into kurs (inhalt,beitrag,dauer) values("Java Expert",470,32);
select * from kurs;
Wähle die korrekten Aussagen aus.
> select distinct plz from user;
> select * from teilnehmer order by plz desc;
> select * from kurs where beitrag < 300;
> select * from teilnehmer where name like "B%";
> select plz, count(*) from user group by plz;
> select plz, count(*) as anzahl from user group by plz having anzahl > 1;
ein.Wähle die passende Aussage zum Befehl. Wähle eine Antwort.
Mit Hilfe von Datumsfunktionen können Berechnungen zu Terminen durchgeführt werden:
Funktion | Bedeutung |
---|---|
now() |
Aktueller Zeitstempel |
year(<Datum>) |
Jahr |
month(<Datum>) |
Monat |
dayofyear(..) , dayofmonth(..) , dayofweek(..) |
Tagnummern von Jahr, Monat, Woche |
datediff(d1,d2) , adddate(d,n) , date_add(..) |
Tagesdifferenz von 2 Terminen, Zeit zu einem Termin addieren |
date_format(<Datum>,'%W') |
'%W' Wochentag, '%M' Monat |
Datum | Jahr | Monat | Jahrestagnr |
---|---|---|---|
2021-05-17 10:02:28 | 2021 | 5 | 137 |
select now() as Datum, year(now()) as Jahr, month(now()) as Monat, dayofyear(now()) as Jahrestagnr;
Termin | Tag |
---|---|
2021-07-17 10:02:30 | Montag |
select date_add(now(), interval 2 month) as Termin, date_format(now(),'%W') as Tag;
Die wohl wichtigste Funktion von SQL ist die Verknüpfung von zwei oder mehr Tabellen mit join
. Dabei wird eine temporäre Tabelle erstellt. Ein inner join
verarbeitet alle Einträge die nicht leer sind, ein outer join
auch leere Null
Datensätze.
Für ein inner join
werden Tabellen zunächst über Primär- und Fremdschlüssel eindeutig verknüpft. Während in der Kunden-Tabelle der Fremdschlüssel "plz" ist, wird dieser in der Tabelle "ort" als Primärschlüssel primary key
definiert. Dadurch werden doppelte Einträge vermieden und es sind keine leeren Einträge vorhanden. Ein inner join
wertet nur Datensätze, die in beiden Tabellen vorkommen.
Möchte man auch leere Datensätze listen verwendet man outer join
. Dabei wird über left outer join
oder right outer join
der Bezug festgelegt.
Ein left outer join
, kurz left join
, wertet alle Datensätze der 1. (linken) Tabelle und wenn vorhanden zugehörige Daten aus der 2. (rechten) Tabelle aus, wenn nicht vorhanden: NULL-Werte.
Ein right outer join
, kurz right join
, wertet alle Datensätze der 2. (rechten) Tabelle und wenn vorhanden zugehörige Daten aus der 1. (linken) Tabelle aus, wenn nicht vorhanden: NULL-Werte.
plz | oname |
---|---|
88046 | Friedrichshafen |
88069 | Tettnang |
88131 | Lindau |
drop table if exists ort;
create table ort (plz varchar(5) not null primary key, oname varchar(30));
insert into ort (plz, oname) values('88046','Friedrichshafen');
insert into ort (plz, oname) values('88069','Tettnang');
insert into ort (plz, oname) values('88131','Lindau');
select * from ort;
Name | Ort |
---|---|
Brecht | Tettnang |
Müller | Tettnang |
Bachmann | Lindau |
Krauss | Friedrichshafen |
select kunde.name as Name, ort.oname as Ort from ort inner join kunde on ort.plz = kunde.plz;
select kunde.name as Name, ort.oname as Ort from ort, kunde where ort.plz = kunde.plz;
outer join
, falls unvollständige Datensätze auch angezeigt werden sollen:
select kunde.name as Name, ort.oname as Ort from ort left outer join kunde on ort.plz = kunde.plz;
idtnr | name | plz | fkkurs |
---|---|---|---|
1 | Brecht | 88069 | 2 |
2 | Müller | 88069 | 1 |
3 | Bachmann | 88131 | 3 |
4 | Kraus | 88046 | 4 |
5 | Stroh | 88046 | 4 |
6 | Wolters | 88046 | 2 |
7 | Blaich | 88046 | 4 |
8 | Tesla | 88069 | NULL |
drop table if exists teilnehmer;
create table teilnehmer (idtnr int not null auto_increment primary key, name varchar(30), plz varchar(5), fkkurs int);
insert into teilnehmer (name,plz,fkkurs) values("Brecht","88069",2);
insert into teilnehmer (name,plz,fkkurs) values("Müller","88069",1);
insert into teilnehmer (name,plz,fkkurs) values("Bachmann","88131",3);
insert into teilnehmer (name,plz,fkkurs) values("Kraus","88046",4);
insert into teilnehmer (name,plz,fkkurs) values("Stroh","88046",4);
insert into teilnehmer (name,plz,fkkurs) values("Wolters","88046",2);
insert into teilnehmer (name,plz,fkkurs) values("Blaich","88046",4);
insert into teilnehmer (name,plz) values("Tesla","88069");
select * from teilnehmer;
idkurs | inhalt | beitrag | dauer |
---|---|---|---|
1 | Webdesign | 120 | 20 |
2 | Office | 350 | 35 |
3 | Java Beginner | 230 | 18 |
4 | Java Expert | 470 | 32 |
drop table if exists kurs;
create table kurs (idkurs int not null auto_increment primary key, inhalt varchar(30), beitrag int, dauer int);
insert into kurs (inhalt,beitrag,dauer) values("Webdesign",120,20);
insert into kurs (inhalt,beitrag,dauer) values("Office",350,35);
insert into kurs (inhalt,beitrag,dauer) values("Java Beginner",230,18);
insert into kurs (inhalt,beitrag,dauer) values("Java Expert",470,32);
select * from kurs;
Wähle die korrekten Aussagen aus.
idKurs | kname | fkDozent |
---|---|---|
primary key | foreign key |
idDozent | dname | stundensatz |
---|---|---|
primary key |
Nenne den korrekten Befehl zur Ausgabe der ausführlichen Tabellenstruktur.
Wähle eine Antwort.
describe table kurs
describe kurs;
show table kurs;
show tables;
Nenne einen Vorteil eine Spalte als Primärschlüssel zu definieren.
Wähle beliebig viele Antworten.
Liste Kursname und zugehörigen Dozentennamen auf.
Wähle eine Antwort.
select kurs.kname, dozent.dname from kurs join dozent on kurs.fkDozent=dozent.idDozent;
select kurs.kname, dozent.dname from kurs inner join dozent on fkDozenz=idDozent;
select kname, dname from kurs inner join dozent on kurs.fkDozent=dozent.idDozent;
select kurs.kname, dozent.dname from kurs inner join dozent on kurs.fkDozent=dozent.idDozent;
Liste alle Dozenten mit Kursen auf, auch falls diese keine haben.
Wähle eine Antwort.
select kname, dname from kurs inner join dozent on idKurs=idDozent;
select dozent.dname, kurs.kname from dozent inner join kurs on kurs.idKurs=dozent.idDozent;
select dozent.dname, kurs.kname from dozent left join kurs on kurs.idKurs=dozent.idDozent;
select kurs dozent from kurs left join dozent on idKurs=idDozent;
Mache aus dem Lernen ein Erlebnis. Entkomme von der SQL-Insel.
PlayMySQL | Datenbankverwaltungssystem (engl. database management system) |
SQL | Datenbanksprache (engl. structured query language) |
Operator, -en | Operatoren sind zum Filtern von Datensätzen. Man unterscheidet zwischen arithmetischen (berechnen), relationalen (vergleichen) und logischen (verknüpfen) Operatoren. |
die Wildcard, -s | ein Platzhalter (%) für beliebige Zeichen zum Filtern von Textmustern |
die Funktion, -en | zum Durchführen von Berechnungen |
die Gruppierung, -en | zum Zusammenfassen von Datensätzen |
inner join |
nur Datensätze, die in beiden Tabellen vorkommen |
left outer join |
alle Datensätze der 1. (linken) Tabelle und wenn vorhanden zugehörige Daten aus der 2. (rechten) Tabelle; wenn nicht vorhanden: NULL-Werte. |
right outer join |
alle Datensätze der 2. (rechten) Tabelle und wenn vorhanden zugehörige Daten aus der 1. (linken) Tabelle; wenn nicht vorhanden: NULL-Werte. |