본 문서의 내용은 한국데이터산업진흥원에서 펴낸 SQL 전문가 가이드를 기반으로 자격증 취득에 도움이 될 개념을 정리한 것입니다.
|
5. WHERE 절
1. WHERE 조건절 개요
WHERE 조건절을 사용하지 않고 필요 없는 많은 자료들을 데이터베이스로부터 요청하는 SQL 문장은 대량의 데이터를 검색하기 위해 데이터베이스가 설치되어 있는 서버의 CPU 나 MEMORY 와 같은 시스템 자원(Resources)들을 과다하게 사용한다. 또한 많은 사용자들의 QUERY 에 대해 바로바로 처리를 해주지 못하게 되고, 또한 검색된 많은 자료들이 네트워크를 통해서 전달됨으로써 문제점들을 발생시킨다.
WHERE 절은 조회하려는 데이터에 특정 조건을 부여할 목적으로 사용하기 때문에 FROM 절 뒤에 오게 된다.
SELECT (DISTINCT/ALL) 컬럼명 (ALIAS명)
FROM 테이블명
WHERE 컬럼명 비교연산자 (문자/숫자/표현식 or 비교 컬럼명);
2. 연산자의 종류
-
비교 연산자
- =, >, ≥, <, ≤
-
SQL 연산자
- BETWEEN a AND b: a와 b를 포함하는 범위 내에 값이 있으면 된다.
- IN (list): 리스트에 있는 값 중 어느 하나라도 일치하면 된다.
- LIKE '비교문자열': 비교문자열과 형태가 일치하면 된다. (%, _ 사용)
- IS NULL: NULL 값인 경우 (= NULL 형태로 사용할 수 없다.)
-
논리 연산자
- AND: 앞의 조건과 뒤의 조건을 동시에 만족해야 한다.
- OR: 앞뒤 조건 중 하나만 참(TURE)이면 된다.
- NOT: 뒤에 오는 조건에 반대되는 결과를 되돌려 준다.
-
부정 비교 연산자
- !=, ^= : 같지 않다
- <>: 같지 않다. (ISO 표준, 모든 운영체제에서 사용 가능)
- NOT 컬럼명 =: ~와 같지 않다.
- NOT 컬럼명 >: ~보다 크지 않다.
-
부정 SQL 연산자
- NOT BETWEEN a AND b: a와 b를 포함하는 범위에 값이 있지 않다.
- NOT IN (list): list 값과 하나도 일치하지 않는다.
- IS NOT NULL: NULL 값을 갖지 않는다.
- 연산자의 우선순위
- 괄호 ()
- NOT 연산자
- 비교 연산자, SQL 비교 연산자
- AND
- OR
3. 비교 연산자
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02';
문자 유형 비교 방법
-
양쪽 모두 CHAR 타입인 경우
- 길이가 서로 다르면, 작은 쪽에 빈 공간을 추가하여 길이를 같게 한 후에 비교한다.
- 서로 다른 문자가 나올 때까지 비교한다.
- 달라진 첫 번째 문자의 값에 따라 크기를 결정한다.
- 빈 공간의 수만 다르다면 서로 같은 값으로 결정한다.
-
어느 한 쪽이 VARCHAR 타입인 경우
- 서로 다른 문자가 나올 때까지 비교한다.
- 길이가 다르다면 비교 후에 길이가 긴 것이 크다고 판단한다.
- 길이가 같고 다른 것이 없으면 같다고 판단한다.
- VARCHAR는 NOT NULL까지 길이를 말한다.
-
상수값과 비교할 경우
- 상수 쪽을 변수 타입과 동일하게 바꾸고 비교한다.
- 변수 쪽이 CHAR 타입이면 CHAR 타입 비교 방법을 따른다.
- 변수 쪽이 VARCHAR 타입이면 VARCHAR 타입 비교 방법을 따른다.
4. SQL 연산자
IN 연산자
다중 리스트를 이용한 단일한 WHERE 조건 설정
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN (('MANAGER', 20), ('CLERK', 30));
단일 리스트를 이용한 다수의 WHERE 조건 설정
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER', 'CLERK')
AND DEPTNO IN (20, 30);
LIKE 연산자
LIKE 연산자에서는 와일드카드(WildCard)를 사용할 수 있다. 와일드카드(WildCard)란 한 개 혹은 0 개 이상의 문자를 대신해서 사용하기 위한 특수 문자를 의미하며, 이를 조합하여 사용하는 것도 가능하므로 SQL 문장에서 사용하는 스트링(STRING) 값으로 용이하게 사용할 수 있다.
- %: 0개 이상의 어떤 문자를 의미
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';
- _: 1개인 단일 문자를 의미
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE PLAYER_NAME LIKE '장성_';
BETWEEN a AND b 연산자
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE HEIGHT BETWEEN 179 AND 180;
IS NULL 연산자
연산과 관련된 NULL의 특성
- NULL 값과의 수치 연산은 NULL 값을 반환
- NULL 값과의 비교 연산은 거짓(FALSE) 반환
- 어떤 값과 비교할 수 없으며, 크거나 작다고 표현할 수 없다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, TEAM_ID
FROM PLAYER
WHERE POSITION IS NULL;
5. 논리 연산자
논리 연산자는 비교 연산자나 SQL 비교 연산자들로 이루어진 여러 개의 조건들을 논리적으로 연결시키기 위해서 사용되는 연산자라고 생각하면 된다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, TEAM_ID
FROM PLAYER
WHERE TEAM_ID = 'K02'
OR TEAM_ID = 'K07'
AND POSITION = 'MF'
AND HEIGHT >= 170
AND HEIGHT <= 180;
- TEAM_ID가 K07이고, 포지션이 미드필더(MF)이고, 키가 170 이상 180 이하인 데이터
- 또는 TEAM_ID가 K02인 데이터
위의 SQL 문장에 괄호를 적용하여 미드필더 데이터만 추출할 수 있다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07')
AND POSITION = 'MF'
AND HEIGHT >= 170
AND HEIGHT <= 180;
- TEAM_ID가 K02이거나 K07인 데이터
- 그리고 포지션이 미드필더(MF)이고, 키가 170 이상 180 이하인 데이터
위의 SQL 문장을 SQL 연산자를 활용하여 간단하게 만들 수 있다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02', 'K07')
AND POSITION = 'MF'
AND HEIGHT BETWEEN 170 AND 180;
6. 부정 연산자
NOT 연산자 사용 SQL 구문
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND NOT POSITION = 'MF'
AND NOT HEIGHT BETWEEN 175 AND 185;
<> 사용한 Oracle SQL 구문
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND POSITION <> 'MF'
AND NOT HEIGHT BETWEEN 175 AND 185;
실제로 위의 두 SQL 문장은 동일한 결과값을 반환한다.
7. ROWNUM, TOP 사용
ROWNUM (Oracle)
Oracle 의 ROWNUM 은 칼럼과 비슷한 성격의 Pseudo Column 으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호이며, 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.
아래의 3 가지 방식으로 사용할 수 있다.
WHERE ROWNUM <= 1;
WHERE ROWNUM < 1;
WHERE ROWNUM = 2
부등호를 사용할 때 반대의 경우는 반환되는 결과값이 없다.
(행의 개수를 제한한다는 ROWNUM의 목적을 생각하면 부등호 방향이 논리적으로 잘못됨을 알 수 있다.)
WHERE ROWNUM > 2;
WHERE ROWNUM >= 3;
아래처럼 임의의 N 행을 반환하게 할 수 없다.
WHERE ROWNUM = N;
WHERE ROWNUM < N;
추가적인 ROWNUM 의 용도로는 테이블 내의 고유한 키나 인덱스 값을 만들 수 있다.
UPDATE MY_TABLE SET COLUMN1 = ROWNUM;
TOP 절 (SQL Server)
SQL Server 는 TOP 절을 사용하여 결과 집합으로 출력되는 행의 수를 제한할 수 있다.
TOP (Expression) [PERCENT] [WITH TIES]
- Expression: 반환할 행의 수를 지정
- PERCENT: 쿼리 결과 집합에서 처음 Expression%의 행만 반환되게 한다.
- WITH TIES: ORDER BY 절이 지정된 경우에만 사용할 수 있으며, 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 한다.
SELECT TOP(3) PLAYER_NAME FROM PLAYER;
SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle 의 ROWNUM 과 SQL Server 의 TOP 절은 같은 기능을 하지만, ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다.
↓SQL 전문가 가이드 요약 목록
1장. 데이터 모델링의 이해
Part 1. 데이터 모델링의 이해
Part 2. 데이터 모델과 성능
2장. SQL 기본 및 활용
Part 1. SQL 기본
Part 2. SQL 활용
Part 3. SQL 최적화 기본원리
따로 PDF 파일이 필요하신 분은 댓글을 통해 메일 주소 적어주시기 바랍니다.
'데이터 사이언스 > SQL' 카테고리의 다른 글
[SQLD 학습 자료 요약] SQL 기본 및 활용 1.7. GROUP BY, HAVING 절 (2) | 2020.11.23 |
---|---|
[SQLD 학습 자료 요약] SQL 기본 및 활용 1.6. 함수 (FUNCTION) (0) | 2020.11.22 |
[SQLD 학습 자료 요약] SQL 기본 및 활용 1.4. TCL (0) | 2020.11.22 |
[SQLD 학습 자료 요약] SQL 기본 및 활용 1.3. DML (0) | 2020.11.19 |
[SQLD 학습 자료 요약] SQL 기본 및 활용 1.2. DDL (0) | 2020.11.19 |