MySQL WHERE-klausul: AND, OR, IN, NOT IN Forespørgselseksempel
⚡ Smart opsummering
MySQL WHERE-klausulen filtrerer rækker, før de når resultatsættet, og anvender præcise kriterier på SELECT-, UPDATE- og DELETE-sætninger. Forståelse af AND-, OR-, IN- og NOT IN-operatorer samt sammenligningsoperatorer giver begyndere mulighed for at hente præcis de poster, en forespørgsel kræver.

Hvad er WHERE-klausul i MySQL?
HVOR klausul in MySQL er et nøgleord, der bruges til at specificere de nøjagtige kriterier for data eller rækker, der vil blive påvirket af den angivne SQL-sætning. WHERE-sætningen kan bruges med SQL-sætninger som INSERT, UPDATE, SELECT og DELETE til at filtrere poster og udføre forskellige operationer på dataene.
Vi så på, hvordan man forespørger data fra en database ved at bruge SELECT-sætningen i den forrige øvelse. SELECT-sætningen returnerede alle resultater fra den forespurgte databasetabel.
Der er dog tidspunkter, hvor vi ønsker at begrænse forespørgselsresultaterne til en bestemt betingelse. WHERE-klausulen i SQL er praktisk i sådanne situationer, og den fungerer på samme måde i en SLET- eller OPDATER-forespørgsel som det gør i en SELECT-forespørgsel.
WHERE klausul Syntaks
Den grundlæggende syntaks for WHERE-klausulen er som følger.
SELECT * FROM tableName WHERE condition;
HER
- "VÆLG * FRA tabelnavn" er standarden SELECT erklæring
- "HVOR" er nøgleordet, der begrænser resultatsættet, og "tilstand" er det filter, der anvendes på resultaterne. Filteret kan være et område, en enkelt værdi eller en underforespørgsel.
Antag, at vi ønsker et medlems oplysninger fra medlemstabellen, givet medlemskabsnummer 1. Scriptet nedenfor opnår dette.
SELECT * FROM `members` WHERE `membership_number` = 1;
Udfører dette script i MySQL arbejdsbord på “myflixdb” producerer resultatet nedenfor.
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
En enkelt betingelse er sjældent nok. Afsnittene nedenfor kombinerer WHERE med logiske operatører.
WHERE-klausul kombineret med – AND LOGISK OperaTor
Med den logiske operator AND returneres en række kun, hvis ALLE angivne kriterier er opfyldt.
Antag, at vi ønsker alle filmene i kategori 2, der blev udgivet i 2008. Manuskriptet nedenfor opnår det.
SELECT * FROM `movies` WHERE `category_id` = 2 AND `year_released` = 2008;
Udførelse af ovenstående script mod “myflixdb” giver følgende resultat.
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
OG indsnævrer et resultatsæt. ELLER udvider det.
WHERE-klausul kombineret med – OR LOGISK OperaTor
Med OR-operatoren returneres en række, hvis NOGEN af de angivne kriterier er opfyldt.
Følgende manuskript henter alle filmene i enten kategori 1 eller kategori 2.
SELECT * FROM `movies` WHERE `category_id` = 1 OR `category_id` = 2;
Resultatsættet er vist nedenfor.
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
Det bliver svært at læse at kæde mange ELLER-betingelser sammen. Nøgleordet IN løser dette.
WHERE-klausul kombineret med – IN Søgeord
WHERE-klausulen, når den bruges sammen med IN-nøgleordet, påvirker kun rækker, hvis værdier matcher den angivne liste. IN reducerer antallet af OR-klausuler, du ellers ville skrive.
Følgende MySQL WHERE IN-forespørgslen giver rækker, hvor membership_number er enten 1, 2 eller 3.
SELECT * FROM `members` WHERE `membership_number` IN (1,2,3);
Resultatsættet er vist nedenfor.
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 3 | Robert Phil | Male | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
IKKE IN udfører det modsatte filter.
WHERE-klausul kombineret med – IKKE I Søgeord
Med NOT IN-nøgleordet udelukker WHERE-klausulen alle rækker, hvis værdi matcher den angivne liste.
Følgende forespørgsel giver rækker, hvor medlemskabsnummer IKKE er 1, 2 eller 3.
SELECT * FROM `members` WHERE `membership_number` NOT IN (1,2,3);
Resultatsættet er vist nedenfor.
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
WHERE filtrerer også værdier efter størrelse og lighed ved hjælp af sammenligningsoperatorer.
WHERE-klausul kombineret med – SAMMENLIGNING Operatorer
Sammenligningsoperatorerne "mindre end" (<), "lig med" (=), "større end" (>) og "ikke lig med" (<>) kan alle bruges sammen med WHERE-klausulen.
= Svarende til
Følgende script henter alle kvindelige medlemmer fra medlemstabellen ved hjælp af lig med sammenligningsoperatoren.
SELECT * FROM `members` WHERE `gender` = 'Female';
Resultatsættet er vist nedenfor.
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
> Større end
Følgende script henter alle betalinger, der er større end 2,000, fra betalingstabellen.
SELECT * FROM `payments` WHERE `amount_paid` > 2000;
Resultatsættet er vist nedenfor.
| payment_id | membership_number | payment_date | description | amount_paid | external_reference_number |
|---|---|---|---|---|---|
| 1 | 1 | 23-07-2012 | Movie rental payment | 2500 | 11 |
| 3 | 3 | 30-07-2012 | Movie rental payment | 6000 | NULL |
<> Ikke lig med
Følgende script henter alle de film, hvis kategori-id ikke er 1.
SELECT * FROM `movies` WHERE `category_id` <> 1;
Resultatsættet er vist nedenfor.
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 5 | Daddy's Little Girls | NULL | 2007 | 8 |
| 6 | Angels and Demons | NULL | 2007 | 6 |
| 7 | Davinci Code | NULL | 2007 | 6 |
| 9 | Honey mooners | John Schultz | 2005 | 8 |
Hurtig reference: WHERE-klausul Operatorer
De operatorer, der oftest parres med WHERE, er opsummeret nedenfor. De fulde definitioner findes i MySQL operatørreference.
| OperaTor | Betydning | Eksempelbetingelse |
|---|---|---|
| = | Svarende til | `køn` = 'Kvinde' |
| <> | Ikke lig med | `kategori_id` <> 1 |
| > / | Større end / mindre end | `betalt_beløb` > 2000 |
| OG / ELLER | Alle kriterier / alle kriterier | `kategori_id` = 2 OG `udgivelsesår` = 2008 |
| I / IKKE I | Matcher/ekskluderer en liste | `medlemsnummer` IN (1,2,3) |
| ER NULL / ER IKKE NULL | Test for manglende værdier | `postadresse` ER NULL |
⚠️ Bemærk: NULL matcher aldrig = eller <>. Brug IS NULL eller IS NOT NULL, når en kolonne muligvis ikke indeholder nogen værdi.
Hjernevrider: Find film, der returneres for sent
Antag, at vi ønsker de lejede film, der ikke blev returneret inden skæringsdatoen d. 25/06/2012. Kombinationen af WHERE med mindre-end-operatoren og AND opnår dette.
SELECT * FROM `movierentals` WHERE `return_date` < '2012-06-25' AND movie_returned = 0;
Udførelse af ovenstående script i MySQL workbench giver følgende resultater.
| reference_number | transaction_date | return_date | membership_number | movie_id | movie_returned |
|---|---|---|---|---|---|
| 14 | 21-06-2012 | 24-06-2012 | 2 | 2 | 0 |

