---
title: "Beispiele für SQL-Abfragen"
topicId: "Liste_SQL_Beispiele"
contextId: 269
editionen: [professional, server]
status: aktualisiert
version: "5.4"
---
Die folgenden Bausteine können Sie im [Benutzerdefinierten SQL-Filter](/desktop/daten-finden-und-bearbeiten/benutzerdefinierter-sql-filter) verwenden. Setzen Sie `WHERE` davor und verknüpfen Sie mehrere Bausteine mit `AND` oder `OR`. Ersetzen Sie die Beispielwerte durch Ihre eigenen Werte.

Wo nicht anders angegeben, sind die Beispiele für Microsoft SQL Server geschrieben. Bei Oracle beachten Sie die Hinweise zur Groß- und Kleinschreibung unter [Benutzerdefinierter SQL-Filter](/desktop/daten-finden-und-bearbeiten/benutzerdefinierter-sql-filter#besonderheiten-bei-oracle-datenbanken).

## Syntax für einzelne Abfragefelder

### Arten und Schutzstatus

| Abfrage | SQL-Syntax | Bemerkung |
| --- | --- | --- |
| Artenbezeichnung (deutsch) | `tblArten.Art_deutsch LIKE 'Feldhamster'` | Auch mit Platzhalterzeichen, zum Beispiel `'Feld*'` |
| Artenbezeichnung (wissenschaftlich) | `tblArten.Art_wissenschaftlich LIKE 'Nyctalus noctula'` | Auch mit Platzhalterzeichen, zum Beispiel `'Nyctalus *'` |
| Artenknoten in der Baumstruktur der Artenreferenzliste | `tblArten.SystemCode LIKE (SELECT tblArten.SystemCode + '%' FROM tblArten WHERE tblArten.Art_Deutsch LIKE 'Phengaris')` | Findet die Art und alle untergeordneten Taxa. _Phengaris_ ist im Beispiel der deutsche Name des Artenknotens. Sie können auch nach dem wissenschaftlichen Namen fragen (`Art_wissenschaftlich`). |
| Rote Liste Sachsen | `tblArten.RL20012 IN ('1', '2', '3', 'G')` | `RL` für _Rote Liste_, gefolgt von der Bundeslandnummer (20016 = Deutschland). Siehe auch [Referenzlisten/ Bundeslandnummern](/desktop/stammdaten-und-referenzlisten/referenzlisten#bundeslandnummern) sowie [Referenzlisten/ Rote-Liste-Status](/desktop/stammdaten-und-referenzlisten/referenzlisten#roteliste). |
| Rote Liste Deutschland | `tblArten.RL20016 IN ('1', '2')` | `RL` für _Rote Liste_, gefolgt von der Bundeslandnummer (20016 = Deutschland). Siehe auch [Referenzlisten/ Bundeslandnummern](/desktop/stammdaten-und-referenzlisten/referenzlisten#bundeslandnummern) sowie [Referenzlisten/ Rote-Liste-Status](/desktop/stammdaten-und-referenzlisten/referenzlisten#roteliste). |
| Natura 2000 (FFH-Status) | `tblArten.FFH <> ''` | Alle Beobachtungen von Arten mit einem Eintrag im Feld _Natura 2000_ |
| Natura 2000 (FFH-Status) | `tblArten.FFH LIKE '%FFH-II%'` | Alle Beobachtungen von Arten mit dem Natura-2000-Status _FFH, Anhang II_ |
| Natura 2000 (FFH-Status) | `(tblArten.FFH LIKE '%FFH-II%' OR tblArten.FFH LIKE '%FFH-V%')` | Entweder _FFH-II_ oder _FFH-V_ |
| Bundesnaturschutzgesetz (BNatSchG) | `tblArten.BNatSchG IN ('SG', 'BG')` | SG = streng geschützt, BG = besonders geschützt. Sie können auch nur einen der beiden Werte abfragen. |

### Datum und Zeitraum

| Abfrage | SQL-Syntax | Bemerkung |
| --- | --- | --- |
| Datum (Microsoft SQL Server) | `tblDaten.Datum > '31.12.2014'` | Auch mit anderen Operatoren, zum Beispiel `tblDaten.Datum >= '01.01.2015'` |
| Datum (Microsoft SQL Server) | `tblDaten.Datum > DATEFROMPARTS(2014, 12, 31)` | Mit Angabe von Jahr, Monat, Tag |
| Datum (Microsoft SQL Server) | `CAST(tblDaten.Datum AS DATE) = CONVERT(DATETIME, '2021-05-09', 102)` | `CAST` wandelt das Datum in ein Datum ohne Uhrzeit um. So finden Sie alle Beobachtungen eines Tages, auch wenn eine Uhrzeit erfasst ist. Format des Datums: JJJJ-MM-TT |
| Datum (Oracle) | `tblDaten.Datum = TO_DATE('31.12.2014', 'dd.mm.yyyy')` | Bei Oracle wandeln Sie den Text zuerst in ein Datum um. |
| Datumsbereich | `tblDaten.Datum BETWEEN '01.01.2015' AND '31.03.2015'` | Alternative Schreibweise: `tblDaten.Datum >= '01.01.2012' AND tblDaten.Datum <= '31.03.2012'` |
| Monat | `tblDaten.Monat = 3` | Auch mit anderen Operatoren, zum Beispiel `tblDaten.Monat >= 3 AND tblDaten.Monat <= 5` |
| Jahr | `tblDaten.Jahr = 2015` | Auch mit anderen Operatoren, zum Beispiel `tblDaten.Jahr > 2009` |

### Beobachter und Herkunft

| Abfrage | SQL-Syntax | Bemerkung |
| --- | --- | --- |
| Beobachter | `tblBeobachter.Beobachter LIKE 'Mustermann, Max'` | Auch mit Platzhalterzeichen, zum Beispiel `'Mustermann*'` |
| Beobachter (Oracle) | `UPPER(tblBeobachter.Beobachter) LIKE UPPER('Mustermann, Max')` | Bei Oracle wandeln Sie Abfragefeld und Suchbegriff in Groß- oder Kleinbuchstaben um. |
| Herkunft | `tblHerkunft.Herkunft LIKE 'Projekt XYZ'` |  |

### Weitere Angaben zur Beobachtung

| Abfrage | SQL-Syntax | Bemerkung |
| --- | --- | --- |
| Aktenzeichen | `tblDatenZusatz.Aktenzeichen LIKE 'B 132'` | Auch mit Platzhalterzeichen, zum Beispiel `'B*'` |
| Alter | `tblAlter.Altersdefinition LIKE 'adult'` | Auch mit Platzhalterzeichen, zum Beispiel `'adult*'` |
| Benachrichtigt | `tblDatenZusatz.Flag_Benachrichtigt = 1` | 1 = benachrichtigt, 0 = nicht benachrichtigt bzw. nicht eingetragen |
| Beobachtungen mit Änderungsschutz | `tblDaten.GUID_Daten IN (SELECT GUID_Item FROM tblLockStatus WHERE ID_Entity = 1 AND ID_LockType > 0)` |  |
| Beobachtungen ohne Änderungsschutz | `NOT tblDaten.GUID_Daten IN (SELECT GUID_Item FROM tblLockStatus WHERE ID_Entity = 1 AND ID_LockType > 0)` |  |
| Beobachtungen mit Mediendaten | `tblDaten.GUID_Daten IN (SELECT GUID_Parent FROM tblFiles)` |  |

### BatBase

| Abfrage | SQL-Syntax | Bemerkung |
| --- | --- | --- |
| Beringung | `tblDaten.ID_Fundtyp = 540` | 540 = Beringung, 542 = Wiederfund |
| Geschlecht | `tblDatenZusatz.ID_Geschlecht = 1` | 1 = männlich, 2 = weiblich, 3 = unklar, 0 = nicht eingetragen |
| Gewicht | `tblDaten.Masse > 10` | Angabe in Gramm |
| Länge 5. Finger | `tblDaten.Len5Finger > 5` | Angabe in Millimetern |
| Länge Daumenkralle | `tblDaten.LenDaumen > 10` | Angabe in Millimetern |
| Länge Unterarm | `tblDaten.LenUnterarm > 50` | Angabe in Millimetern |
| Flugstrecke | `tblDatenZusatz.Flugstrecke > 50000` | Angabe in Metern |
| Zeitdifferenz | `tblDatenZusatz.Zeitdifferenz LIKE '10*'` | Zeitdifferenz im Format JJMMTT, auch mit Platzhalterzeichen. `'10*'` findet alle Tiere, die 10 Jahre nach der Beringung gefunden wurden. |
| Tagesdifferenz | `tblDatenZusatz.Tagesdifferenz > 365` | Angabe in Tagen |
| Publiziert | `tblDatenZusatz.Flag_Publiziert = 1` | 1 = publiziert, 0 = nicht publiziert bzw. nicht eingetragen |
| Quartiertyp | `tblQuartiertyp.Quartiertyp LIKE 'Wochenstube'` | Auch mit Platzhalterzeichen |
| Ringnummer | `tblDaten.Ringnummer LIKE 'C45977'` | Auch mit Platzhalterzeichen, zum Beispiel `'C459*'` |
| Unklare Meldung | `tblDatenZusatz.ID_UnklareMeldung = 2` | 1 = Zeit unklar, 2 = Ort unklar, 3 = sonstiges unklar |
| Verletzung: Art der Verletzung | `tblVerletzung.ItemValue LIKE 'Ring*'` | Auch mit Platzhalterzeichen, zum Beispiel `'Ring*'` |
| Verletzung: Körperseite | `tblKoerperseite.ItemValue LIKE 'links'` | Mögliche Werte: links, rechts, beidseitig |
| Verletzung: Aktueller Zustand | `tblAktuellerZustand.ItemValue LIKE 'verheilt*'` | Auch mit Platzhalterzeichen, zum Beispiel `'verheilt*'` |

## Komplexe SQL-Anweisungen

Die folgenden Anweisungen beginnen mit `SELECT` und erzeugen eine eigene Ergebnistabelle. Dafür benötigen Sie die Berechtigung für SQL-Abfragen.

**Anzahl der Einträge mehrerer Tabellen innerhalb einer SELECT-Anweisung**

```sql
SELECT 
(SELECT COUNT (*) FROM tblGeometrie)        AS [Anzahl Orte],
(SELECT COUNT (*) FROM tblRingserien)       AS [Anzahl Ringserien],
(SELECT COUNT (*) FROM tblRinge)            AS [Anzahl Ringe],
(SELECT COUNT (*) FROM tblRingnummerAlias)  AS [Anzahl Ringverweise],
(SELECT COUNT (*) FROM tblBeobachter)       AS [Anzahl Beobachter],
(SELECT COUNT (*) FROM tblDaten)            AS [Anzahl Beobachtungen]
```

**Alle Fundorte einer Art in einer ausgewählten Region**

```sql
SELECT DISTINCT tblDaten.Ortsbezeichnung, tblDaten.Region
FROM tblDaten WHERE tblDaten.ID_Art IN 
(SELECT tblArten.ID_Art FROM tblArten WHERE tblArten.Art_wissenschaftlich LIKE 'Graphoderus bilineatus') 
AND Region LIKE 'D-Sachsen%' AND NOT Region LIKE 'D-Sachsen-Anhalt%'
ORDER BY tblDaten.Ortsbezeichnung
```

Ersetzen Sie Art und Region durch Ihre Werte.

**Statistik: Anzahl Individuen pro Art und Jahr**

```sql
SELECT tblDaten.ID_Art, MIN(Art_deutsch) AS Art_deutsch, 
MIN(Art_wissenschaftlich) AS Art_wissenschaftlich, 
tblDaten.Jahr, SUM(Anzahl_Min) AS Anzahl_Individuen FROM tblDaten 
INNER JOIN tblArten ON tblDaten.ID_Art = tblArten.ID_Art 
WHERE Art_deutsch IN ('Kleinabendsegler', 'Rauhautfledermaus', 'Zweifarbfledermaus')
GROUP BY tblDaten.ID_Art, Jahr ORDER BY Art_deutsch, Jahr
```

Ändern Sie die gewünschten Arten oder lassen Sie die `WHERE`-Bedingung weg.

**Statistik: Anzahl Beobachtungen pro Artengruppe**

```sql
SELECT tblArtengruppen.ID_Kategorie, tblArtengruppen.ID_Gruppe, tblArtengruppen.Gruppe, 
tblArtengruppen.Gruppe_wiss, COUNT(tblDaten.ID_Art) AS Anzahl_Beobachtungen
FROM tblArten 
INNER JOIN tblArtengruppen ON tblArten.ID_Gruppe = tblArtengruppen.ID_Gruppe 
INNER JOIN tblDaten ON tblArten.ID_Art = tblDaten.ID_Art
WHERE tblDaten.Jahr = 2015
GROUP BY tblArtengruppen.ID_Gruppe, tblArtengruppen.ID_Kategorie, tblArtengruppen.Gruppe, tblArtengruppen.Gruppe_wiss
```

Ändern Sie das Jahr oder lassen Sie die `WHERE`-Bedingung weg.

**Gegenüberstellung verwendete Synonyme und aktuell gültige Artnamen**

```sql
SELECT ID_Art, SystemCode, Art_deutsch, Art_wissenschaftlich, 
(SELECT ID_Art FROM tblArten B WHERE ID_TaxaStatus = 0 AND A.SystemCode=B.SystemCode) AS ID_Art_aktuell, 
(SELECT Art_deutsch FROM tblArten B WHERE ID_TaxaStatus = 0 AND A.SystemCode=B.SystemCode) AS Art_deutsch_aktuell, 
(SELECT Art_wissenschaftlich FROM tblArten B WHERE ID_TaxaStatus = 0 AND A.SystemCode=B.SystemCode) AS Art_wissenschaftlich_Aktuell 
FROM tblArten A WHERE ID_Art IN (SELECT ID_Art FROM tblDaten WHERE ID_Kategorie = 1 AND ID_TaxaStatus = 2)
```

**Gespeicherte Orte mit Beobachtungen in 2018 und ohne Beobachtungen in 2019**

```sql
SELECT GUID_Ort, Ortsbezeichnung FROM tblGeometrie 
WHERE GUID_Ort IN (SELECT GUID_Ort FROM tblDaten WHERE Jahr = 2018) 
AND NOT GUID_Ort IN (SELECT GUID_Ort FROM tblDaten WHERE Jahr = 2019) 
AND GUID_Ort IN (SELECT GUID_Ort FROM tblGeometrieOrtstypen WHERE ID_Ortstyp = 3)
```

Ersetzen Sie die Jahreszahlen. Ändern Sie bei Bedarf den Ortstyp (`ID_Ortstyp = 3` steht für Biberrevier) oder lassen Sie die letzte Zeile weg.

**Alle Gewölluntersuchungen, in denen die Feldspitzmaus gefunden wurde**

```sql
SELECT Ortsbezeichnung, Datum, Jahr, Anzahl_Min AS Anzahl_Feldspitzmaus, 
(SELECT SUM(Anzahl_Min) FROM tblDaten B WHERE A.GUID_Group = B.GUID_Group) AS Anzahl_Beutetiere, 
(SELECT SUM(Anzahl_Min) FROM tblDaten B WHERE A.GUID_Group = B.GUID_Group AND B.ID_Kategorie IN (1,2,3,4)) AS Anzahl_Wirbeltiere  
FROM tblDaten A WHERE ID_AddIn = 5 AND ID_Art = 102 ORDER BY Ortsbezeichnung, Jahr, Datum
```

Passen Sie bei Bedarf die `ID_Art` an (im Beispiel 102 für die Feldspitzmaus).

**Alle Gewölluntersuchungen, in denen die Feldspitzmaus nicht gefunden wurde**

```sql
SELECT Ortsbezeichnung, Datum, Jahr, GUID_Group AS [GUID-Group],  
(SELECT SUM(Anzahl_Min) FROM tblDaten B WHERE A.GUID_Group = B.GUID_Group) AS Anzahl_Beutetiere, 
(SELECT SUM(Anzahl_Min) FROM tblDaten B WHERE A.GUID_Group = B.GUID_Group AND B.ID_Kategorie IN (1,2,3,4)) AS Anzahl_Wirbeltiere 
FROM tblDaten A WHERE ID_AddIn = 5 AND A.GUID_Group NOT IN (SELECT GUID_Group FROM tblDaten WHERE ID_AddIn = 5 AND ID_Art = 102)
GROUP BY Ortsbezeichnung, Datum, Jahr, GUID_Group ORDER BY Ortsbezeichnung, Jahr, Datum
```

Passen Sie bei Bedarf die `ID_Art` an (im Beispiel 102 für die Feldspitzmaus).

**Beobachtungen einer Libellenart, aber ohne Datum 1. Januar**

```sql
Art_deutsch LIKE 'Blaugrüne Mosaikjungfer' AND NOT (Day(tblDaten.Datum) = 1 AND Month(tblDaten.Datum) = 1)
```

Die Bedingung schließt Beobachtungen mit dem Datum 1. Januar aus, das oft als Platzhalter für ein unbekanntes Datum steht. Passen Sie bei Bedarf die Art an.

## SQL-Anweisungen für Administratoren und Entwickler

**Auflistung doppelter Arten**

```sql
SELECT * FROM (
SELECT MIN(Art_wissenschaftlich) AS Art_wissenschaftlich, 
MIN(ID_Art) AS ID_Art, MAX(ID_Art) AS ID_Art_old, 
MIN(SystemCode) AS SystemCode, MAX(SystemCode) AS SystemCode_old,
COUNT(*) AS Anzahl FROM tblArten WHERE ID_Art < 9999990 
AND NOT ID_Art IN (SELECT ID_Art_old FROM tblDeletedArten) 
AND ID_ArtenTyp = 140 
GROUP BY Art_wissenschaftlich) A 
WHERE A.Anzahl > 1
```

Findet doppelte Arten in der Artenreferenzliste, die den Taxatyp _Art_ und denselben wissenschaftlichen Namen haben. Der deutsche Name wird dabei nicht geprüft.

**Alle Tabellenfelder und deren Eigenschaften auflisten**

```sql
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE 'Ortsbezeichnung'
```

Über das _Information Schema_ listen Sie auf Microsoft SQL Server alle Tabellenfelder mit ihren Eigenschaften und Tabellen auf.

Mit der `WHERE`-Bedingung auf `COLUMN_NAME` zeigen Sie nur bestimmte Felder an. Ohne sie erhalten Sie alle Felder.
