PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

Komplexere Datenabfrage per SELECT

10. Februar 2020
  1. Home
  2. »
  3. MySQL Tutorial
  4. »
  5. Komplexere Datenabfrage per SELECT

Im ersten Teil ging es um simple Datenbankanfragen mittels dem SQL-Befehl SELECT. Dort haben wir immer stets alle Datensätze abgefragt. Jetzt im zweiten Teil geht es um das Filtern von Einträgen, beispielsweise suchen wir alle Nutzer mit einem gewissen Vor- oder Nachnamen. Dazu verwenden wir die Anweisung WHERE. Ebenfalls lernen wir den Einsatz von prepared statements in PDO.

Inhaltsverzeichnis

  • 1 WHERE-Statements
  • 2 Logische Operatoren AND / OR
  • 3 Vergleichsoperatoren
  • 4 LIKE und Wild-Card-Suche
  • 5 Doppelte Einträge verhindern

WHERE-Statements

Mittels der WHERE-Anweisung können wir gezielt unsere Datenbank durchsuchen und nur gewisse Datensätze ausgeben. Beispielsweise den Datensatz für einem Benutzer mit einem gewissen Namen oder die Datensätze aller Nutzer die zwischen 1980 und 1990 geboren wurden. Ihr könnt die WHERE-Anweisung selbstverständlich auch mit der ORDER BY-Anweisung und vor der LIMIT-Anweisung kombinieren, die wir euch im vorherigen Tutorial vorgestellt hatten. Dabei kommt die WHERE-Anweisung vor der ORDER BY-Anweisung und vor der LIMIT-Anweisung. So könnt ihr also beispielsweise mittels WHERE nach bestimmten Einträgen suchen, mittels ORDER BY sortieren und mittels LIMIT euch nur die ersten Einträge ausgeben lasst.

Eine Abfrage des Benutzers mit der ID 1 sieht beispielsweise wie folgt aus:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
 
$sql = "SELECT * FROM users WHERE id = 1";
foreach ($pdo->query($sql) as $row) {
   echo $row['vorname']." ".$row['nachname']."<br />";
   echo "E-Mail: ".$row['email']."<br /><br />";
}
?>

Hier können wir auch auf die foreach-Schleife verzichten, da wir nur einen Datensatz zurückerhalten und es alternativ wie folgt schreiben.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
 
$sql = "SELECT * FROM users WHERE id = 1";
$user = $pdo->query($sql)->fetch();
echo $user['vorname']." ".$user['nachname']."<br />";
echo "E-Mail: ".$user['email']."<br /><br />";
?>

Möchte man beispielsweise nach einem Nutzer mit einer gewissen E-Mail-Adresse suchen, so müssen wir das Argument per Anführungszeichen umschließen.

1
$sql = "SELECT * FROM users WHERE email = '[email protected]'";

Logische Operatoren AND / OR

Im obigen Fall haben nur eine Spalte auf einen Wert untersucht. Mittels den logischen Operatoren AND und OR können wir ähnlich wie bei if-Anweisung mehrere Spalten überprüfen:

1
2
3
4
5
6
7
8
9
// Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann:
$sql = "SELECT * FROM users WHERE vorname = 'Max' AND nachname = 'Mustermann'";
 
// Findet alle Einträge mit Vornamen Max oder mit Nachnamen Mustermann:
$sql = "SELECT * FROM users WHERE vorname = 'Max' OR nachname = 'Mustermann'";
 
// Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann
// oder die als E-Mail Adresse [email protected] angegeben haben:
$sql = "SELECT * FROM users WHERE (vorname = 'Max' AND nachname = 'Mustermann') OR (email = '[email protected])";

Vergleichsoperatoren

MySQL bietet auch eine Reihe von Vergleichsoperatoren , damit könnt ihr beispielsweise überprüfen ob eine Spalten nicht einem gewissen Wert entspricht, alle Einträge mit einer Spalte größer oder kleiner einem gewissen Wert usw. Die wichtigsten Funktionen sind:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Findet alle Einträge die nicht Musermann heißen
$sql = "SELECT * FROM users WHERE nachname != 'Mustermann'";
 
// Findet alle Einträge mit id < 5
$sql = "SELECT * FROM users WHERE id < 5";
 
// Findet alle Einträge mit id >= 5
$sql = "SELECT * FROM users WHERE id >= 5";
 
// Findet alle Einträge mit den IDs 2, 3, 5 und 7
$sql = "SELECT * FROM users WHERE id IN (2,3,5,7)";
 
// Findet alle Einträge, außer die mit den IDs 2, 3, 5 und 7
$sql = "SELECT * FROM users WHERE id NOT IN (2,3,5,7)";
 
// Findet alle Einträge bei denen die Spalte last_order den speziellen Wert NULL hat
$sql = "SELECT * FROM users WHERE last_order IS NULL";
 
// Findet alle Einträge bei denen die Spalte last_order nicht den speziellen Wert NULL hat
$sql = "SELECT * FROM users WHERE last_order IS NOT NULL";

LIKE und Wild-Card-Suche

Mittel der Anweisung LIKE können wir nach einfachen Mustern in unserer Datenbank suchen, beispielsweise nach allen Personen deren Vorname mit Ma beginnt. Dazu verwenden wir LIKE in Kombination mit der Wild-Card %. % steht dabei für beliebig viele Zeichen:

1
2
// Findet alle User deren Name mit Ma beginnt (z.B. Max, Mark, Markus, Matthias...)
$sql = "SELECT * FROM users WHERE vorname LIKE 'Ma%'";

Neben % können wir auch _ verwenden. Dies entspricht genau einem unbekannten Zeichen. 'De_' würde also auf die Wörter Der, Den, Des usw. passen.

Hiermit können wir eine einfache Suche für unsere Tabelle bauen.

1
2
// Findet alle Einträge die 'Suchwort' in der entsprechenden Spalte enthalten
$sql = "SELECT * FROM tabelle WHERE spalte LIKE '%Suchwort%'";

Doppelte Einträge verhindern

Mittels der DISTINCT-Anweisung können wir in einem SELECT doppelte Einträge vermeiden, sprich, so erhalten wir nur die eindeutigen Einträge zurück. Dabei muss das DISTINCT ganz am Anfang der Spaltenauswahl stehen.

Nachfolgend ein Beispiel, zum einen um die eine Liste aller (eindeutigen) Vornamen und aller (eindeutigen) Vor- und Nachnamen zu erhalten:

1
2
3
4
5
//Liste mit eindeutigen Vornamen, alphabetisch sortiert
$sql = "SELECT DISTINCT vorname FROM users ORDER BY vorname";
 
//Liste mit eindeutigen Namen (Vor- und Nachname(, alphabetisch sortiert
$sql = "SELECT DISTINCT vorname, nachname FROM users ORDER BY vorname, nachname";

Autor: Nils Reimers
Zurück: Simple Datenabfrage per SELECT
Weiter: Prepared Statements

MySQL Tutorial

  • MySQL installieren und starten
  • phpMyAdmin
  • Verbindung aufbauen
  • Simple Datenabfrage
  • Komplexere Datenabfrage
  • Prepared Statements
  • Daten einfügen
  • Daten aktualisieren
  • Daten löschen
  • Gefundene Einträge zählen
  • DATE-Datenbankspalten
  • Datum- und Zeitfunktionen
  • MySQL Fehlermeldungen
  • Datenbankverbindung schließen
  • JOIN
  • Indizes
  • Normalformen
  • Fremdschlüssel
  • Übersicht SQL-Befehle
  • Crashkurs MySQL
  • Crashkurs MySQLi
  • Crashkurs PDO
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur
  • DGUV V3
  • DGUV 3
  • CasinoAndy Finland
  • Casinopilot24.com
  • Neueonline-Casinos.com
  • CasinoHEX.at
  • Decasinos.de
  • Privatkredit247.com
  • Online Casino Spielautomaten
  • Casinofrog.com
  • parhaatuudetkasinot.com

Hoster – Geringste Ausfallzeit

  1. webgo Ø 0 Min.
  2. Linevast Ø 3 Min.
  3. netcup Ø 3 Min.
  4. dogado Ø 6 Min.
  5. Mittwald Ø 9 Min.
  6. All-Inkl.com Ø 10 Min.
  7. manitu Ø 10 Min.
  8. bplaced Ø 11 Min.
  9. checkdomain Ø 11 Min.
  10. Host Europe Ø 14 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2022

Um dich beim Lernen von PHP und MySQL zu unterstützen verwenden wir Cookies. OK Weitere Infos
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Notwendige
immer aktiv

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Nicht notwendige

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.