• Home
  • About
    • Che1's Blog photo

      Che1's Blog

      Che1's Dev Blog

    • Learn More
    • Facebook
    • Instagram
    • Github
    • Steam
    • Youtube
  • Posts
    • All Posts
    • Django
    • Python
    • Front-end
    • Algorithm
    • etc
    • All Tags
  • Projects

[SQL] WHERE

07 Oct 2017

Reading time ~6 minutes

예제 테이블

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 목차
  • [SQL] JOIN, UNION
  • [SQL] DELETE
  • [SQL] UPDATE
  • [SQL] INSERT INTO
  • [SQL] SELECT를 꾸며주는 옵션 모음
  • [SQL] WHERE
  • [SQL] SELECT
  • [SQL] SQL 이란?

[SQL] WHERE
  • WHERE
  • AND, OR, NOT
  • LIKE
  • IN
  • BETWEEN
  • EXISTS
  • 참고 문헌

Reference

W3School: https://www.w3schools.com/sql/



SQL Share Tweet +1