SQL
Фильтровать результаты, используя WHERE и HAVING
Поиск…
Синтаксис
- SELECT column_name
FROM table_name
WHERE значение оператора column_name - SELECT column_name, aggregate_function (column_name)
FROM table_name
GROUP BY column_name
ИМЕЕТ значение оператора aggregate_function (column_name)
Предложение WHERE возвращает только строки, соответствующие его критериям
Steam имеет игры под секцией $ 10 на своей странице магазина. Где-то глубоко в центре их систем, вероятно, есть запрос, который выглядит примерно так:
SELECT *
FROM Items
WHERE Price < 10
Используйте IN для возврата строк со значением, содержащимся в списке
В этом примере используется таблица автомобилей из примерных баз данных.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
Этот запрос вернет Car # 2, который стоит 200 и Car # 3, который стоит 100. Обратите внимание, что это эквивалентно использованию нескольких предложений с OR
, например:
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
Используйте LIKE, чтобы найти соответствующие строки и подстроки
См. Полную документацию по оператору LIKE .
В этом примере таблица Employees используется в примерах баз данных.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
Этот запрос возвращает только Employee # 1, чье имя точно совпадает с «John».
SELECT *
FROM Employees
WHERE FName like 'John%'
Добавление %
позволяет вам искать подстроку:
-
John%
- вернет любого Сотрудника, чье имя начинается с «Джона», за которым следует любое количество символов -
%John
- вернет любого Сотрудника, чье имя заканчивается на «Джон», которое исходит из любого количества символов -
%John%
- вернет любого Сотрудника, чье имя содержит «Джон» в любом месте значения
В этом случае запрос вернет Employee # 2, чье имя «John», а также Employee # 4, чье имя «Johnathon».
Предложение WHERE с NULL / NOT NULL значениями
SELECT *
FROM Employees
WHERE ManagerId IS NULL
Этот оператор возвращает все записи Employee, где значение столбца ManagerId
равно NULL
.
Результатом будет:
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
Этот оператор вернет все записи Employee, где значение ManagerId
не NULL
.
Результатом будет:
Id FName LName PhoneNumber ManagerId DepartmentId
2 John Johnson 2468101214 1 1
3 Michael Williams 1357911131 1 2
4 Johnathon Smith 1212121212 2 1
Примечание. Тот же запрос не будет возвращать результаты, если вы измените предложение WHERE на WHERE ManagerId = NULL
или WHERE ManagerId <> NULL
.
Использование HAVING с агрегатными функциями
В отличие от WHERE
, HAVING
может использоваться с совокупными функциями.
Агрегатная функция - это функция, в которой значения нескольких строк группируются вместе как входные данные по определенным критериям, чтобы сформировать одно значение более значимого значения или измерения ( Википедия ).
Общие агрегированные функции включают COUNT()
, SUM()
, MIN()
и MAX()
.
В этом примере используется таблица автомобилей из примерных баз данных.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
Этот запрос вернет счетчик CustomerId
и Number of Cars
любого клиента, у которого есть более одного автомобиля. В этом случае единственным клиентом, у которого есть более одного автомобиля, является Клиент № 1.
Результаты будут выглядеть так:
Пользовательский ИД | Количество автомобилей |
---|---|
1 | 2 |
Используйте BETWEEN для фильтрации результатов
В следующих примерах используются типовые базы данных Sales and Customers .
Примечание: МЕЖДУ оператора включительно.
Использование оператора BETWEEN с номерами:
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
В этом запросе будут возвращены все записи ItemSales
, количество которых больше или равно 10 и меньше или равно 17. Результаты будут выглядеть так:
Я бы | Дата продажи | ItemId | Количество | Цена |
---|---|---|---|---|
1 | 2013-07-01 | 100 | 10 | 34,5 |
4 | 2013-07-23 | 100 | 15 | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
Использование оператора BETWEEN с значениями даты:
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
Этот запрос вернет все записи ItemSales
с помощью SaleDate
который больше или равен 11 июля 2013 года и меньше или равен 24 мая 2013 года.
Я бы | Дата продажи | ItemId | Количество | Цена |
---|---|---|---|---|
3 | 2013-07-11 | 100 | 20 | 34,5 |
4 | 2013-07-23 | 100 | 15 | 34,5 |
5 | 2013-07-24 | 145 | 10 | 34,5 |
При сравнении значений даты и времени вместо дат вам может потребоваться преобразовать значения даты и времени в значения даты или добавить или вычесть 24 часа, чтобы получить правильные результаты.
Использование оператора BETWEEN с текстовыми значениями:
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
Пример Live: скрипт SQL
Этот запрос возвращает всех клиентов, имя которых в алфавитном порядке находится между буквами «D» и «L». В этом случае возвращаются Клиент №1 и №3. Клиент № 2, имя которого начинается с «М», не будет включено.
Я бы | FName | LName |
---|---|---|
1 | Уильям | Джонс |
3 | Ричард | Дэвис |
равенство
SELECT * FROM Employees
Этот оператор вернет все строки из таблицы Employees
.
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
Использование WHERE
в конце вашего SELECT
позволяет ограничить возвращаемые строки условием. В этом случае, когда существует точное совпадение с помощью знака =
:
SELECT * FROM Employees WHERE DepartmentId = 1
Вернет только строки, в которых значение параметра DepartmentId
равно 1
:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
И И ИЛИ
Вы также можете объединить несколько операторов для создания более сложных условий WHERE
. В следующих примерах используется таблица Employees
:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
1 James Smith 1234567890 NULL 1 1000 01-01-2002 01-01-2002 01-01-2002
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
А ТАКЖЕ
SELECT * FROM Employees WHERE DepartmentId = 1 AND ManagerId = 1
Вернусь:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
2 John Johnson 2468101214 1 1 400 23-03-2005 23-03-2005 01-01-2002
ИЛИ ЖЕ
SELECT * FROM Employees WHERE DepartmentId = 2 OR ManagerId = 2
Вернусь:
Id FName LName PhoneNumber ManagerId DepartmentId Salary Hire_date CreatedDate ModifiedDate
3 Michael Williams 1357911131 1 2 600 12-05-2009 12-05-2009 NULL
4 Johnathon Smith 1212121212 2 1 500 24-07-2016 24-07-2016 01-01-2002
Используйте HAVING для проверки нескольких условий в группе
Таблица заказов
Пользовательский ИД | Код товара | Количество | Цена |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 3 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 |
3 | 5 | 6 | 700 |
Чтобы проверить клиентов, которые заказали оба продукта - ProductID 2 и 3, можно использовать HAVING
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
Возвращаемое значение:
Пользовательский ИД |
---|
1 |
Запрос выбирает только записи с идентификаторами productID в вопросах и с проверкой предложения HAVING для групп, имеющих 2 productIds, а не только один.
Другая возможность
select customerId
from orders
group by customerId
having sum(case when productID = 2 then 1 else 0 end) > 0
and sum(case when productID = 3 then 1 else 0 end) > 0
В этом запросе выбираются только группы, имеющие хотя бы одну запись с идентификатором productID 2 и по меньшей мере с идентификатором productID 3.
Где EXISTS
Выберет записи в TableName
, имеющие записи, соответствующие в TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)