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을 사용하여 목록에 포함 된 값이있는 행을 반환합니다.
이 예제는 예제 데이터베이스의 Car Table 을 사용합니다.
SELECT *
FROM Cars
WHERE TotalCost IN (100, 200, 300)
이 쿼리는 비용이 200 인 Car # 2와 100 인 Car # 3을 반환합니다. 이는 OR
여러 절을 사용하는 것과 같습니다. 예 :
SELECT *
FROM Cars
WHERE TotalCost = 100 OR TotalCost = 200 OR TotalCost = 300
LIKE를 사용하여 일치하는 문자열 및 하위 문자열을 찾습니다.
LIKE 연산자에 대한 전체 설명서를 참조하십시오.
이 예제에서는 예제 데이터베이스의 Employees 테이블 을 사용합니다.
SELECT *
FROM Employees
WHERE FName LIKE 'John'
이 쿼리는 첫 번째 이름이 'John'과 정확히 일치하는 Employee # 1 만 반환합니다.
SELECT *
FROM Employees
WHERE FName like 'John%'
%
추가하면 하위 문자열을 검색 할 수 있습니다.
-
John%
- 이름이 'John'으로 시작하고 그 뒤에 임의의 문자가 오는 Employee를 반환합니다. -
%John
- 이름이 'John'으로 끝나고 모든 문자 수만큼 진행되는 Employee를 반환합니다. -
%John%
- 이름에 'John'이 포함 된 Employee를 반환합니다.
이 경우 쿼리는 이름이 'John'인 Employee # 2와 이름이 'Johnathon'인 Employee # 4를 반환합니다.
NULL / NOT NULL 값이있는 WHERE 절
SELECT *
FROM Employees
WHERE ManagerId IS NULL
이 명령.은 ManagerId
컬럼 값이 NULL
모든 Employee 레코드를 리턴 NULL
.
결과는 다음과 같습니다.
Id FName LName PhoneNumber ManagerId DepartmentId
1 James Smith 1234567890 NULL 1
SELECT *
FROM Employees
WHERE ManagerId IS NOT NULL
이 명령문은 ManagerId
값이 NULL
이 아닌 모든 Employee 레코드를 리턴 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
은 집계 함수와 함께 사용할 수 있습니다.
집계 함수는 더 중요한 의미 또는 측정 ( Wikipedia )의 단일 값을 형성하기 위해 여러 행의 값이 특정 기준의 입력으로 함께 그룹화되는 기능입니다.
일반적인 집계 함수에는 COUNT()
, SUM()
, MIN()
및 MAX()
있습니다.
이 예제는 예제 데이터베이스의 Car Table 을 사용합니다.
SELECT CustomerId, COUNT(Id) AS [Number of Cars]
FROM Cars
GROUP BY CustomerId
HAVING COUNT(Id) > 1
이 쿼리는 둘 이상의 자동차를 보유한 고객의 CustomerId
및 Number of Cars
개수를 반환합니다. 이 경우 두 대 이상의 고객이있는 유일한 고객은 고객 # 1입니다.
결과는 다음과 같습니다.
고객 ID | 자동차 수 |
---|---|
1 | 2 |
BETWEEN을 사용하여 결과 필터링
다음 예제에서는 Item Sales 및 Customers 샘플 데이터베이스를 사용합니다.
주 : BETWEEN 연산자 가 포함됩니다.
Numbers에서 BETWEEN 연산자 사용 :
SELECT * From ItemSales
WHERE Quantity BETWEEN 10 AND 17
이 쿼리는 수량이 10보다 크고 17보다 작거나 같은 모든 ItemSales
레코드를 반환합니다. 결과는 다음과 같습니다.
신분증 | 판매 날짜 | ItemId | 수량 | 가격 |
---|---|---|---|---|
1 | 2013-07-01 | 100 | 10 | 34.5 |
4 | 2013-07-23 | 100 | 15 명 | 34.5 |
5 | 2013 년 7 월 24 일 | 145 | 10 | 34.5 |
날짜 값에 BETWEEN 연산자 사용 :
SELECT * From ItemSales
WHERE SaleDate BETWEEN '2013-07-11' AND '2013-05-24'
이 쿼리는 2013 년 7 월 11 일보다 크거나 2013 년 5 월 24 일 이하의 SaleDate
를 가진 모든 ItemSales
레코드를 반환합니다.
신분증 | 판매 날짜 | ItemId | 수량 | 가격 |
---|---|---|---|---|
삼 | 2013-07-11 | 100 | 20 | 34.5 |
4 | 2013-07-23 | 100 | 15 명 | 34.5 |
5 | 2013 년 7 월 24 일 | 145 | 10 | 34.5 |
날짜 대신 datetime 값을 비교할 때 datetime 값을 날짜 값으로 변환하거나 올바른 결과를 얻으려면 24 시간을 더하거나 뺄 필요가 있습니다.
텍스트 값에 BETWEEN 연산자 사용 :
SELECT Id, FName, LName FROM Customers
WHERE LName BETWEEN 'D' AND 'L';
실례 : SQL 바이올린
이 쿼리는 알파벳순으로 'D'와 'L'사이에 이름이있는 모든 고객을 반환합니다. 이 경우 고객 # 1과 고객 # 3이 반환됩니다. 이름이 'M'으로 시작하는 고객 # 2는 포함되지 않습니다.
신분증 | FName | LName |
---|---|---|
1 | 윌리엄 | 존스 |
삼 | 리차드 | 데이비스 |
평등
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
SELECT
문의 끝에 WHERE
를 사용하면 리턴 된 행을 조건으로 제한 할 수 있습니다. 이 경우 =
기호를 사용하여 정확히 일치하는 위치 :
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
AND 및 OR
더 복잡한 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을 사용하여 그룹의 여러 조건을 확인하십시오.
주문 표
고객 ID | 제품 ID | 수량 | 가격 |
---|---|---|---|
1 | 2 | 5 | 100 |
1 | 삼 | 2 | 200 |
1 | 4 | 1 | 500 |
2 | 1 | 4 | 50 개 |
삼 | 5 | 6 | 700 |
ProductID 2와 3을 모두 주문한 고객을 확인하려면 HAVING을 사용할 수 있습니다
select customerId
from orders
where productID in (2,3)
group by customerId
having count(distinct productID) = 2
반환 값 :
고객 ID |
---|
1 |
쿼리는 질문에 productID가있는 레코드 만 선택하고 HAVING 절을 사용하면 두 개 뿐인 productIds가있는 그룹에 대해 HAVING 절을 검사합니다.
또 다른 가능성은
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 인 레코드가 적어도 하나있는 그룹 만 선택합니다.
존재하는 곳
레코드 선택하게됩니다 TableName
에 일치하는 기록이 TableName1
.
SELECT * FROM TableName t WHERE EXISTS (
SELECT 1 FROM TableName1 t1 where t.Id = t1.Id)