Ten artykuł zawiera przykłady podstawowych zapytań SQL, których początkujący mogą używać do pobierania danych ze swoich baz danych.
Podstawowy SELECT
Zapytanie
Oto przykład prawdopodobnie najczęściej używanego zapytania w SQL:
SELECT *
FROM Pets;
Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
To zapytanie wybiera wszystkie wiersze i wszystkie kolumny z Pets
stół. Dzieje się tak, ponieważ gwiazdka (*
) symbol wieloznaczny zaznacza wszystkie kolumny.
Wybierz nazwy kolumn
Ze względu na wydajność zazwyczaj najlepiej jest unikać wybierania wszystkich kolumn, chyba że naprawdę ich potrzebujesz. Zwykle lepiej jest wybrać tylko te kolumny, których potrzebujesz.
Oto przykład.
SELECT PetId, PetName
FROM Pets;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 2 | Fetch | | 3 | Scratch | | 4 | Wag | | 5 | Tweet | | 6 | Fluffy | | 7 | Bark | | 8 | Meow | +---------+-----------+
Filtruj wyniki
Możesz dodać WHERE
klauzula, aby filtrować wyniki tylko do potrzebnych wierszy.
SELECT PetId, PetName
FROM Pets
WHERE PetName = 'Fluffy';
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 6 | Fluffy | +---------+-----------+
Oto kolejny przykład filtrowania wyników. Tym razem używamy operatora większego niż (>
), aby filtrować według daty.
SELECT PetName, DOB
FROM Pets
WHERE DOB > '2020-01-01';
Wynik:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | +-----------+------------+
Możesz zamienić operator większy niż na inne operatory, takie jak operator większy lub równy (>=
), mniej niż operator (<
) lub mniejsze lub równe operatorowi (<=
).
Możesz także użyć BETWEEN
operator do filtrowania wyników do określonego zakresu (np. między dwiema datami).
SELECT
PetName,
DOB
FROM Pets
WHERE DOB BETWEEN '2018-01-01' AND '2020-01-01';
Wynik:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | +-----------+------------+
Posortuj wyniki
Możesz dodać ORDER BY
klauzula do sortowania wierszy zwracanych przez zapytanie.
Kolejność rosnąco
Użyj ASC
słowo kluczowe, aby posortować wyniki w porządku rosnącym. Jest to wartość domyślna, więc możesz również pominąć to słowo kluczowe, jeśli chcesz uzyskać wyniki w kolejności rosnącej.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC;
Lub:
SELECT PetId, PetName
FROM Pets
ORDER BY PetName;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 1 | Fluffy | | 6 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+
Kolejność malejąca
Użyj DESC
słowo kluczowe, aby posortować wyniki w kolejności malejącej.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName DESC;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 4 | Wag | | 5 | Tweet | | 3 | Scratch | | 8 | Meow | | 1 | Fluffy | | 6 | Fluffy | | 2 | Fetch | | 7 | Bark | +---------+-----------+
Sortuj według wielu kolumn
Możesz sortować według wielu kolumn, wymieniając każdą kolumnę oddzieloną przecinkiem.
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC, PetId ASC;
SELECT PetId, PetName
FROM Pets
ORDER BY PetName ASC, PetId DESC;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 1 | Fluffy | | 6 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+ (8 rows affected) +---------+-----------+ | PetId | PetName | |---------+-----------| | 7 | Bark | | 2 | Fetch | | 6 | Fluffy | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | | 5 | Tweet | | 4 | Wag | +---------+-----------+ (8 rows affected)
Widzimy, że dwa puszyste są w innej kolejności w każdym wyniku (możemy to stwierdzić, patrząc na ich PetId
wartości). Dzieje się tak, ponieważ PetName
kolumna została posortowana jako pierwsza, a następnie PetId
posortował wszystkie duplikaty z pierwszego sortowania.
Sortuj według ukrytych kolumn
Możesz sortować według kolumn, które nie są uwzględnione w SELECT
lista.
SELECT PetId, PetName
FROM Pets
ORDER BY DOB DESC;
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 5 | Tweet | | 1 | Fluffy | | 6 | Fluffy | | 4 | Wag | | 2 | Fetch | | 3 | Scratch | | 7 | Bark | | 8 | Meow | +---------+-----------+
W takim przypadku możemy wywnioskować z tych wyników, że Tweet
jest najmłodszym zwierzakiem, a Meow
jest najstarszy. Dzieje się tak, ponieważ posortowaliśmy według ich daty urodzenia (DOB
) kolumna w porządku malejącym.
Dla pewności, oto znowu z DOB
kolumna zawarta w SELECT
lista.
SELECT PetId, PetName, DOB
FROM Pets
ORDER BY DOB DESC;
Wynik:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 5 | Tweet | 2020-11-28 | | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | | 4 | Wag | 2020-03-15 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 7 | Bark | NULL | | 8 | Meow | NULL | +---------+-----------+------------+
Właściwie teraz widzimy, że Meow i Bark mają NULL
wartości w DOB
kolumna. Dlatego nie wiemy, czy faktycznie są starsi czy młodsi.
Ale to pokazuje, że NULL
wartości są traktowane jako najniższe możliwe wartości. Uważaj na NULL
wartości podczas uruchamiania zapytań.
Dopasowanie wzorca
Możesz użyć LIKE
operatora, aby użyć dopasowywania wzorców.
SELECT PetId, PetName
FROM Pets
WHERE PetName LIKE 'F%';
Wynik:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Fluffy | | 2 | Fetch | | 6 | Fluffy | +---------+-----------+
W tym przykładzie szukamy wszystkich zwierząt, których imiona zaczynają się na literę F
. Znak procentowy (%
) to znak wieloznaczny, który pasuje do dowolnego ciągu składającego się z zera lub większej liczby znaków. Może być używany jako prefiks lub sufiks, a także może być używany w środku ciągu.
Oto kolejny przykład.
SELECT FirstName, LastName, Email
FROM Owners
WHERE Email LIKE '%@example.%';
Wynik:
+-------------+------------+-------------------+ | FirstName | LastName | Email | |-------------+------------+-------------------| | Homer | Connery | [email protected] | | Bart | Pitt | [email protected] | +-------------+------------+-------------------+
Wybierz z listy
IN
operator określa, czy określona wartość pasuje do dowolnej wartości w podzapytaniu lub liście.
Oto przykład.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Wynik:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Podzapytania
Możesz użyć IN
operator podczas wykonywania podzapytania (zapytanie zagnieżdżone w innym zapytaniu).
Oto przykład.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Wynik:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
To zwróciło kolumny z jednej tabeli (PetTypes
), ale tylko wtedy, gdy w innej tabeli był przynajmniej jeden odpowiedni wiersz (Pets
), który miał pasujący PetTypeId
kolumna.
Aby dokładniej to zademonstrować, poniżej przedstawiono odpowiednią zawartość tych dwóch tabel.
PetTypes
tabela:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+
Pets
tabela:
+-------------+-----------+ | PetTypeId | PetName | |-------------+-----------| | 2 | Fluffy | | 3 | Fetch | | 2 | Scratch | | 3 | Wag | | 1 | Tweet | | 3 | Fluffy | | 3 | Bark | | 2 | Meow | +-------------+-----------+
Widzimy, że PetTypes
tabela zawiera typ zwierzaka Rabbit
, ale żadne ze zwierząt w Pets
tabeli zostały przypisane tego typu (tzn. nie ma wartości 4
w Pets.PetTypeId
kolumna).
Zobacz 12 często używanych operatorów SQL i tę listę operatorów SQL, aby uzyskać więcej informacji o operatorach w SQL.
Dołączenia
Można się spierać, czy złączenia SQL są uważane za „podstawowe zapytania SQL”, ale i tak dołączę tutaj.
Aby zakończyć ten artykuł, oto przykład sprzężenia wewnętrznego.
SELECT
p.PetName,
pt.PetType
FROM Pets p
INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Wynik:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+
W tym przypadku użyliśmy INNER JOIN
aby zwrócić wszystkie imiona zwierzaków z odpowiadającymi im typami zwierzaków. Użyliśmy ON
klauzula określająca predykat do oceny dla każdej pary połączonych wierszy. W tym przypadku p.PetTypeId
kolumna jest kluczem obcym pt.PetTypeId
kolumna, która jest kluczem podstawowym dla PetTypes
tabela.
W tym przykładzie użyłem również aliasów na tabelach, co pomogło zachować ładny i zwięzły kod.
Więcej przykładów złączeń znajdziesz w moim samouczku SQL Joins.