Przed Tobą sposoby filtrowania wyników za pomocą WHERE
, sortowania przy użyciu ORDER BY
, grupowania z GROUP BY
, a także zaawansowane operacje, takie jak HAVING
, LIKE
i podzapytania.
Podstawowe wyszukiwanie danych
Aby pobrać wszystkie rekordy z danej tabeli, używamy prostego zapytania:
SELECT * FROM pasazer;
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 3 | Tadeusz | Nowak | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl | 3 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
Jeśli chcemy ograniczyć wyniki do rekordów spełniających określone warunki, stosujemy klauzulę WHERE
:
SELECT * FROM pasazer WHERE adres_id = 1;
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
To zapytanie zwróci tylko tych pasażerów, którzy mają przypisany adres o adres_id
równym 1.
Sortowanie wyników
Aby uporządkować wyniki w kolejności rosnącej lub malejącej, używamy ORDER BY
:
SELECT * FROM pasazer ORDER by id DESC LIMIT 1;
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
To zapytanie zwróci ostatniego dodanego pasażera (o najwyższym id
). Jeśli chcemy pobrać pierwszego dodanego pasażera, zmieniamy DESC
na ASC
:
SELECT * FROM pasazer ORDER by id ASC LIMIT 1;
+----+------+----------+-------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+------+----------+-------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
+----+------+----------+-------------+-------------+--------------------------------+----------+
Wyszukiwanie tekstowe
Aby znaleźć rekordy, które zawierają określony tekst, korzystamy z LIKE
:
SELECT * FROM pasazer WHERE imie LIKE 'Jan';
+----+------+----------+-------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+------+----------+-------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
+----+------+----------+-------------+-------------+--------------------------------+----------+
SELECT * FROM pasazer WHERE imie LIKE 'JAN';
+----+------+----------+-------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+------+----------+-------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
+----+------+----------+-------------+-------------+--------------------------------+----------+
Zapytanie zwróci pasażerów o imieniu „Jan”. Operator LIKE
jest nieczuły na wielkość liter w większości baz danych.
Filtrowanie według zakresów
Chcemy znaleźć pasażerów, których id
jest większe lub równe 3:
SELECT * FROM pasazer WHERE id >=3;
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| 3 | Tadeusz | Nowak | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl | 3 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
Możemy również wyszukać rekordy w określonym przedziale wartości:
SELECT * FROM pasazer WHERE id BETWEEN 2 AND 4;
+----+----------+----------+-------------+-------------+----------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+----------+-------------+-------------+----------------------------------+----------+
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 3 | Tadeusz | Nowak | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl | 3 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
+----+----------+----------+-------------+-------------+----------------------------------+----------+
Wyszukiwanie wartości różnych od określonej
Aby znaleźć wszystkie rekordy poza jednym określonym, używamy operatora <>
:
SELECT * FROM pasazer WHERE id <> 3;
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
Wyszukiwanie w zbiorach wartości
Jeśli chcemy pobrać dane dla kilku konkretnych wartości, używamy IN
:
SELECT * FROM pasazer WHERE id IN (1,2,5);
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
Wyszukiwanie i sortowanie po konkretnej kolumnie
Aby posortować wyniki według określonej kolumny, np. numeru PESEL, stosujemy:
SELECT * FROM pasazer ORDER by pesel;
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
| 3 | Tadeusz | Nowak | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl | 3 |
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
+----+----------+-----------+--------------+-------------+----------------------------------+----------+
Zaawansowane filtrowanie z LIKE
-
Znalezienie numerów telefonu zaczynających się od
1
:
SELECT * FROM pasazer WHERE telefon LIKE '1%';
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-------------+--------------------------------+----------+
-
Znalezienie numerów PESEL, gdzie druga cyfra to
6
:
SELECT * FROM pasazer WHERE pesel LIKE '_6%';
+----+----------+----------+-------------+-------------+----------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+----------+-------------+-------------+----------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
| 2 | Jan | Nowak | 86110045455 | 12312312312 | jann@ilovetechnikinformatyk.pl | 2 |
| 3 | Tadeusz | Nowak | 46120023232 | 45678901332 | tadzio@ilovetechnikinformatyk.pl | 3 |
| 4 | Zdzisław | Konopka | 7602334213 | 3424325434 | zdzichu@ilovethissite.pl | 1 |
+----+----------+----------+-------------+-------------+----------------------------------+----------+
-
Znalezienie imion kończących się na „a”:
SELECT * FROM pasazer WHERE imie LIKE '%a';
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
| 5 | Wiesława | Zzagrobna | 201005123456 | 123456123 | podziemie@thissiteisamazing.pl | 1 |
+----+----------+-----------+--------------+-----------+--------------------------------+----------+
Liczenie rekordów spełniających warunek
Aby policzyć, ilu pasażerów ma nazwisko kończące się na „a”, używamy:
SELECT count(*) as ile FROM pasazer WHERE nazwisko LIKE '%a';
+-----+
| ile |
+-----+
| 2 |
+-----+
Unikalne wartości
Aby uzyskać listę unikalnych imion:
SELECT DISTINCT imie FROM pasazer;
+----------+
| imie |
+----------+
| Jan |
| Tadeusz |
| Zdzisław |
| Wiesława |
+----------+
Podzapytania
Chcemy znaleźć nazwiska pasażerów zamieszkałych na konkretnej ulicy:
SELECT nazwisko FROM pasazer WHERE adres_id IN (
SELECT id FROM adres WHERE ulica LIKE 'Marcinkowskiego'
);
+-----------+
| nazwisko |
+-----------+
| Kowalski |
| Konopka |
| Zzagrobna |
+-----------+
Lub znaleźć rodzaj bagażu pasażera, który mieszka na konkretnej ulicy:
SELECT bagaz FROM rezerwacja WHERE pasazer_id IN (
SELECT id FROM pasazer WHERE adres_id IN (
SELECT id FROM adres WHERE ulica LIKE 'Warszawska'
)
);
+------------------------------+
| bagaz |
+------------------------------+
| Materiały wybuchowe + granat |
+------------------------------+
Operacje na dacie
Chcemy znaleźć wszystkie loty po danej dacie:
SELECT numer_lotu FROM lot WHERE data_wylotu > '2015-01-21 22:13:15';
+------------+
| numer_lotu |
+------------+
| 1 |
| 2 |
| 4 |
+------------+
Lub loty, które odbyły się w określonym przedziale czasowym:
SELECT typ FROM samolot WHERE id IN (
SELECT samolot_id FROM lot WHERE data_wylotu BETWEEN '2014-01-30 14:15:55' AND '2018-09-29 10:15:55'
);
+-----------+
| typ |
+-----------+
| Awionurek |
+-----------+
Łączenie tabel (JOIN)
Chcemy uzyskać dane pasażerów oraz ich adresów:
SELECT pasazer.imie AS Imie, pasazer.nazwisko AS Nazwisko, adres.ulica AS Ulica
FROM pasazer
JOIN adres
ON pasazer.adres_id = adres.id;
+----------+-----------+-----------------+
| Imie | Nazwisko | Ulica |
+----------+-----------+-----------------+
| Jan | Kowalski | Marcinkowskiego |
| Zdzisław | Konopka | Marcinkowskiego |
| Wiesława | Zzagrobna | Marcinkowskiego |
| Jan | Nowak | Warszawska |
| Tadeusz | Nowak | Pionierów |
+----------+-----------+-----------------+
Operacje UNION
i UNION ALL
Łączenie wyników dwóch zapytań bez duplikatów:
SELECT * FROM pasazer WHERE imie = 'Jan'
UNION
SELECT * FROM pasazer WHERE nazwisko = 'Nowak';
Z duplikatami:
SELECT * FROM pasazer WHERE imie = 'Jan'
UNION ALL
SELECT * FROM pasazer WHERE nazwisko = 'Nowak';
Wykluczanie wyników za pomocą NOT IN
Aby znaleźć pasażerów o imieniu Jan, którzy nie mają nazwiska Nowak:
SELECT * FROM pasazer WHERE imie = 'Jan' AND id NOT IN ( Select id FROM pasazer WHERE nazwisko = 'Nowak');
+----+------+----------+-------------+-------------+--------------------------------+----------+
| id | imie | nazwisko | pesel | telefon | mail | adres_id |
+----+------+----------+-------------+-------------+--------------------------------+----------+
| 1 | Jan | Kowalski | 66110012121 | 66677712345 | jank@ilovetechnikinformatyk.pl | 1 |
+----+------+----------+-------------+-------------+--------------------------------+----------+