상세 컨텐츠

본문 제목

7. SQL로 데이터 조회하기

CS전공 지식/4. 데이터베이스 개론 & SQL

by 본투비곰손 2023. 8. 21. 22:36

본문

728x90

SQL에서 NULL의 의미

  • unknown (알려지지 않음)
  • unavailable or withheld (사용할 수 없음)
  • not applicable (해당사항 없음)
  • = 또는 != 등 비교 연산자를 사용 하면 안된다.
  • IS 또는 NOT IS를 사용하면 된다.

NULL과 Three-Valued Logic

  • SQL에서 NULL과 비교 연산을 하게 되면 그 결과는 UNKNOWN이다.
  • UNKNOWN은 ‘TRUE일 수 도 있고 FALSE일 수도 있다’ 라는 의미이다.
  • Three-Valued Logic: 비교/논리 연산의 결과로 TRUE, FALSE, UNKNOWN 세 가지를 가진다.

WHERE절에 있는 condition(s)의 결과가 TRUE인 tuple(s)만 선택된다.

즉, 결과가 FALSE거나 UNKNWON이면 tuple은 선택되지 않는다.

NOT IN 사용 시 주의 사항

v NOT IN (v1, v2, v3)는 아래와 같은 의미이다.

v != v1 AND v != v2 AND v != v3

만약 v1, v2 ,v3 중 하나라도 NULL값이면 ??

E.birth_date의 값에 NULL 값이 있으면 제외 되긴 하지만 아래와 같이 작성하는 것이 좋다.

mysql> select * from employee;
+----+---------+------------+------+-----------+-----------+---------+
| id | name    | birth_date | sex  | position  | salary    | dept_id |
+----+---------+------------+------+-----------+-----------+---------+
|  1 | MESSI   | 1987-02-01 | M    | DEV_BACK  | 100000000 |    1003 |
|  2 | JANE    | 1996-05-05 | F    | DSGN      | 180000000 |    1004 |
|  3 | JENNY   | 2000-10-12 | F    | DEV_BACK  |  50000000 |    1003 |
|  4 | BROWN   | 1996-03-13 | M    | CEO       | 240000000 |    1002 |
|  5 | DINGYO  | 1990-11-05 | M    | CTO       | 120000000 |    1002 |
|  6 | JULIA   | 1986-12-11 | F    | CFO       | 240000000 |    1002 |
|  7 | MINA    | 1993-06-17 | F    | DSGN      | 160000000 |    1004 |
|  9 | HENRY   | 1982-05-20 | M    | HR        |  82000000 |    1002 |
| 10 | NICOLE  | 1991-03-26 | F    | DEV_FRONT | 180000000 |    1003 |
| 11 | SUZANNE | 1993-03-23 | F    | PO        |  75000000 |    1005 |
| 12 | CURRY   | 1998-01-15 | M    | PLN       | 170000000 |    1004 |
| 13 | JISUNG  | NULL       | M    | PO        |  90000000 |    1005 |
| 14 | SAM     | NULL       | M    | DEV_INFRA |  70000000 |    1003 |
+----+---------+------------+------+-----------+-----------+---------+
13 rows in set (0.00 sec)
mysql> SELECT D.id, D.name
    -> FROM department AS D
    -> WHERE D.id NOT IN (
    ->          SELECT E,dept_id
    ->          FROM employee E
    ->          WHERE E.birth_date >= '2000-01-01'
    ->  );
//NOT IN 대신 NOT EXISTS 로 변경하거나
mysql> SELECT D.id, D.name
    -> FROM department AS D
    -> WHERE NOT EXISTS (
    ->          SELECT*
    ->          FROM employee E
    ->          WHERE E.dept_id = d.id and E.birth_date >= '2000-01-01'
    ->  );
+------+-------------+
| id   | name        |
+------+-------------+
| 1004 | design      |
| 1001 | headquarter |
| 1002 | HR          |
| 1005 | product     |
+------+-------------+
4 rows in set (0.00 sec)
아래와 같이 IS NOT NULL을 넣어 준다.
mysql> SELECT D.id, D.name
    -> FROM department AS D
    -> WHERE D.id NOT IN (
    ->          SELECT E.dept_id
    ->          FROM employee E
    ->          WHERE E.birth_date >= '2000-01-01'
    ->                  AND E.dept_id IS NOT NULL
    ->  );
+------+-------------+
| id   | name        |
+------+-------------+
| 1004 | design      |
| 1001 | headquarter |
| 1002 | HR          |
| 1005 | product     |
+------+-------------+

 

728x90

관련글 더보기