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:

  1. 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.
  2. 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> .
  3. 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
  4. 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 nazwie displayname 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 klauzula ORDER 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 E-mail PreferredContact
3347927472 [email protected] TELEFON
2137921892 [email protected] E-MAIL
ZERO [email protected] E-MAIL

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ąca AVG() 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ąca MIN() zwróci minimum wybranych wartości.
SELECT MIN(Salary) FROM Employees

Maksymalny

Funkcja agregująca MAX() zwróci maksimum wybranych wartości.
SELECT MAX(Salary) FROM Employees

Liczyć

Funkcja agregująca COUNT() 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ąca SUM() 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

Demo SQLFiddle

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow