티스토리 뷰
1. WHERE 조건절 개요
▷ WHERE 조건절
: 사용자들이 원하는 자료만을 검색하기 위하여 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한한다.
두 개 이상의 테이블에 대한 조인 조거늘 기술하거나, 결과를 제한하기 위한 조건을 기술할 수 있다.
<WHERE 조건절 미사용시 문제점>
많은 사용자들, 프로그램들이 동시에 접속하여 다량의 트랜잭션을 발생한다.
필요 없는 많은 자료들을 데이터베이스로부터 요청하는 것은,
데이터베이스가 설치되어 있는 서버의 CPU 나 메모리와 같은 시스템 자원 (Resources) 들을 과다하게 사용한다.
많은 Query 에 대해 바로 처리를 못하고, 검색된 많은 자료들이 네트워크를 통해 전달됨으로써 문제점을 발생시킨다.
문제점을 방지하기 위해,
WHERE 절에 조건이 없는 FTS ( Full Table Scan ) 문장은 SQL 튜닝의 1차적인 검토 대상이 된다.
SELECT [DISTINCT/ALL] 칼럼명 [ALIAS명] FROM 테이블명 WHERE 조건식;
# 조건식 구성
1. 칼럼명 (보통 조건식의 좌측에 위치)
2. 비교연산자
3. 문자, 숫자, 표현식 (보통 조건식의 우측에 위치)
4. 비교 칼럼명 (JOIN 사용시)
2. 연산자의 종류
▷ WHERE 절에 사용되는 연산자 3 가지
(1) 비교 연산자 (부정 비교 연산자 포함)
(2) SQL 연산자 (부정 SQL 연산자 포함)
(3) 논리 연산자
※ 연산자
구분 | 연산자 | 연산자의 의미 |
비교 연산자 |
= | 같다 |
> | 보다 크다 | |
>= | 보다 크거나 같다 | |
< | 보다 작다 | |
<= | 보다 작거나 같다 | |
SQL 연산자 |
BETWEEN a AND b | a 와 b 값 사이에 있으면 된다 ( a와 b 값이 포함됨 ) |
IN (list) | 리스트에 있는 값 중에 어느 하나라도 일치하면 된다 | |
LIKE '비교문자열' | 비교문자열과 형태가 일치하면 된다 ( % , _ 사용 ) |
|
IS NULL | NULL 값인 경우 | |
논리 연산자 |
AND | 앞의 조건과 뒤의 조건이 참이 되면 결과도 참(TRUE)이 된다 ( 즉, 앞뒤의 조건 중 하나만 참이면 된다 ) |
OR | 앞의 조건이 참이거나, 뒤의 조건이 참이 되어야 결과도 참(TRUE)이 된다 |
|
NOT | 뒤에 오는 조건에 반대되는 결과를 되돌려 준다 | |
부정 비교 연산자 |
!= | 같지 않다 |
^= | 같지 않다 | |
<> | 같지 않다 ( ISO 표준, 모든 운영체제에서 사용 가능 ) |
|
NOT 칼럼명 = | ~와 같지 않다 | |
NOT 칼럼명 > | ~보다 크지 않다 | |
부정 SQL 연산자 |
NOT BETWEEN a AND b |
a 와 b 값 사이에 있지 않다 ( a, b 값을 포함하지 않는다 ) |
NOT IN (list) | 리스트 값과 일치하지 않는다 | |
IS NOT NULL | NULL 값을 갖지 않는다 |
※ 연산자의 우선순위
연산 우선순위 | 설명 |
1 | 괄호 ( ) |
2 | NOT 연산자 |
3 | 비교 연산자, SQL 비교 연산자 |
4 | AND |
5 | OR |
연산자들의 우선순위를 염두해서 WHERE 절을 작성해야 한다.
3. 비교 연산자
비교 연산자 ( =, >, >=, <, <= ) 를 WHERE 조건절에 사용한다.
(예제)
* 오류사항 코드
SELECT PLAYER_NAME 선수이름, HEIGHT 키 FROM PLAYER WHERE PLAYER_NAME = KIM;
ERROR: 열명이 부적합하다.
PLAYER_NAME 의 데이터 타입은 CHAR(3) 인데, 비교 연산자 오른쪽에 KIM 의 값을 작은따옴표( ' ' ) 또는 큰따옴표 ( " " ) 와 같은 인용 부호로 묶어서 처리하지 않았기 때문에 발생하는 에러이다.
* 올바른 코드
SELECT PLAYER_NAME 선수이름, HEIGHT 키 FROM PLAYER WHERE PLAYER_NAME = 'KIM';
CHAR 변수나 VARCHAR2 와 같은 문자형 타입을 가진 칼럼을 특정 값과 비교하기 위해서는 인용 부호 ( 작은따옴표, 큰 따옴표 ) 로 묶어서 비교 처리를 한다.
NUMERIC 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.
☞ 문자 유형간의 비교 조건이 발생하는 경우?
4. SQL 연산자
: SQL 연산자는 SQL 문장에서만 사용하도록 기본적으로 예약되어 있는 연산자로서 모든 데이터 타입에 대해서 연산이 가능하다.
※ IN (list) 연산자
(예제)
IN (list) 형태의 SQL 비교 연산자를 사용하는 것.
(1) TEAM_ID 가 'K02' , 'K07' 리스트에 있는 조건문.
SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID IN ('K02','K07');
(2) 다중 리스트
SELECT PLAYER_NAME FROM PLAYER WHERE (TEAM_ID,DEPTNO) IN (('K02',20),('K07',30));
다중 리스트를 이용한 IN 연산자는 SQL 문장을 짧게 만들어 주면서, 성능 측면에서도 장점을 가질 수 있는 매우 유용한 연산자이다.
※ LIKE 연산자
(예제)
LIKE 연산자를 사용하는 것.
(1) POSITION 이 'MF' 와 같은 선수를 찾는 조건문.
SELECT PLAYER_NAME FROM PLAYER WHERE POSITION LIKE 'MF';
LIKE 의 사전적 의미는 '~와 같다' 이다.
그럼 비교 연산자인 '=' 를 사용해도 같은 결과이지만, LIKE 연산자를 사용하는 이유?
(2) 이름이 "김"씨 성을 가진 선수들을 조회할 경우
SELECT PLAYER_NAME FROM PLAYER WHERE PLAYER_NAME LIKE '장%';
와일드카드 (WildCard) 를 사용할 수 있다.
▷ 와일드카드 ( WILDCARD )
: 한 개 혹은 0 개 이상의 문자를 대신해서 사용하기 위한 특수 문자.
조합하여 사용하는 것도 가능하므로 SQL 문장에서 사용하는 String 값으로 용이하게 사용할 수 있다.
※ BETWEEN a AND b 연산자
(예제)
BETWEEN ~ AND ~ 연산자를 사용하는 것.
(1) 키가 170~180 인 선수들을 찾는 조건문.
SELECT PLAYER_NAME FROM PLAYER WHERE HEIGHT BETWEEN 170 AND 180;
BETWEEN a AND b 는 범위에서 'a' 와 'b' 의 값을 포함한다. ( <= , >= )
※ IS NULL 연산자
NULL ( ASCII 00 ) 은 값이 존재하지 않은 것으로 확정되지 않은 값을 표현한다.
어떤 값 보다 크거나 작지도 않고, ' ' (공백, ASCII 32) 이나 0 (ZERO, ASCII 48) 과 달리 비교 자체가 불가능한 값이다.
< 연산 관련 NULL 의 특성 >
(1) NULL 값과의 수치연산은 NULL 값을 리턴한다.
(2) NULL 값과의 비교연산은 거짓(FALSE) 을 리턴한다.
(3) 어떤 값과 비교할 수도 없으며, 특정 값보다 크다 작다 라고 표현할 수 없다.
NULL 값은 비교 연산자 ( =, >, < 등 ) 로 비교할 수 없다.
비교 연산을 하게 되면 결과는 거짓(FALSE) 을 리턴한다.
수치 연산자 ( +, -, *, / 등 ) 를 통해서 NULL 값과 연산을 하게 되면 NULL 값을 리턴한다.
NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 문구로만 할 수 있다.
(예제)
IS NULL 연산자를 사용하는 것.
(1) POSITION 값이 NULL 인 조건문
SELECT PLAYER_NAME FROM PLAYER WHERE POSITION IS NULL;
5. 논리 연산자
: 논리 연산자는 비교 연산자나 SQL 비교 연산자들로 이루어진 여러 개의 조건들을 논리적으로 연결시키기 위해 사용되는 연산자이다.
(예제)
(1) " TEAM ID 가 K02 " 인 조건과 " 키가 170 이상 " 인 조건을 연결한 조건문
SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' AND HEIGHT >= 170;
' AND ' 로 두 조건을 연결했다.
(2) TEAM ID가 K02 또는 K07 에 소속된 선수들이어야 하고, POSITION 이 MF 이어야 한다.
키는 170 이상 180 이하여야 한다.
* 오류사항 코드
SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' OR TEAM_ID = 'K07'
AND POSITION = 'MF'
AND HEIGHT >= 170 AND HEIGHT <= 180;
위 코드는 POSITION 이 MF 가 아닌 선수들의 명단이 출력된다.
위 SQL 문장에서 괄호가 누락됨으로서 OR 논리 연산자보다 AND 논리 연산자를 먼저 실행하기 때문에 잘못되었다.
처리 우선순위 ( ) , NOT , AND , OR 의 순서대로 처리된다.
* 올바른 코드
SELECT PLAYER_NAME FROM PLAYER WHERE (TEAM_ID IN ('K02','K07'))
AND POSITION = 'MF'
AND HEIGHT BETWEEN 170 AND 180;
SQL 문장을 괄호를 사용하여 적용하면 올바른 코드이다.
「 TEAM_ID = 'K02' OR TEAM_ID = 'K07' 」 = 「 TEAM_ID IN ('K02','K07') 」
「 HEIGHT >= 170 AND HEIGHT <= 180 」 = 「 HEIGHT BETWEEN 170 AND 180 」
6. 부정 연산자
: 부정 표현을 부정 논리 연산자, 부정 SQL 연산자로 구분할 수 있다.
(예제)
(1) TEAM ID 가 K02 소속인 선수들 중에서 POSITION 이 MF 가 아니고, 키가 175 이상 185 이하 가 아닌 선수 조건문
SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = 'K02' AND NOT POSITION = 'MF'
AND NOT HEIGHT BETWEEN 175 AND 185;
(2) NATION 칼럼에 별도 데이터를 입력하지 않음.
이 칼럼이 NULL 이 아닌 조건문.
SELECT PLAYER_NAME, NATION FROM PLAYER WHERE NATION IS NOT NULL;
7. ROWNUM, TOP 사용
▷ ROWNUM
: Oracle 의 ROWNUM.
칼럼과 비슷한 성격의 Pseudo Column 으로써 SQL 처리 결과 집합의 각행에 대해 임시로 부여되는 일련번호이다.
테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.
# WHERE 절
WHERE ROWNUM = 1;
WHERE ROWNUM <= 1;
WHERE ROWNUM <2;
두 건 이상의 N 행을 가져올 때, ROWNUM = N; 처럼 사용할 수 없다.
WHERE ROWNUM <= N; 으로 사용한다.
추가적인 ROWNUM 의 용도로,
테이블 내의 고유한 키나 인덱스 값을 만들 수 있다.
UPDATE MY_TABLE SET COLUMN1 = ROWNUM;
▷ TOP 절
: SQL Server 의 TOP 절.
TOP 절을 사용하여 결과 집합으로 출력되는 행의 수를 제한한다.
* TOP 절의 표현식
TOP (Expression) [PERCENT] [WITH TIES]
- Expression : 반환할 행의 수를 지정하는 숫자.
- PERCENT : 쿼리 결과 집합에서 처음 Expression% 의 행만 반환됨을 나타냄.
- WITH TIES : ORDER BY 절이 지정된 경우에만 사용.
TOP N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정함.
(예시)
// 한 건의 행만 가져옴
SELECT TOP(1) PLAYER_NAME FROM PLAYER;
// 두 건 이상의 N 행을 가져옴
SELECT TOP(N) PLAYER_NAME FROM PLAYER;
SQL 문장에서 ORDER BY 절이 사용되지 않으면,
Oracle 의 ROWNUM 과 SQL Server 의 TOP 절은 같은 기능을 한다.
ORDER BY 절이 사용되면, 기능의 차이가 발생한다.
'SQL > SQLD 2과목' 카테고리의 다른 글
SQLD - 과목2. (7) GROUP BY, HAVING 절 (0) | 2021.03.18 |
---|---|
SQLD - 과목2. (6) 함수 (FUNCTION) (0) | 2021.03.16 |
SQLD - 과목2. (4) TCL (0) | 2021.03.08 |
SQLD - 과목2. (3) DML (0) | 2021.03.05 |
SQLD - 과목2. (2) DDL (0) | 2021.03.03 |
- Total
- Today
- Yesterday
- python별찍기
- SQLD
- SQLD 1과목
- 데이터베이스
- 파이썬sum
- SQLD1과목
- f-string
- 백준 별찍기
- SUM함수
- 백준파이썬
- SQLD40회
- 백준별찍기
- 데이터 모델링
- 40회 SQLD
- SQLD 2과목
- 파이썬for문
- Python
- 알고리즘
- NaverCloudPlatform
- 네이버클라우드플랫폼
- 파이썬 입출력
- 파이썬
- 별 찍기
- range함수
- 파이썬문법
- python문법
- Unity GameObject 생성
- BAEKJOON
- 파이썬입출력
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |