BESTIL INDEN MySQLASC- og DESC-forespørgsel med eksempel
⚡ Smart opsummering
BESTIL INDEN MySQL sorterer forespørgselsresultatsæt i stigende eller faldende rækkefølge ved hjælp af nøgleordene ASC og DESC. Afsnittene nedenfor forklarer syntaksen, sortering med én og flere kolonner, NULL-placering og bearbejdede eksempler udført mod myflixdb-eksempeldatabasen.
Hvad er ORDER BY i MySQL?
MySQL BESTIL BY er en klausul, der bruges med SELECT-forespørgslen til at sortere data på en ordnet måde. MySQL ORDER BY-klausulen sorterer forespørgselsresultatsættet i enten stigende eller faldende rækkefølge, på én kolonne eller på flere kolonner på én gang.
Når SELECT-kommandoen bruges alene, returneres rækker i den rækkefølge, som lagringssystemet læser dem, hvilket ikke er en garanteret rækkefølge. Sortering er simpelthen at omarrangere disse rækker i en bestemt rækkefølge. Det kan udføres på både numeriske, streng- og datodatatyper.
MySQL ORDER EFTER Syntaks
Før man ser på eksempler, er det nyttigt at se, hvor klausulen sidder i en fuld SELECT-sætning.
SELECT statement... [WHERE condition | GROUP BY `field_name(s)` HAVING condition] ORDER BY `field_name(s)` [ASC | DESC];
HER
- "SELECT erklæring... " er den almindelige udvælgelsesforespørgsel.
- ” | “ repræsenterer alternativer.
- "[HVOR-betingelse | GROUP BY `feltnavn(e)` HAR betingelse]" er den valgfri betingelse, der bruges til at filtrere forespørgselsresultatsættet.
- "BEstil efter" udfører sortering af forespørgselsresultatsættet.
- “[ASC | DESC]” er det nøgleord, der bruges til at sortere resultatsættet i enten stigende eller faldende rækkefølge. Bemærk, at ASC er standard.
Hvad er DESC- og ASC-nøgleord?
ASC og DESC er de to sorteringsretninger, som ORDER BY accepterer. Tabellen nedenfor sammenligner dem på tværs af de datatyper, du sorterer oftest.
ASC er den korte form for stigende |
MySQL DESC er den korte form for faldende |
|---|---|
| Det bruges til at sortere forespørgselsresultaterne i en top til bund stil. | Den bruges til at sortere forespørgselsresultaterne fra bund til top. |
| Når du arbejder med datodatatyper, vises den tidligste dato øverst på listen. | Når man arbejder med datodatatyper, vises den seneste dato øverst på listen. |
| Når du arbejder med numeriske datatyper, vises de laveste værdier øverst på listen. | Når du arbejder med numeriske datatyper, vises de højeste værdier øverst i forespørgselsresultatsættet. |
| Når du arbejder med strengdatatyper, sorteres forespørgselsresultatsættet fra dem, der starter med bogstavet A, der går op til bogstavet Z. | Når du arbejder med strengdatatyper, sorteres forespørgselsresultatsættet fra dem, der starter med bogstavet Z, der går ned til bogstavet A. |
Både SQL DESC- og ASC-nøgleordene bruges sammen med SELECT-sætningen og MySQL ORDER BY klausul.
DESC- og ASC-syntaks
SQL DESC sorteringsnøgleordet har følgende grundlæggende syntaks.
SELECT {fieldName(s) | *} FROM tableName(s) [WHERE condition] ORDER BY fieldname(s) ASC | DESC [LIMIT N];
HER
- VÆLG {feltnavn(e) | *} FRA tabelnavne er den sætning, der indeholder de felter og tabeller, hvorfra resultatsættet skal hentes.
- [WHERE-tilstand] er valgfri, men kan bruges til at filtrere dataene i henhold til den givne betingelse.
- ORDER BY feltnavn(e) er obligatorisk og navngiver det felt, hvor sorteringen udføres. MySQL Nøgleordet DESC angiver, at sorteringen er i faldende rækkefølge.
- [GRÆNSE N] er valgfrit, men kan bruges til at begrænse antallet af rækker, der returneres fra forespørgselsresultatsættet.
Hvorfor bruge DESC og ASC i MySQL?
At kende syntaksen er kun halvdelen af billedet. Grunden til, at ORDER BY eksisterer, er, at et resultatsæt, der er nemt for en database at producere, ikke altid er nemt for en person at læse.
Forestil dig, at du udskriver en betalingshistorik for et medlem af videobiblioteket, så receptionisten hurtigt kan besvare spørgsmål. Det er langt mere logisk at udskrive betalingerne i faldende kronologisk rækkefølge, startende med den seneste betaling og tilbage til den tidligste. DESC i SQL er det nøgleord, der er praktisk i en sådan situation, fordi listen kan sorteres efter betalingsdatoen.
Antag nu, at marketingafdelingen ønsker en liste over film efter kategori, så medlemmerne kan se, hvilke titler biblioteket har, før de lejer dem. Ved at sortere kategorinavne og filmtitler i stigende rækkefølge kan medlemmerne hurtigt slå information op, præcis som de ville gøre i et indeks. Nøgleordet ASC tjener dette formål.
Kort sagt, ORDER BY omdanner et råt resultatsæt til en rapport. Det valgte nøgleord afhænger af det spørgsmål, læseren stiller: hvad der skete senest opfordrer til DESC, mens hvor finder jeg denne vare opfordrer til ASC.
MySQL Eksempel på ORDER EFTER
Alle de følgende eksempler kører mod myflixdb-eksempeldatabasen. Start med tabellen med usorterede medlemmer, som returneres i standardrækkefølgen.
SELECT * FROM members;
Udførelse af ovenstående script i MySQL Workbench mod myflixdb giver os følgende resultater vist nedenfor.
| medlemsnummer | fulde_navne | køn | fødselsdato | fysisk adresse | postadresse | kontaktnummer | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Kvinde | 21-07-1980 | First Street Plot nr. 4 | Privat taske | +0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Kvinde | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 3 | Robert Phil | Mand | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
| 4 | Gloria Williams | Kvinde | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Mand | NULL | Træstøtte | NULL | 845738767 | NULL |
| 6 | Sheldon Cooper | Mand | NULL | Træstøtte | NULL | 976736763 | NULL |
| 7 | Rajesh Koothrappali | Mand | NULL | Træstøtte | NULL | 938867763 | NULL |
| 8 | Leslie Winkle | Mand | 14-02-1984 | Træstøtte | NULL | 987636553 | NULL |
| 9 | Howard Wolowitz | Mand | 24-08-1981 | South Park | PO Box 4563 | 987786553 | NULL |
Sortering i faldende rækkefølge med DESC
Antag, at marketingafdelingen ønsker medlemsoplysningerne sorteret i faldende rækkefølge efter fødselsdato. Dette hjælper teamet med at sende fødselsdagshilsner rettidigt. Listen genereres af nedenstående forespørgsel.
SELECT * FROM members ORDER BY date_of_birth DESC;
Udførelse af ovenstående script i MySQL Workbench mod myflixdb giver os følgende resultater vist nedenfor.
Sortering i stigende rækkefølge med ASC
Den samme forespørgsel i stigende rækkefølge bytter blot om på nøgleordet.
SELECT * FROM members ORDER BY date_of_birth ASC;
Bemærk: NULL betyder ingen værdi overhovedet, hvilket ikke er det samme som nul eller en tom streng. Se i begge skærmbilleder, hvordan NULL-datoerne er grupperet sammen: MySQL behandler NULL som lavere end nogen anden værdi, så NULL-rækker vises først under ASC og sidst under DESC.
Sådan sorterer du efter flere kolonner i MySQL
Sortering på en enkelt kolonne besvarer simple spørgsmål. Rapporter kræver normalt et andet niveau af sortering, og ORDER BY accepterer en kommasepareret liste over felter til netop det formål.
Overvej følgende SQL-sorteringsscript, der viser alle medlemsposterne uden nogen eksplicit anvisning.
SELECT * FROM `members`;
Udførelse af ovenstående script giver følgende resultater vist nedenfor.
| medlemsnummer | fulde_navne | køn | fødselsdato | fysisk adresse | postadresse | kontaktnummer | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Kvinde | 21-07-1980 | First Street Plot nr. 4 | Privat taske | +0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Kvinde | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 3 | Robert Phil | Mand | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
| 4 | Gloria Williams | Kvinde | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Mand | NULL | Træstøtte | NULL | 845738767 | NULL |
| 6 | Sheldon Cooper | Mand | NULL | Træstøtte | NULL | 976736763 | NULL |
| 7 | Rajesh Koothrappali | Mand | NULL | Træstøtte | NULL | 938867763 | NULL |
| 8 | Leslie Winkle | Mand | 14-02-1984 | Træstøtte | NULL | 987636553 | NULL |
| 9 | Howard Wolowitz | Mand | 24-08-1981 | South Park | PO Box 4563 | 987786553 | NULL |
Sortering af en enkelt kolonne efter standardrækkefølge
Antag, at vi ønsker en liste, der sorterer forespørgselsresultatsættet efter kønsfeltet. Scriptet nedenfor gør det uden at angive en retning.
SELECT * FROM `members` ORDER BY `gender`;
| medlemsnummer | fulde_navne | køn | fødselsdato | fysisk adresse | postadresse | kontaktnummer | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Kvinde | 21-07-1980 | First Street Plot nr. 4 | Privat taske | +0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Kvinde | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 4 | Gloria Williams | Kvinde | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
| 3 | Robert Phil | Mand | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
| 5 | Leonard Hofstadter | Mand | NULL | Træstøtte | NULL | 845738767 | NULL |
| 6 | Sheldon Cooper | Mand | NULL | Træstøtte | NULL | 976736763 | NULL |
| 7 | Rajesh Koothrappali | Mand | NULL | Træstøtte | NULL | 938867763 | NULL |
| 8 | Leslie Winkle | Mand | 14-02-1984 | Træstøtte | NULL | 987636553 | NULL |
| 9 | Howard Wolowitz | Mand | 24-08-1981 | South Park | PO Box 4563 | 987786553 | NULL |
"Kvindelige" medlemmer vises først, efterfulgt af "Mandlige" medlemmer. Dette skyldes, at når ORDER BY-klausulen bruges uden at angive ASC eller MySQL DESC-nøgleord, MySQL sorterer som standard forespørgselsresultatsættet i stigende rækkefølge.
Sortering af to kolonner i modsatte retninger
Lad os nu se på et eksempel, der udfører sortering ved hjælp af to kolonnerDen første kolonne er sorteres in stigende rækkefølge som standard, mens den anden kolonne er sorteres in faldende rækkefølge.
SELECT * FROM `members` ORDER BY `gender`, `date_of_birth` DESC;
Udførelse af ovenstående script i MySQL Workbench mod myflixdb giver følgende resultater.
Kønskolonnen blev som standard sorteret i stigende rækkefølge, mens fødselsdatokolonnen eksplicit blev sorteret i faldende rækkefølge. Hvert nøgleord af typen retning gælder kun for den kolonne, det følger efter.
Sådan kombinerer du ORDER BY med WHERE, LIMIT og GROUP BY
ORDER BY er sjældent den eneste klausul i en produktionsforespørgsel. MySQL evaluerer altid klausulerne i en fast rækkefølge, og kendskab til denne rækkefølge forklarer, hvorfor resultaterne ser ud, som de gør.
- FRA læser rækkerne fra tabellen.
- HVOR kasserer de rækker, der ikke opfylder betingelsen.
- GROUP BY kollapser de overlevende rækker i grupper, og HAVING filtrerer disse grupper.
- BESTIL BY sekvenser, uanset hvilke rækker der er tilbage.
- GRÆNSE udskærer det ønskede antal rækker fra den sorterede liste.
Fordi ORDER BY kører efter WHERE og GROUP BY, men før LIMIT, udtrykkes en forespørgsel som "de fem yngste medlemmer fra Woodcrest" i én sætning.
SELECT full_names, date_of_birth FROM members WHERE physical_address = 'Woodcrest' ORDER BY date_of_birth DESC LIMIT 5;
Den samme rækkefølge gælder for grupperede resultater. Aggregerede værdier produceret af samlede funktioner såsom COUNT kan sorteres, så den travleste kategori kommer øverst i rapporten.
SELECT gender, COUNT(*) AS members_count FROM members GROUP BY gender ORDER BY members_count DESC;
Tip: ORDER BY kan sortere efter et kolonnealias, efter et udtryk eller endda efter kolonneposition, f.eks. ORDER BY 3. Sortering efter position er skrøbeligt, fordi indsættelse af en ny kolonne i SELECT-listen lydløst ændrer sorteringsnøglen. Navngiv kolonnen i stedet.
Ét præstationspunkt er værd at huske. Når den sorterede kolonne indeholder et indeks, MySQL kan læse rækkerne i indeksorden og springe sorteringen helt over. Uden et indeks gennemtvinger store tabeller en filsortering i hukommelsen eller på disken, hvilket er den sædvanlige årsag til, at en rapportforespørgsel bliver langsom.


ASC er den korte form for stigende
MySQL DESC er den korte form for faldende

