예제 테이블
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/