반응형
Notice
Recent Posts
Recent Comments
Link
지구정복
[SQLD] 16. WHERE절 본문
728x90
반응형
1. WHERE 조건절 개요
- 테이블에 있는 모든 자료가 아닌 원하는 자료만을 검색하기 위해 사용
- 두개 이상의 테이블에 대한 조인조건이나 결과를 제한하기 위한 조건 기술 가능
- WHERE 조건절 없이 모든 자료를 검색하게 되면 FULL TABLE SCAN이 발새하게 되어 CPU, MEMORY, 네트워크를 과다하게 사용한다.
- 구문
- 조건식: 컬럼명(조건식의 좌측), 비교 연산자, 문자,숫자,표현식(조건식의 우측)/비교 컬럼명(조인시)
- 조건식: 컬럼명(조건식의 좌측), 비교 연산자, 문자,숫자,표현식(조건식의 우측)/비교 컬럼명(조인시)
2. 연산자의 종류
- 연산자의 종류
- 연산자의 우선순위
- 우선순위를 놓쳐 실수하지 않기 위해 괄호 사용을 권고한다.
3. 비교 연산자
- 예제
- TEAM ID라는 팀명의 데이터 타입은 CHAR(3) 인데 비교 연산자 오른쪽에 K02의 값을 작은따옴표(' ')나 큰따옴표(" ")와 같은 인용 부호로 묶어서 처리하지 않았기 때문에 발생하는 에러
- NUMERIC과 같은 숫자형 형태의 값은 인용부호를 사용하지 않는다.
- 문자 유형간의 비교 조건이 발생하는 경우
- 예제
- WHERE HEIGHT )= 170 조건을 WHERE HEIGHT ) = '170' 이라고 표현하더라도,HEIGHT라는 칼럼이 숫자 유형의 변수이므로 내부적으로 ' 170'이라는 문자열을 숫자 유형 170으로 바꾸어 처리
- 예제
4. SQL 연산자
- SQL 문장에서 사용하도록 기본적으로 예약되어 있는 연산자로서 모든 데이터 타입에 대해서 연산이 가능한 4 가지 종류가 있다.
가. IN (list) 연산자
- 예제1
- 예제2
- 다중 리스트를 이용한 IN 연산자는 SQL 문장을 짧게 만들어 주면서도 성능측면에서도 장점을 가질 수 있는 매우 유용한 연산자이므로 적극적인 사용을 권고
- 아래와는 다른 결과를 가지는 것 유의
나. LIKE 연산자
- 와일드카드(한 개 혹은 0개 이상의 문자를 대신해서 사용하기 위한 특수문자)를 활용
- 예제
다. BETWEEN a AND b 연산자
- 예제
라. IS NULL 연산자
- NULL(ASCII 00)은 값이 존재하지 않는 것으로 확정되지 않은 값을 표현할 때 사용한다.
- 어떤 값보다 크거나 작지도 않고 ' '(공백, ASCII 32) 이나 O(Zero, ASCII 48)과 달리 비교 자체가 불가능한 값이다.
- NULL 값과의 수치 연산은 NULL 값을 리턴한다
- NULL 값과의 비교연산은 거짓(FALSE)을 리턴한다.
- NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 정해진 문구를 사용해야 제대로 된 결과를 얻을 수 있다.
- 예제
- 문법 에러는 나지 않지만 WHERE 절의 조건이 거짓(FALSE) 이 되어 WHERE 절의 조건을 만족하는 데이터 를 한건도 얻지 못하게 된 것으로 의 미 없는 SQL이 된다.
- 문법 에러는 나지 않지만 WHERE 절의 조건이 거짓(FALSE) 이 되어 WHERE 절의 조건을 만족하는 데이터 를 한건도 얻지 못하게 된 것으로 의 미 없는 SQL이 된다.
5. 논리 연산자
- 비교 연산자나 SQL 비교 연산자들로 이루어진 여러 개의 조건들을논리적으로 연결시키기 위해서 사용되는 연산자
- 논리 연산자의 종류
- 예제
소속팀이 삼성블루원즈이거나 전남드래곤즈에 소속된 선수들이어야 하고
포지션이 미드필더 (MF:Midfielder) 이어야 한다.
키는 170 센티미터 이상이고 180 이하여야 한다.
- 포지션이 미드필더가 아닌 선수들이 출력된 것은 논리 연산자의 우선 순위 때문이다.(OR 논리 연산자보다 AND 논리 연산자를 먼저 실행)
- 괄호를 사용해 우선 순위를 올바르게 수정한다.
- SQL 비교 연산자인 ' IN'과 논리 연산자인 ' OR'은 결과도 같고 내부적으로 처리하는 방법도 같다
6. 부정 연산자
- 부정 연산자 종류
- 예제
삼성블루왕즈 소속인 선수들 중에서 포지션이 미드필더 (MF: Midfielder) 가 아니고, 키가 175 센티미터
이상 185 센티미터 이하가 아닌 선수들의 자료를 찾아본다.- 쿼리1
- 쿼리2
- 쿼리1
7. ROWNUM, TOP 사용
가. ROWNUM(오라클)
- 컬럼과 비슷한 성격의 Pseudo Column으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호
- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;
나. TOP 절(SQL Server)
- 결과 집합으로 출력되는 행의 수를 제한
- SELECT TOP(l) PLAYER_NAME FROM PLAYER;
- SELECT TOP(N) PLAYER NAME FROM PLAYER;
- 표현식
- Expression 반환할 행의 수를 지정하는 숫자이다.
- PERCENT 쿼리 결과 집합에서 처음 Expression%의 행만 반환됨 을 나타낸다.
- WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며. TOP N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.
- SQL 문장에서 ORDER BY 절이 사용되지 않으면 Oracle의 ROWNUM과 SQL Server의 TOP 절은 같은 기능을 하지만. ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다.
정리
--IN : 리스트에 있는 값 중에서 어느 하라나라도 일치하면 된다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02', 'K07');
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN ( ('MANAGER', 20), ('CLERK', 30) );
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER', 'CLECK') AND DEPTNO IN (20, 30);
--LIKE : 와일드카드(%)를 사용해서 0 개 이상의 어떤 문자를 의미
-- _ : 1개인 단일 문자를 의미
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE PLAYER_NAME LIKE '장__';
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';
--BETWEEN A AND B : A와 B의 값을 포함하는 범위를 의미
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180
ORDER BY HEIGHT ASC;
--IS NULL 또는 IS NOT NULL : 널이거나 널이지 않은 값을 찾아냄
SELECT PLAYER_NAME, POSITION
FROM PLAYER
WHERE POSITION IS NULL;
SELECT PLAYER_NAME, POSITION
FROM PLAYER
WHERE POSITION IS NOT NULL;
----논리연산자
--AND과 OR : 연산 순서는 AND 다음 OR이므로 아래 TEAM_ID에 괄호를 안치면 다른 포지션 선수들까지 출력된다.
SELECT PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07')
AND POSITION = 'MF'
AND HEIGHT BETWEEN 170 AND 180
ORDER BY HEIGHT ASC;
----부정연산자
--NOT 컬럼명 = : ~와 같지않다.
--NOT 컬럼명 > : ~보다 크지 않다.
--!= / <> / ^= : 같지 않다.
--NOT BETWEEN A AND B : A와 B 값 사이에 있지 않다.
--NOT IN (list) : list 값과 일치하지 않는다.
SELECT PLAYER_NAME, TEAM_ID, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'K02'
AND NOT POSITION = 'MF'
AND NOT HEIGHT BETWEEN 175 AND 185;
----ROWNUM사용
--ROWNUM : 테이블에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE절에서 행의
--개수를 제한하는 목적으로 사용
SELECT PLAYER_NAME
FROM PLAYER
WHERE ROWNUM = 1;
SELECT PLAYER_NAME
FROM PLAYER
WHERE ROWNUM <= 5;
[출처]
wiki.gurubee.net/pages/viewpage.action?pageId=27427434
728x90
반응형
'자격증 정복 > SQLD' 카테고리의 다른 글
[SQLD] 18. GROUP BY, HAVING 절 (0) | 2020.11.10 |
---|---|
[SQLD] 17. 함수 (Function) (0) | 2020.11.10 |
[SQLD] 15. TCL (Transaction Control Language) (0) | 2020.11.09 |
[SQLD] 14. DML (Data Manipulation Language) (0) | 2020.11.09 |
[SQLD] 13. DDL (Data Defintion Language) (0) | 2020.11.09 |
Comments