Szukaj…
Wprowadzenie
Instrukcja SELECT stanowi sedno większości zapytań SQL. Definiuje, jaki zestaw wyników powinien zostać zwrócony przez zapytanie, i prawie zawsze jest używany w połączeniu z klauzulą FROM, która określa, które części bazy danych powinny być wyszukiwane.
Składnia
WYBIERZ [DISTINCT] [kolumna1] [, [kolumna2] ...]
OD [tabela]
[GDZIE warunki]
[GROUP BY [kolumna1] [, [kolumna2] ...][HAVING [kolumna 1] [, [kolumna 2] ...]
[ZAMÓWIENIE PRZEZ ASC | DESC]
Uwagi
WYBIERZ określa, które dane kolumn mają zostać zwrócone i w jakiej kolejności z danej tabeli (biorąc pod uwagę, że odpowiadają one innym wymaganiom w zapytaniu konkretnie - gdzie i mając filtry i złączenia).
SELECT Name, SerialNumber
FROM ArmyInfo
zwróci tylko wyniki z Name
i Serial Number
kolumn, ale nie z kolumny o nazwie Rank
, na przykład
SELECT *
FROM ArmyInfo
wskazuje, że wszystkie kolumny zostaną zwrócone. Należy jednak pamiętać, że SELECT *
jest słabą praktyką, ponieważ dosłownie zwracane są wszystkie kolumny tabeli.
Użycie znaku wieloznacznego do wybrania wszystkich kolumn w zapytaniu.
Rozważ bazę danych z następującymi dwiema tabelami.
Tabela pracowników:
ID | FName | LName | DeptId |
---|---|---|---|
1 | James | Kowal | 3) |
2) | Jan | Johnson | 4 |
Tabela działów:
ID | Nazwa |
---|---|
1 | Obroty |
2) | Marketing |
3) | Finanse |
4 | TO |
Prosta instrukcja wyboru
*
to symbol wieloznaczny używany do wybierania wszystkich dostępnych kolumn w tabeli.
Kiedy jest stosowany jako substytut jednoznacznych nazw kolumn, zwraca wszystkie kolumny we wszystkich tabelach, że zapytanie jest wybór FROM
. Ten efekt dotyczy wszystkich tabel, do których zapytanie uzyskuje dostęp poprzez swoje klauzule JOIN
.
Rozważ następujące zapytanie:
SELECT * FROM Employees
Zwróci wszystkie pola wszystkich wierszy tabeli Employees
:
ID | FName | LName | DeptId |
---|---|---|---|
1 | James | Kowal | 3) |
2) | Jan | Johnson | 4 |
Notacja kropkowa
Aby wybrać wszystkie wartości z określonej tabeli, znak wieloznaczny można zastosować do tabeli z notacją kropkową .
Rozważ następujące zapytanie:
SELECT
Employees.*,
Departments.Name
FROM
Employees
JOIN
Departments
ON Departments.Id = Employees.DeptId
Spowoduje to zwrócenie zestawu danych ze wszystkimi polami w tabeli Employee
, a następnie tylko pola Name
w tabeli Departments
:
ID | FName | LName | DeptId | Nazwa |
---|---|---|---|---|
1 | James | Kowal | 3) | Finanse |
2) | Jan | Johnson | 4 | TO |
Ostrzeżenia przed użyciem
Ogólnie zaleca się, aby w miarę możliwości unikać *
używania kodu produkcyjnego, ponieważ może to powodować szereg potencjalnych problemów, w tym:
- Nadmiar operacji we / wy, obciążenie sieci, użycie pamięci itd., Ze względu na to, że silnik bazy danych odczytuje niepotrzebne dane i przesyła je do kodu interfejsu. Jest to szczególnie niepokojące, gdy mogą istnieć duże pola, takie jak pola używane do przechowywania długich notatek lub załączonych plików.
- Dalsze nadmierne obciążenie IO, jeśli baza danych musi buforować wyniki wewnętrzne na dysk w ramach przetwarzania zapytania bardziej złożonego niż
SELECT <columns> FROM <table>
. - Dodatkowe przetwarzanie (i / lub nawet więcej IO), jeśli niektóre niepotrzebne kolumny to:
- kolumny obliczane w bazach danych, które je obsługują
- w przypadku wyboru z widoku kolumny z tabeli / widoku, które optymalizator zapytań mógłby zoptymalizować w inny sposób
- Możliwość wystąpienia nieoczekiwanych błędów, jeśli kolumny zostaną dodane do tabel i widoków później, co spowoduje niejednoznaczne nazwy kolumn. Na przykład
SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname
- jeśli kolumna o nazwiedisplayname
zostanie dodana do tabeli zamówień, aby umożliwić użytkownikom nadanie swoim zamówieniom znaczących nazw na przyszłość, pojawi się nazwa kolumny dwa razy w danych wyjściowych, więc klauzulaORDER BY
będzie niejednoznaczna, co może powodować błędy („niejednoznaczna nazwa kolumny” w najnowszych wersjach MS SQL Server), a jeśli nie w tym przykładzie, kod aplikacji może zacząć wyświetlać nazwę zamówienia, w której nazwa osoby jest zamierzone, ponieważ nowa kolumna jest pierwszą zwróconą nazwą i tak dalej.
Kiedy możesz używać *
, mając na uwadze powyższe ostrzeżenie?
Chociaż najlepiej unikać tego w kodzie produkcyjnym, używanie *
jest w porządku jako skrót podczas wykonywania ręcznych zapytań do bazy danych w celu przeprowadzenia dochodzenia lub prac prototypowych.
Czasami decyzje projektowe w Twojej aplikacji sprawiają, że jest to nieuniknione (w takich okolicznościach wolisz tablealias.*
tylko *
tam, gdzie to możliwe).
Podczas korzystania z EXISTS
, takich jak SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID)
, nie zwracamy żadnych danych z B. W związku z tym łączenie jest niepotrzebne, a silnik wie, że nie należy zwracać żadnych wartości z B, a zatem nie ma wpływu na wydajność w przypadku używania *
. Podobnie COUNT(*)
jest w porządku, ponieważ tak naprawdę nie zwraca żadnej z kolumn, więc wystarczy tylko odczytać i przetworzyć te, które są używane do celów filtrowania.
Wybieranie z warunkiem
Podstawowa składnia instrukcji SELECT with WHERE to:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]
[Warunek] może być dowolnym wyrażeniem SQL, określonym za pomocą porównania lub operatorów logicznych, takich jak>, <, =, <>,> =, <=, LIKE, NOT, IN, BETWEEN itp.
Poniższa instrukcja zwraca wszystkie kolumny z tabeli „Samochody”, gdzie kolumna stanu to „GOTOWE”:
SELECT * FROM Cars WHERE status = 'READY'
Zobacz GDZIE i POSIADAJĄ więcej przykładów.
Wybierz poszczególne kolumny
SELECT
PhoneNumber,
Email,
PreferredContact
FROM Customers
Ta instrukcja zwróci kolumny PhoneNumber
Email
, Email
i PreferredContact
ze wszystkich wierszy tabeli Customers
. Również kolumny zostaną zwrócone w kolejności, w jakiej występują w klauzuli SELECT
.
Wynik będzie:
Numer telefonu | PreferredContact | |
---|---|---|
3347927472 | [email protected] | TELEFON |
2137921892 | [email protected] | |
ZERO | [email protected] |
Jeśli połączonych jest wiele tabel, możesz wybrać kolumny z określonych tabel, określając nazwę tabeli przed nazwą kolumny: [table_name].[column_name]
SELECT
Customers.PhoneNumber,
Customers.Email,
Customers.PreferredContact,
Orders.Id AS OrderId
FROM
Customers
LEFT JOIN
Orders ON Orders.CustomerId = Customers.Id
* AS OrderId
oznacza, że pole Id
tabeli Orders
zostanie zwrócone jako kolumna o nazwie OrderId
. Aby uzyskać więcej informacji, zobacz wybieranie za pomocą aliasu kolumny .
Aby uniknąć używania długich nazw tabel, możesz użyć aliasów tabeli. Zmniejsza to ból związany z pisaniem długich nazw tabel dla każdego pola wybranego w złączeniach. Jeśli wykonujesz samodzielne połączenie (połączenie między dwoma instancjami tej samej tabeli), musisz użyć aliasów tabeli, aby odróżnić swoje tabele. Możemy napisać alias tabeli jak Customers c
lub Customers AS c
. Tutaj c
działa jako alias dla Customers
i możemy wybrać, powiedzmy, Email
ten sposób: c.Email
. Email
.
SELECT
c.PhoneNumber,
c.Email,
c.PreferredContact,
o.Id AS OrderId
FROM
Customers c
LEFT JOIN
Orders o ON o.CustomerId = c.Id
WYBIERZ Używając aliasów kolumn
Aliasy kolumn służą głównie do skrócenia kodu i zwiększenia czytelności nazw kolumn.
Kod staje się krótszy, ponieważ można uniknąć długich nazw tabel i niepotrzebnej identyfikacji kolumn (np. W tabeli mogą znajdować się 2 identyfikatory, ale w instrukcji użyto tylko jednego) . Wraz z aliasami tabeli pozwala to na stosowanie dłuższych opisowych nazw w strukturze bazy danych, przy jednoczesnym zachowaniu zwięzłości zapytań dotyczących tej struktury.
Ponadto są czasami wymagane , na przykład w widokach, w celu nazwania obliczonych wyników.
Wszystkie wersje SQL
Aliasy można tworzyć we wszystkich wersjach SQL przy użyciu podwójnych cudzysłowów ( "
).
SELECT
FName AS "First Name",
MName AS "Middle Name",
LName AS "Last Name"
FROM Employees
Różne wersje SQL
Możesz użyć pojedynczych cudzysłowów ( '
), podwójnych cudzysłowów ( "
) i nawiasów kwadratowych ( []
), aby utworzyć alias w Microsoft SQL Server.
SELECT
FName AS "First Name",
MName AS 'Middle Name',
LName AS [Last Name]
FROM Employees
Oba spowodują:
Imię | Drugie imię | Nazwisko |
---|---|---|
James | Jan | Kowal |
Jan | James | Johnson |
Michael | Marcus | Williams |
Ta instrukcja zwróci kolumny FName
i LName
o podanej nazwie (alias). Można to osiągnąć za pomocą operatora AS
, po którym następuje alias, lub po prostu pisząc alias bezpośrednio po nazwie kolumny. Oznacza to, że następujące zapytanie ma taki sam wynik jak powyżej.
SELECT
FName "First Name",
MName "Middle Name",
LName "Last Name"
FROM Employees
Imię | Drugie imię | Nazwisko |
---|---|---|
James | Jan | Kowal |
Jan | James | Johnson |
Michael | Marcus | Williams |
Jednak wersja jawna (tj. Przy użyciu operatora AS
) jest bardziej czytelna.
Jeśli alias ma jedno słowo, które nie jest słowem zastrzeżonym, możemy je zapisać bez pojedynczych cudzysłowów, podwójnych cudzysłowów lub nawiasów:
SELECT
FName AS FirstName,
LName AS LastName
FROM Employees
Imię | Nazwisko |
---|---|
James | Kowal |
Jan | Johnson |
Michael | Williams |
Kolejną odmianą dostępną między innymi w MS SQL Server jest <alias> = <column-or-calculation>
, na przykład:
SELECT FullName = FirstName + ' ' + LastName,
Addr1 = FullStreetAddress,
Addr2 = TownName
FROM CustomerDetails
co jest równoważne z:
SELECT FirstName + ' ' + LastName As FullName
FullStreetAddress As Addr1,
TownName As Addr2
FROM CustomerDetails
Oba spowodują:
Pełna nazwa | Adres 1 | Addr2 |
---|---|---|
James Smith | 123 AnyStreet | TownVille |
John Johnson | 668 MyRoad | Anytown |
Michael Williams | 999 High End Dr | Williamsburgh |
Niektórzy uważają, że użycie =
zamiast As
łatwiejsze do odczytania, choć wielu zaleca ten format, głównie dlatego, że nie jest on standardem, więc nie jest powszechnie obsługiwany przez wszystkie bazy danych. Może powodować pomylenie z innymi zastosowaniami znaku =
.
Wszystkie wersje SQL
Ponadto, jeśli trzeba używać słów zastrzeżonych, można użyć wsporników lub cytaty ucieczki:
SELECT
FName as "SELECT",
MName as "FROM",
LName as "WHERE"
FROM Employees
Różne wersje SQL
Podobnie można uciec słowom kluczowym w MSSQL przy użyciu różnych metod:
SELECT
FName AS "SELECT",
MName AS 'FROM',
LName AS [WHERE]
FROM Employees
WYBIERZ | OD | GDZIE |
---|---|---|
James | Jan | Kowal |
Jan | James | Johnson |
Michael | Marcus | Williams |
Ponadto można użyć aliasu kolumny dowolnej z końcowych klauzul tego samego zapytania, na przykład ORDER BY
:
SELECT
FName AS FirstName,
LName AS LastName
FROM
Employees
ORDER BY
LastName DESC
Nie możesz jednak używać
SELECT
FName AS SELECT,
LName AS FROM
FROM
Employees
ORDER BY
LastName DESC
Aby utworzyć alias z tych zastrzeżonych słów ( SELECT
i FROM
).
Spowoduje to liczne błędy podczas wykonywania.
Wybór z posortowanymi wynikami
SELECT * FROM Employees ORDER BY LName
Ta instrukcja zwróci wszystkie kolumny z tabeli Employees
.
ID | FName | LName | Numer telefonu |
---|---|---|---|
2) | Jan | Johnson | 2468101214 |
1 | James | Kowal | 1234567890 |
3) | Michael | Williams | 1357911131 |
SELECT * FROM Employees ORDER BY LName DESC
Lub
SELECT * FROM Employees ORDER BY LName ASC
Ta instrukcja zmienia kierunek sortowania.
Można również określić wiele kolumn sortujących. Na przykład:
SELECT * FROM Employees ORDER BY LName ASC, FName ASC
Ten przykład posortuje wyniki najpierw według LName
a następnie, dla rekordów, które mają tę samą LName
, posortuj według FName
. To da ci wynik podobny do tego, który znajdziesz w książce telefonicznej.
Aby zaoszczędzić wpisywania nazwy kolumny w klauzuli ORDER BY
, można zamiast niej użyć numeru kolumny. Zauważ, że numery kolumn zaczynają się od 1.
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3
Możesz również osadzić instrukcję CASE
w klauzuli ORDER BY
.
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones` THEN 0 ELSE 1 END ASC
Spowoduje to posortowanie wyników, tak aby wszystkie rekordy LName
„Jones” na górze.
Wybierz kolumny, które są nazwane według zastrzeżonych słów kluczowych
Gdy nazwa kolumny jest zgodna z zarezerwowanym słowem kluczowym, standardowy SQL wymaga umieszczenia jej w podwójnych cudzysłowach:
SELECT
"ORDER",
ID
FROM ORDERS
Pamiętaj, że sprawia, że w nazwie kolumny rozróżniana jest wielkość liter.
Niektóre DBMS mają zastrzeżone sposoby cytowania nazw. Na przykład SQL Server używa do tego celu nawiasów kwadratowych:
SELECT
[Order],
ID
FROM ORDERS
podczas gdy MySQL (i MariaDB) domyślnie używają backicks:
SELECT
`Order`,
id
FROM orders
Wybór określonej liczby rekordów
Standard SQL 2008 definiuje klauzulę FETCH FIRST
, aby ograniczyć liczbę zwracanych rekordów.
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY
Ten standard jest obsługiwany tylko w najnowszych wersjach niektórych RDMS. Niestandardowa składnia specyficzna dla dostawcy jest dostępna w innych systemach. Postęp OpenEdge 11.x obsługuje również składnię FETCH FIRST <n> ROWS ONLY
.
Dodatkowo OFFSET <m> ROWS
przed FETCH FIRST <n> ROWS ONLY
pozwala na pomijanie wierszy przed ich pobraniem.
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY
W SQL Server i MS Access obsługiwane jest następujące zapytanie:
SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
Aby zrobić to samo w MySQL lub PostgreSQL, należy użyć słowa kluczowego LIMIT
:
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10
W Oracle to samo można zrobić z ROWNUM
:
SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC
Wyniki : 10 rekordów.
Id ProductName UnitPrice Package
38 Côte de Blaye 263.50 12 - 75 cl bottles
29 Thüringer Rostbratwurst 123.79 50 bags x 30 sausgs.
9 Mishi Kobe Niku 97.00 18 - 500 g pkgs.
20 Sir Rodney's Marmalade 81.00 30 gift boxes
18 Carnarvon Tigers 62.50 16 kg pkg.
59 Raclette Courdavault 55.00 5 kg pkg.
51 Manjimup Dried Apples 53.00 50 - 300 g pkgs.
62 Tarte au sucre 49.30 48 pies
43 Ipoh Coffee 46.00 16 - 500 g tins
28 Rössle Sauerkraut 45.60 25 - 825 g cans
Niuanse dostawcy:
Należy zauważyć, że TOP
w Microsoft SQL działa po klauzuli WHERE
i zwróci określoną liczbę wyników, jeśli istnieją one gdziekolwiek w tabeli, podczas gdy ROWNUM
działa jako część klauzuli WHERE
, więc jeśli inne warunki nie istnieją w określoną liczbę wierszy na początku tabeli, otrzymasz zero wyników, gdy można będzie znaleźć inne.
Wybieranie za pomocą aliasu tabeli
SELECT e.Fname, e.LName
FROM Employees e
Tabela Pracownicy otrzymuje alias „e” bezpośrednio po nazwie tabeli. Pomaga to usunąć niejednoznaczność w scenariuszach, w których wiele tabel ma tę samą nazwę pola i musisz sprecyzować, z której tabeli chcesz zwrócić dane.
SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
Pamiętaj, że po zdefiniowaniu aliasu nie można już używać kanonicznej nazwy tabeli. to znaczy,
SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
rzuci błąd.
Warto zauważyć, że do języka SQL wprowadzono aliasy tabeli - bardziej formalnie „zmienne zakresu” - aby rozwiązać problem zduplikowanych kolumn spowodowany przez INNER JOIN
. Standard SQL z 1992 r. Poprawił tę wcześniejszą wadę projektową, wprowadzając NATURAL JOIN
(zaimplementowane w mySQL, PostgreSQL i Oracle, ale jeszcze nie w SQL Server), w wyniku czego nigdy nie ma zduplikowanych nazw kolumn. Powyższy przykład jest interesujący, ponieważ tabele są połączone w kolumnach o różnych nazwach ( Id
i ManagerId
), ale nie powinny być łączone w kolumnach o tej samej nazwie ( LName
, FName
), wymagając zmiany nazwy kolumn do wykonania przed dołączeniem:
SELECT Fname, LName, ManagerFirstName
FROM Employees
NATURAL JOIN
( SELECT Id AS ManagerId, Fname AS ManagerFirstName
FROM Managers ) m;
Zauważ, że chociaż zmienna alias / range musi zostać zadeklarowana dla tabeli dervied (w przeciwnym razie SQL wygeneruje błąd), to nigdy nie ma sensu faktyczne użycie jej w zapytaniu.
Wybierz wiersze z wielu tabel
SELECT *
FROM
table1,
table2
SELECT
table1.column1,
table1.column2,
table2.column1
FROM
table1,
table2
Nazywa się to iloczynem krzyżowym w SQL, to samo co iloczynem krzyżowym w zestawach
Te instrukcje zwracają wybrane kolumny z wielu tabel w jednym zapytaniu.
Nie ma określonej relacji między kolumnami zwracanymi z każdej tabeli.
Wybieranie za pomocą funkcji agregujących
Średni
Funkcja agregującaAVG()
zwróci średnią wybranych wartości. SELECT AVG(Salary) FROM Employees
Funkcje agregujące można również łączyć z klauzulą where. SELECT AVG(Salary) FROM Employees where DepartmentId = 1
Funkcje agregujące można również łączyć z grupowaniem według klauzul. Jeśli pracownik jest podzielony na wiele działów i chcemy znaleźć średnią pensję dla każdego działu, możemy użyć następującego zapytania.
SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId
Minimum
Funkcja agregującaMIN()
zwróci minimum wybranych wartości. SELECT MIN(Salary) FROM Employees
Maksymalny
Funkcja agregującaMAX()
zwróci maksimum wybranych wartości. SELECT MAX(Salary) FROM Employees
Liczyć
Funkcja agregującaCOUNT()
zwróci liczbę wybranych wartości. SELECT Count(*) FROM Employees
Można go również łączyć z warunkami, aby uzyskać liczbę wierszy spełniających określone warunki. SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
Można również określić określone kolumny, aby uzyskać liczbę wartości w kolumnie. Zauważ, że wartości NULL
nie są liczone. Select Count(ManagerId) from Employees
Liczba może być również połączona z odrębnym słowem kluczowym, aby uzyskać odrębną liczbę. Select Count(DISTINCT DepartmentId) from Employees
Suma
Funkcja agregującaSUM()
zwraca sumę wartości wybranych dla wszystkich wierszy. SELECT SUM(Salary) FROM Employees
Wybieranie z wartością null
SELECT Name FROM Customers WHERE PhoneNumber IS NULL
Selekcja z zerami ma inną składnię. Nie używaj =
, zamiast tego użyj IS NULL
lub IS NOT NULL
.
Wybieranie za pomocą CASE
Gdy wyniki wymagają zastosowania logiki „w locie”, można użyć instrukcji CASE, aby ją zaimplementować.
SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold
FROM TableName
może być również przykuty
SELECT
CASE WHEN Col1 < 50 THEN 'under'
WHEN Col1 > 50 AND Col1 <100 THEN 'between'
ELSE 'over'
END threshold
FROM TableName
jeden może mieć także CASE
wewnątrz innego wyrażenia CASE
SELECT
CASE WHEN Col1 < 50 THEN 'under'
ELSE
CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1
ELSE 'over' END
END threshold
FROM TableName
Wybieranie bez blokowania stołu
Czasami, gdy tabele są używane głównie (lub tylko) do odczytów, indeksowanie już nie pomaga, a każdy drobiazg się liczy, można użyć selekcji bez LOCK, aby poprawić wydajność.
SQL Server
SELECT * FROM TableName WITH (nolock)
MySQL
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Wyrocznia
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
DB2
SELECT * FROM TableName WITH UR;
gdzie UR
oznacza „nieprzypisany odczyt”.
Jeśli zostanie zastosowany w tabeli, w której trwają modyfikacje rekordów, może mieć nieprzewidywalne wyniki.
Wybierz odrębne (tylko wartości unikalne)
SELECT DISTINCT ContinentCode
FROM Countries;
To zapytanie zwróci wszystkie wartości DISTINCT
(unikalne, różne) z kolumny ContinentCode
z tabeli Countries
ContinentCode |
---|
OC |
UE |
TAK JAK |
NA |
AF |
Wybierz z warunkiem wielu wartości z kolumny
SELECT * FROM Cars WHERE status IN ( 'Waiting', 'Working' )
Jest to semantycznie równoważne z
SELECT * FROM Cars WHERE ( status = 'Waiting' OR status = 'Working' )
tzn. value IN ( <value list> )
jest skrótem dla rozłączenia (logiczne OR
).
Uzyskaj zagregowany wynik dla grup wierszy
Zliczanie wierszy na podstawie określonej wartości kolumny:
SELECT category, COUNT(*) AS item_count
FROM item
GROUP BY category;
Uzyskanie średniego dochodu według działu:
SELECT department, AVG(income)
FROM employees
GROUP BY department;
Ważne jest, aby wybrać tylko kolumny określone w klauzuli GROUP BY
lub używane z funkcjami agregującymi .
Tam klauzula WHERE
może być również używana z GROUP BY
, ale WHERE
odfiltrowuje rekordy przed wykonaniem jakiegokolwiek grupowania:
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department;
Jeśli musisz odfiltrować wyniki po zakończeniu grupowania, np. Aby zobaczyć tylko działy, których średni dochód jest większy niż 1000, musisz użyć klauzuli HAVING
:
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department
HAVING avg(income) > 1000;
Wybieranie z więcej niż 1 warunkiem.
AND
kluczowe AND
służy do dodawania kolejnych warunków do zapytania.
Nazwa | Wiek | Płeć |
---|---|---|
Sam | 18 | M. |
Jan | 21 | M. |
Kok | 22 | M. |
Mary | 23 | fa |
SELECT name FROM persons WHERE gender = 'M' AND age > 20;
Zwróci to:
Nazwa |
---|
Jan |
Kok |
za pomocą słowa kluczowego OR
SELECT name FROM persons WHERE gender = 'M' OR age < 20;
Zwróci to:
Nazwa |
---|
Sam |
Jan |
Kok |
Te słowa kluczowe można łączyć, aby uzyskać bardziej złożone kombinacje kryteriów:
SELECT name
FROM persons
WHERE (gender = 'M' AND age < 20)
OR (gender = 'F' AND age > 20);
Zwróci to:
Nazwa |
---|
Sam |
Mary |