Bazy danych | Język SQL - Wyszukiwanie · Technik informatyk egzamin zawodowy

Programowanie / Bazy danych

Bazy danych | Język SQL - Wyszukiwanie

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 |
+----+------+----------+-------------+-------------+--------------------------------+----------+