데이터 처리 도구/SQL

[MySQL] 조건에 맞는 데이터 조회하기(WHERE절), 정렬하기(ORDER BY절)

yourhm 2022. 5. 4. 13:51

조건에 맞는 데이터 조회하기

WHERE 절을 사용하여 조건을 생성할 수 있다.

 

 

1. 비교연산자 사용하여 조건 만들기 

=, <>, ≤, ≥, <, >

 

SELECT *
FROM Products
WHERE ProductName < "C"

숫자뿐만 아니라 문자에 대해서도 비교연산자를 사용할 수 있다.

위 예시와 같은 쿼리를 실행한다면, 알파벳 순서에 따라서 문자 "C" 이전에 오는 데이터들만 불러온다. ProductName이 "A", "B" 로 시작하는 모든 데이터를 조회한다.

 

 

2. 논리연산자 사용하여 여러 조건 결합하기

더 구체적인 조건을 만들기위해 논리연산자를 사용하여 여러 조건들을 결합할 수 있다.

 

 

 

(1) AND

SELECT *
FROM Products
WHERE ProductsName < "C"
  AND Category = "Furniture"

 

 

(2) BETWEEN

 

WHERE + BETWEEN A AND B

 BETWEEN 조건에 써준 시작 값(A)과 끝 값(B)를 포함한다.

 초과/미만(X), 이상/이하(O)

 

 ⇒ 한 컬럼에 대해 AND을 사용한 조건이 두 개 있을 때, AND 대신 'BETWEEN' 으로 대체할 수 있다.

-- 경우1. AND를 사용한 조건 2개
SELECT *
FROM Products
WHERE ProductID >= 10 AND ProductID <= 20

-- 경우2. AND를 사용한 조건 2개 ⇒ BETWEEN 사용
SELECT *
FROM Products
WHERE ProductID BETWEEN 10 AND 20

 

 

(3) OR

SELECT *
FROM Products
WHERE ProductsName < "C"
   OR ProductsName < "D"

 

 

(4) IN

 

WHERE + IN (’A’, ‘B’, ‘C’)

 Category 컬럼의 값들 중에서 여러개의 카테고리에 대해 조회해야할 때 논리연산자 OR을 이용하여 조건을 계속 결합한다면 구문이 너무 길어지게 된다. 이때 IN을 사용함으로써 간결하게 작성할 수 있다.

 

 

⇒ 한 컬럼에 대해 OR을 사용한 조건이 여러 개 있을 때, OR 대신 'IN' 으로 대체할 수 있다.

-- 경우1. OR를 사용한 조건 2개
SELECT *
FROM Products
WHERE Category >= 'Furniture' AND Category <= 'Food'

-- 경우2. OR를 사용한 조건 2개 ⇒ IN 사용
SELECT *
FROM Products
WHERE Category IN ('Furniture', 'Food')

 

 

 

💡예제

 

상품 테이블에서 책이 10,000원이거나, 음식이 20,000원이거나, 옷이 30,000원 인 상품들을 모두 조회하고 싶은 경우 코드를 어떻게 작성해야 원하는 결과를 조회할 수 있을까? 카테고리와 가격 두 컬럼의 값을 조합하여 OR 조건을 생성해야 한다. ( '두 개 이상의 컬럼 값의 조합'에 대해 OR 조건을 생성하려는 경우)

 

-- 잘 작성된 코드

SELECT *
FROM Products
WHERE (Category, Price) IN (('Book',10000), ('Food',20000), ('Fashion',30000))

이 쿼리는 (Category, Price)의 조합이 ('Book', 10000), ('Food', 20000), ('Fashion', 30000) 중 하나인 경우에만 행을 반환한다. 따라서 기대한 결과에 대해서 정확히 조회할 수 있다.

 

-- 잘못 작성된 코드

SELECT *
FROM Products
WHERE Category IN ('Book', 'Food', 'Fashion') AND Price IN (10000, 20000, 30000)

그러나 이렇게 한 컬럼씩 IN으로 조건을 만들고 그것을 AND로 결합하면 기대한 결과를 반환하지 않는다. 이 쿼리는 Category와 Price가 각각의 값에 대해 조합될 수 있는 모든 경우의 수를 반환한다. 즉, 아래와 같이 모든 조합에 대해서 모두 조회된다.

 

Book - 10000, Book - 20000, Book - 30000,

Food - 10000, Food - 20000, Food - 30000,

Fashion - 10000, Fashion - 20000, Fashion - 30000

 

 

 

3. 결측값 조회하기

SELECT *
FROM Products
WHERE ProductID IS NULL

IS NULL, IS NOT NULL

• 숫자도 아니고 문자도 아닌, 비어있는 값들을 조회할 수 있다.

 = NULL (X), <> NULL (X)  ⇒  비교연산자로 사용하지 않기 주의!

 

  O X
결측값이다 IS NULL = NULL
결측값이 아니다 IS NOT NULL <> NULL

 

 

 

정렬하기

ORDER BY 컬럼명

• ASC: 오름차순 (default)

 DESC: 오름차순

 

SELECT *
FROM Products
WHERE Price < 50
ORDER BY ProductID DESC

 

- ORDER BY 의 위치는 항상 SELECT, FROM, WHERE 뒤에 온다.

- ORDER BY 는 데이터를 조회하는 명령어일뿐, 데이터베이스의 저장된 순서를 변경하는것이 아니다.

- 데이터 타입에 따른 대소 비교 차이

     ㄴ 수치형 데이터 정렬시 → 크기 순서로 대소 비교

     ㄴ 문자열 데이터 정렬시 → 사전식 순서(lexicographically)로 대소 비교

 

 

💡그렇다면 숫자가 들어있지만 문자열 타입(VARCHAR)으로 저장되어 있는 컬럼을 정렬하면 어떻게 될까?

문자열 타입으로 저장되어있기 때문에 아래에서 왼쪽과 같이 사전식 순서로 대소가 비교되어 정렬된다. 이런 경우 크기 순서로 정렬하고 싶다면 이렇게 적어주면 된다. ➡️ ORDER BY 컬럼명*1