책 홍보 : https://product.kyobobook.co.kr/detail/S000201370815
위 책을 읽고 실습 후 복습 차원으로 게시물을 작성함을 알린다.
(5) NULL 값과 NULL이 아닌 값 조회하기 (IS NULL / IS NOT NULL)
SQL문법에서 NULL값의 의미는 값의 의미는 값이 없거나 아니면 어떤 값이 있는지 모른다는 의미를 모두 포함함. 특히 NULL과 0을 혼동하는 경우가 가끔 있는데 숫자 0과 NULL은 완전히 다른 개념. 어떤 부분에 숫자 0이 들어가 있다는 것은 특정 값이 있다는 의미이고 NULL이라는 것은 어떤 값인지 모르거나 값이 비어 있다는 의미.
그래서 SQL을 작성할 때 NULL 값을 출력해야 하는 경우에 문제가 생김.
다음의 SQL은 emp2 테이블에서 부서 번호(deptno)가 1001, 1002, 1003, 1004번에 근무하는 사원들의 부서번호(deptno), 이름(name), 상여금(bonus) 값을 출력하는 쿼리.
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno IN(1001,1002,1003,1004) ;
위 결과에서 bonus 값이 비어 있는 부분을 NULL이라고 함.
위 결과에서 bonus 컬럼의 값이 NULL인 데이터들만 모두 출력하도록 쿼리를 바꾸면?
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno IN(1001,1002,1003,1004)
4 AND bonus = NULL ;
한 건도 출력되지 않음. 4번 행을 어떻게 바꾸면 원하는 결과를 얻을까?
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno IN(1001,1002,1003,1004)
4 AND bonus IS NULL ;
이렇게 하니 NULL 값만 출력됨.
이번엔 NULL이 아닌 값은 전부 출력
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno IN(1001,1002,1003,1004)
4 AND bonus IS NOT NULL ;
4번 행에 작성한대로 NULL이 아닌 값만 출력됨.
(6) 여러 가지 조건을 한꺼번에 검색하기 (AND / OR)
a) AND 연산자 - 모든 조건을 함께 만족하는 결과 추출하기
아래 SQL은 emp2 테이블에서 부서번호(deptno)가 1001이면서 bonus 값이 250인 데이터의 deptno, name, bonus 값을 출력하도록 SQL을 작성한 것
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno = 1001
4 AND bonus = 250 ;
만약 검색해야 할 조건이 더 있을 경우 4번 행 뒤에 AND 연산자와 함께 다른 조건을 더 적으면 됨.
아래 쿼리는 emp2 테이블에서 부서번호(deptno)가 1000인 사원 중에서 보너스(bonus)가 100 이상이면서 이름(name)이 'A'로 시작되는 직원들의 deptno, name, bonus 값을 추출하는 쿼리
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno = 1000
4 AND bonus >= 100
5 AND name LIKE 'A%' ;
위 SQL의 3~5번 행을 보면 여러 조건을 AND 연산자를 사용하여 지정함. AND 연산자를 사용하면 모든 조건을 다 만족하는 데이터를 출력하게 됨.
b) OR 연산자 - 여러 가지 조건 중 하나라도 해당되면 출력하기
여러 가지 조건을 지정한 후 그중에서 1가지만 해당되어도 그 데이터를 출력하는 역할
아래 SQL은 emp2 테이블에서 부서번호(deptno)가 1001이거나 또는 1002이거나 또는 1003인 사원들의 부서 번호(deptno), 이름(name), 보너스(bonus)를 출력하는 쿼리.
1 SELECT deptno , name , bonus
2 FROM emp2
3 WHERE deptno = 1001
4 OR deptno = 1002
5 OR deptno = 1003 ;
/
1 SELECT deptno , name , bonus
2 FROM emp2
3 WHERE deptno IN(1001, 1002, 1003)
→ 결과는 동일. 여러 개의 OR 연산자를 사용하는 것보다 IN() 연산자를 사용하는 것이 훨씬 더 간결함.
C) AND 연산자와 OR 연산자 사용 시 주의 사항
연산자의 우선순위는 아주 조심. 수학 처럼 덧셈, 곱셈 처럼 연산자의 우선 순위가 있다.
SQL에서 AND는 곱셈의 의미 OR 연산자는 더하기의 의미
→ A AND B의 경우 A와 B를 모두 만족해야 결과가 출력되기 때문이고 A OR B의 경우 A나 B 둘 중 한 가지만 만족해도 결과가 출력되기 때문
문제는 주어진 쿼리에서 AND 연산자와 OR 연산자가 동시에 사용될 경우.
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE deptno = 1000
4 OR deptno = 1001
5 AND bonus >= 250 ;
위 SQL의 3~5번 행에서 deptno 값이 1000이거나 deptno 값이 1001 이면서 bonus가 250보다 큰 값을 추출하라고 조건을 작성했는데 문제는 4번 줄의 OR와 5번 줄의 AND가 동시에 사용되었기 때문에 AND 조건이 먼저 실행된 후 OR 조건이 실행됨.
의도와는 다르게 먼저 AND로 연결된 4, 5번 행의 조건이 실행되어서 deptno 값이 1001이면서 bonus값이 250 이상인 값을 추출하고 또는 3번 행의 조건은 deptno 값이 1000인 데이터의 deptno, name, bonus 값을 추출한 것입니다.
이처럼 AND와 OR연산자가 함께 사용이 될 경우에는 연산자의 우선 순위를 항상 조심.
만약 위의 예와 같이 deptno가 1000이거나 deptno가 1001 중에서 bonus 값이 250 이상인 데이터를 추출하려면 아래와 같이 괄호 기호를 사용하여 연산자의 우선 순위를 직접 지정.
1 SELECT deptno, name, bonus
2 FROM emp2
3 WHERE (deptno = 1000
4 OR deptno = 1001)
5 AND bonus >= 250 ;
(7) 정렬하기 (ORDER BY)
정렬은 오름차순과 내림차순 방식이 있는데 오름차순은 작은 값 → 큰 값 형태로 정렬하는 방식, 내림차순은 데이터가 큰 값 → 작은 값 형태로 정렬되는 것을 의미.
주의할 사항은 날짜로 날짜는 예전 날짜가 작고 최근 날짜가 큰 날짜. 즉 생일을 기준으로 나이가 많은 순서대로 정렬해야 한다면 날짜가 오래된 날짜부터 먼저 나와야 하고 나이가 어린 순서 부터 먼저 정렬해야할 경우 최근 날짜부터 먼저 출력.
정렬을 할 때는 ORDER BY 구문을 사용하는데 이때 ORDER BY 절은 SQL 문장에서 가장 마지막에 와야 합니다. 즉 조건에 맞는 데이터를 모두 추출한 후에 정렬을 해야함.
그리고 ORDER BY 절의 기본 방식은 오름차순인데 직접 지정하고 싶다면 ASC 키워드를 지정하면 되고(기본값) 내림차순으로 정렬하고 싶다면 DESC 키워드를 사용.
다음 예제는 emp 테이블에서 사원들의 이름과 생년월일을 출력하되 나이가 많은 사람부터 먼저 출력하는 쿼리.
1 SELECT deptno , name , birthday
2 FROM emp
3 WHERE deptno IN(1000,1001,1002,1003);
1 SELECT deptno , name , birthday
2 FROM emp
3 WHERE deptno IN(1000,1001,1002,1003)
4 ORDER BY birthday ;
내림차순 정렬을 해보면
1 SELECT deptno , name , birthday
2 FROM emp
3 WHERE deptno IN(1000,1001,1002,1003)
4 ORDER BY birthday DESC ;
실무에서는 대부분 정렬이 SQL의 성능을 많이 저하시키는 요인이기 때문에 정렬을 해야할 때 ORDER BY와 index를 함께 사용.
(8) 집합 연산자 활용하기
데이터베이스에서 데이터를 추출할 때 일반적으로 여러 건의 데이터를 추출하여 작업하는 경우가 많다.
연산자 종류 | 내 용 |
UNION | 두 집합의 결과를 합쳐서 출력. 중복 값 제거 후 출력 |
UNION ALL | 두 집합의 결과를 합쳐서 출력. 중복 값 제거 안하고 출력 |
INTERSECT | 두 집합의 교집합 결과를 출력함. (MySQL 지원 안함) |
MINUS | 두 집합의 차집합 결과를 출력함. 쿼리의 순서 중요함. (MySQL 지원 안함) |
예제)
1 SELECT name FROM student
2 WHERE deptno1 = 101
3 UNION
4 SELECT name FROM student
5 WHERE deptno2 = 201 ;
1 SELECT name FROM student
2 WHERE deptno1 = 101
3 UNION ALL
4 SELECT name FROM student
5 WHERE deptno2 = 201 ;
SELECT 문으로 데이터 조회 2-2 연산자 활용 1~4 (0) | 2024.05.27 |
---|---|
SELECT 문으로 데이터 조회 2-1 (0) | 2024.05.27 |
SELECT 문으로 데이터 조회 1 (0) | 2024.05.27 |
MySQL 기본 - SELECT 문 실습1 (0) | 2023.10.13 |
SQL 기본 - SELECT문 (2) | 2023.10.13 |