Cum funcționează
Cele zece probleme de la FOOD_DELIVERY au același tipar ca tot Subiectul I: cerința a) pe un
tabel, cerința b) pe amândouă. Legătura se face prin idr — codul restaurantului, care apare și
în Comenzi.
a) ORDER BY fără DESC = crescător
ORDER BY nume sortează alfabetic. Nu e nevoie să scrii ASC; e comportamentul implicit.
b) Un restaurant, mai multe comenzi
Aici se vede ce înseamnă „un restaurant poate avea mai multe comenzi": după joncțiune, numele
restaurantului se repetă pe câte un rând pentru fiecare comandă a lui.
r.nume c.valoare
La Mama 320.00
Burger House 240.00
Sushi Ten 210.75
Trattoria Bella 145.50 <- Trattoria apare de 3 ori,
Trattoria Bella 95.00 pentru ca are 3 comenzi
Trattoria Bella 89.00
Repetarea nu e o greșeală — fiecare rând e o comandă diferită. Ea devine o problemă doar când se cere
lista restaurantelor (nu a comenzilor): atunci se adaugă DISTINCT, vezi
problema #133.
ORDER BY c.valoare DESC se aplică după joncțiune, pe rezultatul lipit — deci pe toate comenzile,
nu pe fiecare restaurant separat.
Un restaurant fără nicio comandă nu apare deloc în rezultat, pentru că INNER JOIN păstrează doar
potrivirile. Dacă cerința ar fi „toate restaurantele, cu valorile comenzilor dacă au", ar trebui
LEFT JOIN — vezi problema #136.
Greșeli frecvente
ORDER BY scris înaintea lui FROM — ordinea clauzelor e fixă:
SELECT → FROM → JOIN → WHERE → ORDER BY.
SELECT * la cerința a) — se cer trei coloane din șase.
- Joncțiune fără
ON — 6 restaurante × 14 comenzi = 84 de rânduri, toate fără sens.
ORDER BY valoare DESC fără prefix, când ambele tabele ar avea o coloană cu acest nume —
eroare de coloană ambiguă. Aici valoare e doar în Comenzi, dar obiceiul de a prefixa
(c.valoare) te scutește de surprize.
- Sortare după
idr în loc de după nume — codul nu e ordine alfabetică.