IFNULL(인수1, 인수2)

  1. 인수1이 NULL이 아니면 인수1 반환, NULL이면 (2)번 과정으로.
  2. 인수2가 NULL이 아니면 인수2 반환, NULL이면 NULL 반환.

 

SELECT
    *
FROM
    product
ORDER BY
    IFNULL(price, 999999) ASC;

 

price가 NULL일 경우에 값을 999999로 만들어서 맨 마지막에 위치하도록 정렬한다.

 

NULLIF(인수1, 인수2)

  1. 인수1 = 인수2 → NULL 반환
  2. 인수1 ≠ 인수2 → 인수1 반환

데이터가 NULL일 경우에 0이 아닌 NULL 그대로 나오게 해야할 경우 사용한다.

ex) 나눗셈의 분모 지정 시

'IT > Database' 카테고리의 다른 글

[RDBMS] 서브 쿼리  (0) 2021.10.06
[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06
[RDBMS] WHERE와 HAVING의 차이  (0) 2021.10.05

데이터베이스에서 NULL 처리를 할 때 CASE 또는 IF 함수를 사용해도 되지만 더 리소스를 적게 사용할 수 있는 함수가 있다.

바로 COALESCE 함수인데, 인수로 들어가는 값을 차례대로 확인하여 NULL이 아닌 데이터가 나왔을 때 그 값을 반환한다.

 

아래 나오는 inquiry 테이블과는 다르지만 어느 반에서 학생들이 시험을 봤다고 가정하자. 그런데 시험을 아예 보지 않은 학생이 있다면 데이터는 NULL로 들어가지만 반 평균 점수를 낼 때는 값을 포함시켜야 할 것이다. 이 때 NULL 데이터가 계산식에 들어가면 해당 데이터를 제외하고 계산하거나 오류가 생길 수 있으니 처리해주어야 하는데 그 역할을 해주는 게 COALESCE 함수이다.

id pref age star
1 서울시 20 2
2 충청도 30 5
3 경기도 40 3
4 충청도 20 4
5 서울시 30 4
6 서울시 20 1
7 NULL NULL NULL

 

SELECT
    AVG(COALESCE(star, 0))
FROM
    inquiry;

위와 같이 COALESCE 함수를 사용해서 쿼리문을 작성하면 NULL 값을 0으로 치환해서 계산하지만

 

SELECT
    AVG(star)
FROM
    inquiry;

위와 같이 작성한다면 NULL 값을 제외하고 계산하기 때문에 그 결과값이 달라진다.

First Match 기법을 사용하기 때문에 위의 조건부터 체크하며 하나의 조건이 만족하면 해당 처리를 수행 후 그 아래는 확인하지 않고 바로 END로 이동한다. 어떤 것에도 들어맞지 않으면 ELSE의 처리를 수행한다.

 

조건 CASE

SELECT
    customer, quantity,
    CASE
        WHEN quantity <= 3 THEN 1000
        WHEN quantity <= 7 THEN 1200
        WHEN quantity <= 10 THEN 1500
        ELSE 2000
    END AS delivery_fee
FROM
    delivery;

WHEN 뒤에 어떤 조건을 주고, THEN 뒤에 해당 조건을 만족한다면 실행할 동작을 작성한다.

만약 "WHEN quantity <= 10 THEN 1500"이 맨 위로 갈 경우 전부 맨 위에서 걸릴 것이기 때문에 항상 내려갈수록 조건의 범위가 좁아지도록 설정해주어야 한다(피라미드 형태).

 

값 CASE

SELECT
    customer,
    CASE delivery_time
        WHEN 1 THEN "오전"
        WHEN 2 THEN "오후"
        WHEN 3 THEN "야간"
        ELSE "지정 없음"
    END AS delivery_time2
FROM
    delivery;

WHEN 뒤에 어떤 값을 주고, CASE 뒤의 Column이 해당 값이라면 THEN 뒤의 값을 END AS 뒤의 별명으로 출력한다.

'IT > Database' 카테고리의 다른 글

[RDBMS] CAST 함수  (0) 2021.10.06
[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] IF 함수 및 함수 중첩(nest)  (0) 2021.10.06
[RDBMS] WHERE와 HAVING의 차이  (0) 2021.10.05
MySQL Workbench Tips (Updating)  (0) 2021.10.05
SELECT
    customer, quantity,
    IF(
        quantity > 5, "Yes", "No"
    ) AS novelty
FROM
    delivery;

IF 함수 안의 인수

  • 첫 번째 : 조건
  • 두 번째 : TRUE
  • 세 번째 : FALSE

 

IF 함수 중첩

SELECT
    customer, quantity,
    IF(
        quantity > 5, "Yes",
        IF(
            quantity > 3, "Next Time", "No"
        )
    ) AS novelty
FROM
    delivery;

첫 번째 IF 함수의 FALSE 자리에 또 다른 IF 함수를 작성함으로써 중첩시킬 수 있다.

첫 번째 IF 함수가 TRUE일 경우 해당 값으로 진행되고, FALSE일 경우 안 쪽의 IF 함수를 확인한다.

 

 


CASE 또는 IF 함수는 주로 SELECT절에서 사용하지만,

WHERE절(조건 분기)과 ORDER BY절(분류 기준 재정의)에서도 사용할 수 있다.

 

'IT > Database' 카테고리의 다른 글

[RDBMS] IFNULL, NULLIF 함수  (0) 2021.10.06
[RDBMS] CASE 함수  (0) 2021.10.06
[RDBMS] WHERE와 HAVING의 차이  (0) 2021.10.05
MySQL Workbench Tips (Updating)  (0) 2021.10.05
[RDBMS] 문자열에 %가 포함되었을 때의 LIKE 검색  (0) 2021.10.01

모든 SELECT 쿼리는 위의 순서도를 따른다.

아래의 예시 쿼리문 두 개를 통해 WHERE구와 HAVING구가 각각 어느 시점에서 필터링을 하는지 확인해보았다.

(패드에 글씨 쓰는 게 아직 익숙치 않아 처참하게 널부러진 글씨들은 이해 바람.)


WHERE


HAVING


요약하자면 WHERE는 테이블을 선택한 후 바로 필터링 작업을 하는 반면

HAVING은 그룹핑까지 끝낸 후에 하나의 그룹을 제외하는 방식으로 필터링을 거친다는 것인데

둘 중 어느 방식이 효율적인가는 상황에 따라 다를 것 같다.

 

한 가지 알 수 있는 사실은 WHERE구로 필터링을 하면 WHERE의 필터링 과정에서 처리할 데이터가 많아지는 것이고,

HAVING구로 필터링을 하면 GROUP BY로 그룹핑하는 과정에서 처리할 데이터의 양이 늘어난다는 것이다.

실무에서는 시뮬레이션 과정을 거쳐 코스트가 더 적은 방법을 찾는다고 한다.

주석

단일 줄 주석 (Double Hyphen)

-- remark

 

다중 줄 주석 (Slash & Asterisk)

/*

remark

remark

remark

*/

 

빠른 쿼리 실행

1. shift + 방향키(+ Home, End)로 쿼리문 범위 선택

2. Ctrl + Enter로 실행

search라는 이름의 테이블이 있다.

SELECT
	*
FROM
	search
WHERE
	val > "A";

문자열의 순서 상 B가 A보다 값이 크므로 id가 4인 B가 출력된다.


SELECT
	'4' > '10', 4 > 10;

문자열로써의 4와 10에서는 먼저 두 문자열의 0번째 문자끼리 비교했을 때 4가 1보다 뒤에 있는 값을 갖기 때문에 1, 0이 출력된다.

SELECT
	*
FROM
	product
WHERE
	product_name LIKE "%100\%%";

\%로 %의 기능을 무력화시켜 일반 문자처럼 사용할 수 있다 (Escape).

 

+ Recent posts