No to czas połączyć wszystko w całość i nauczyć się budować proste, ale przydatne zapytania z kombinacją SELECT, WHERE i ORDER BY. Ta umiejętność przyda Ci się do wielu rzeczy, od pobierania listy użytkowników po robienie małych raportów.
Zanim zaczniemy, przypomnijmy sobie jak wygląda struktura prostego zapytania SQL:
SELECT kolumna1, kolumna2, kolumna3
FROM tabela
WHERE warunek
ORDER BY kolumna ASC
LIMIT liczba_wierszy
OFFSET liczba_wierszy;
Gdyby SQL był dziełem literackim, to SELECT — to tytuł rozdziału, FROM — jego treść, a WHERE — wyjaśnienie fabuły. No a ORDER BY dodaje porządek, żeby czytało się ciekawiej!
Kolejność operatorów jest ściśle ustalona. Niektóre z nich możesz pominąć (nie podawać), ale nie możesz zmieniać ich kolejności.
Przykład 1: Wybór imion studentów z najlepszymi ocenami
Wyobraź sobie, że mamy tabelę students z taką strukturą i danymi:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
Musisz dostać listę wszystkich studentów z najlepszą oceną (czyli grade = 'A'), posortowaną po imieniu. Tak to robimy:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
Wynik:
| name |
|---|
| Alex |
| Otto |
Wyjaśnienie:
SELECT name— wybieramy tylko imię. Nie ma sensu pobierać danych, których nie potrzebujemy.WHERE grade = 'A'— filtrujemy tylko tych, którzy mają najlepszą ocenę.ORDER BY name ASC— sortujemy imiona studentów alfabetycznie.
Przykład 2: Szukanie produktów po cenie
Teraz wyobraź sobie, że mamy tabelę products z informacjami o produktach:
| id | product_name | category | price |
|---|---|---|---|
| 1 | Smartfon | Electronics | 30000 |
| 2 | Telewizor | Electronics | 45000 |
| 3 | Lodówka | Appliances | 50000 |
| 4 | Odkurzacz | Appliances | 15000 |
| 5 | Żarówka | Lighting | 500 |
Nasze zadanie — dostać listę produktów z kategorii "Electronics", posortowaną malejąco po cenie. Zapytanie wygląda tak:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
Wynik:
| product_name | price |
|---|---|
| Telewizor | 45000 |
| Smartfon | 30000 |
Wyjaśnienie:
SELECT product_name, price— wybieramy nazwę produktu i jego cenę.WHERE category = 'Electronics'— filtrujemy tylko produkty z kategorii "Electronics".ORDER BY price DESC— sortujemy wyniki malejąco po cenie (najdroższy produkt na górze).
Przykład 3: Złożone filtry z logiką
Używamy tej samej tabeli students. Załóżmy, że musimy znaleźć wszystkich studentów starszych niż 21 lat, którzy mają ocenę B lub C, i posortować ich po wieku. Tutaj łączymy kilka warunków:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
Wynik:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
Wyjaśnienie:
WHERE age > 21— wybieramy tylko studentów starszych niż 21 lat.AND (grade = 'B' OR grade = 'C')— filtrujemy tych, którzy mają ocenęBlubC. Nawiasy służą do grupowania warunków.ORDER BY age ASC— sortujemy wynik po wieku, od najmłodszego.
Przykład 4: Łączenie sortowania i filtrowania
Wracamy do tabeli products. Chcemy znaleźć produkty tańsze niż 50 000, posortować je po kategorii, a w każdej kategorii — po cenie (od najniższej do najwyższej).
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
Wynik:
| product_name | category | price |
|---|---|---|
| Odkurzacz | Appliances | 15000 |
| Smartfon | Electronics | 30000 |
| Telewizor | Electronics | 45000 |
| Żarówka | Lighting | 500 |
Wyjaśnienie:
WHERE price < 50000— najpierw filtrujemy produkty, zostawiając tylko te tańsze niż 50 000.ORDER BY category ASC, price ASC— sortujemy po kategoriach (alfabetycznie), a w każdej kategorii po cenie rosnąco.
Przykład 5: Częsty błąd — pominięcie warunków
Zobaczmy teraz, co może pójść nie tak. Co jeśli zapomnimy o grupowaniu warunków, jak przy operatorach logicznych?
Złe zapytanie:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
Tutaj OR grade = 'C' wykona się bez uwzględnienia AND age > 21, i zapytanie zwróci nie ten wynik. Dostaniemy wszystkich, którzy mają ocenę C, nawet jeśli są młodsi niż 21 lat.
Dlatego zawsze używaj nawiasów dla jasności:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION