예제 테이블
Customers
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglun | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Products
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
| 3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
| 4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
| 5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
WHERE
WHERE 절은 특정 조건을 만족하는 레코드만 가져올 때 사용한다.
SELECT 뿐만 아니라 다른 명령어에도 사용할 수 있다.
SELECT 필드이름1, 필드이름2 ...
FROM 테이블이름
WHERE 조건;
아래 명령어는 Customers 테이블에서 Country 필드의 값이 Mexico 인 레코드를 모두 가져온다.
SELECT *
FROM Customers
WHERE Country='Mexico';
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
Country 값이 Mexico 인 레코드들만 출력되었다.
WHERE 절의 연산자
WHERE 절의 조건문에 사용할 수 있는 연산자 목록은 아래와 같다.
| 연산자 | 설명 |
|---|---|
| = | 같음 |
| <> | 같지 않음 Note: 몇몇 sql 버전에서는 != 로 표시한다. |
| > | 보다 큼 |
| < | 보다 작음 |
| >= | 크거나 같음 |
| <= | 작거나 같음 |
| BETWEEN 시작 AND 끝 | 시작부터 끝까지의 범위에 포함 |
| LIKE 패턴 | 패턴과 일치하는 값 검색 |
| IN (조건1, 조건2, ...) | 여러 조건들 중 하나와 일치 |
AND, OR, NOT 연산자
WHERE 절은 AND, OR, NOT 연산자와 함께 사용할 수 있다.
AND 와 OR 연산자는 여러개의 조건으로 WHERE 절을 사용할 수 있게 해준다.
AND:AND로 구분된 여러개의 조건이 모두 참인 데이터를 가져온다.OR:OR로 구분된 여러개의 조건 중 최소 하나 이상이 참인 데이터를 가져온다.
AND 문
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건1 AND 조건2 AND 조건3 ...;
OR 문
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건1 OR 조건2 OR 조건3 ...;
아래 명령은 Country 필드의 값이 Germany 이면서, City 필드의 값이 Berlin 인 레코드를 가져온다.
SELECT *
FROM Customers
WHERE Country='Germany' AND City='Berlin';
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
아래의 명령은 City 필드 값이 Berlin 이거나 London 인 값을 가져온다.
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
NOT 은 주어진 조건에 일치하지 않는 레코드를 가져온다.
아래 명령은 Country 필드의 값이 Mexico 가 아닌 레코드들을 모두 가져온다.
SELECT *
FROM Customers
WHERE NOT Country='Mexico';
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
AND, OR, NOT 연산자는 서로 섞어서 쓸 수 있다.
아래는 Customers 테이블에서 City 가 London 이거나, Country 가 Mexico 이면서 PostalCode 가 05021 이 아닌 레코드들을 모두 가져온다.
SELECT *
FROM Customers
WHERE City='London' OR (Country='Mexico' AND NOT PostalCode='05021');
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
LIKE
LIKE 는 WHERE 절에 붙여서 사용하며, 필드의 값들 중 특정 문자열 패턴을 가지는 값을 찾을 때 사용한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 필드이름 LIKE 패턴;
AND 또는 OR 을 사용해서 여러개의 조건을 설정할 수도 있다.
LIKE 는 두 가지 와일드카드 를 사용한다.
%: 없거나, 하나 또는 여러개의 문자열._: 문자열 하나.
MS Access에서는_대신?를 사용한다.
MS Access 와 sql Server 에서는 다음의 와일드카드도 사용할 수 있다.
[문자열 또는 문자범위]: 문자열 또는 문자범위와 일치하는 값 검색[!문자열 또는 문자범위] 또는 [^문자열 또는 문자범위]: 문자열 또는 문자범위와 일치하지 않는 값 검색
아래는 와일드카드의 사용 예이다.
| LIKE 연산자 | 설명 |
|---|---|
| WHERE CustomerName LIKE 'a%' | "a" 로 시작하는 값을 찾음 |
| WHERE CustomerName LIKE '%a' | "a" 로 끝나는 값을 찾음 |
| WHERE CustomerName LIKE '%or%' | "or" 이 포함된 값을 찾음 |
| WHERE CustomerName LIKE '_r%' | 두번째 글자가 "r" 인 값을 찾음 |
| WHERE CustomerName LIKE 'a_%_%' | "a" 로 시작하는 세글자 이상의 값을 찾음 |
| WHERE ContactName LIKE 'a%o' | "a" 로 시작하고 "o" 로 끝나는 값을 찾음 |
| WHERE ContactName LIKE '[bsp]%' | "b", "s", "p" 중 하나로 시작하는 값을 찾음 |
| WHERE ContactName LIKE '%[!a-c]' | "a", "b", "c" 중 하나로 끝나지 않는 값을 찾음 |
아래 명령은 Customers 테이블에서 CustomerName 필드가 a 로 시작하는 레코드를 모두 찾는다.
SELECT *
FROM Customers
WHERE CustomerName LIKE 'a%';
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
IN
IN 은 WHERE 의 조건에 여러개의 값을 특정할 때 사용한다.
여러개의 OR 을 사용하는 것과 같다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 필드이름 IN (값1, 값2, ...);
값을 직접 입력해줄 수도 있고 아래와 같이 다른 SELECT 문의 결과 테이블에서 가져올 수도 있다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 필드이름 IN (SELECT문);
아래 명령은 Customers 테이블에서 Country 필드 값이 Germany, UK, Sweden 인 레코드만 가져온다.
SELECT * FROM Customers
WHERE Country IN ('Germany', 'Sweden', 'UK');
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
BETWEEN
BETWEEN 은 주어진 범위 내의 값을 찾아 가져온다. 범위는 문자열, 숫자, 날짜 형태로 주어질 수 있다.
범위의 시작값과 끝값을 검색에 포함한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 필드이름 BETWEEN 시작범위 AND 끝범위;
아래는 Products 테이블의 Price 필드 값이 10 이상 20 이하인 레코드들을 가져오는 명령이다.
SELECT *
FROM Products
WHERE Price BETWEEN 10 AND 20;
Result
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
| 3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
아래의 명령은 Products 테이블의 ProductName 필드를 기준으로 오름차순 정렬하였을 때 ProductName 필드 값이 Chang 인 레코드와 Chef Anton's Cajun Seasoning 인 레코드 사이의 레코드를 모두 가져온다.
SELECT *
FROM Products
WHERE ProductName BETWEEN "Chang" AND "Chef Anton's Cajun Seasoning"
ORDER BY ProductName;
Result
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
| 4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
EXISTS
EXISTS 는 서브쿼리(SELECT문)의 결과테이블에 레코드가 있는지 없는지를 테스트할 때 사용한다.
서브쿼리가 조건에 맞는 레코드를 하나 이상 가져올 경우, TRUE 를, 아닌 경우 FALSE 를 리턴한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE EXISTS
(SELECT 필드이름1, 필드이름2, ... FROM 테이블이름 WHERE 조건); # 서브쿼리
아래 명령은 Suppliers 테이블의 SupplierID 필드의 값과 같은 값을 가지면서 Price 필드 값이 22 이하인 Products 테이블의 레코드가 있으면 TURE 를 리턴하고, 해당 레코드의 SupplierID 와 같은 값을 가지는 Suppliers 테이블의 레코드의 SupplierName 필드 값을 가져온다.
쉽게 말해서 가격이 22 이하인 제품을 제공하는 제공자 목록을 가져오는 것이다.
SELECT SupplierName
FROM Suppliers
WHERE EXISTS
(SELECT ProductName
FROM Products
WHERE SupplierID=Suppliers.SupplierID AND Price > 22);
Result
| SupplierName |
|---|
| Exotic Liquid |
| New Orleans Cajun Delights |
[SQL] WHERE
Reference
W3School: https://www.w3schools.com/sql/