* WHERE절 개요
- 사용자들은 자신이 원하는 자료만 검색하기 위해 WHERE절 이용
- WHERE 절에는 두 개 이상의 테이블에 대한 조인 조건이나 결과를 제한하기 위한 조건 기술
- WHERE절에 조건이 없는 FTS(full table scan) 문장은 SQL 튜닝의 1차적 검토 대상이 됨
- SQL server, Sybase 문장은 SELECT 목록에 상수, 변수 및 산술식만 포함되는 경우 FROM 필요없음
- 테이블 컬럼이 사용된 경우 FROM 절 필요, WHERE 절은 조회하려는 데이터에 특정 조건 부여 목적
SELECT [DISTINCT/ALL] 칼럼명 [ALIAS명] FROM 테이블명 WHERE 조건식;
* 연산자 종류
* 비교연산자
소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들이어야 하고,
포지션이 미드필더(MF:Midfielder)이어야 한다. 키는 170 센티미터 이상이고 180 이하여야 한다.
1) 소속팀코드 = 삼성블루윙즈팀 코드(K02)
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = K02;
WHERE TEAM_ID = K02 * 3행에 오류: ERROR: 열명이 부적합하다.
- TEAM_ID의 데이터 타입은 CHAR(3)이라서 따옴표 필요
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02' ;
2) 소속팀코드 = 전남드래곤즈팀 코드(K07)
3) 포지션 = 미드필더 코드(MF)
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = 'MF';
4) 키 >= 170 센티미터 5) 키 <= 180 센티미터
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE HEIGHT >= 170 AND HEIGHT <=180;
* SQL 연산자
1) 소속팀코드 IN (삼성블루윙즈 코드(K02), 전남드래곤즈 코드(K07))
2) 포지션 LIKE 미드필더(MF)
3) 키 BETWEEN 170 센티미터 AND 180 센티미터
- IN 연산자
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02','K07');
[예제] 사원 테이블에서 JOB이 MANAGER이면서 20번 부서에 속하거나,
JOB이 CLERK이면서 30번 부서에 속하는 사원의 정보를 IN 연산자의 다중 리스트를 이용해 출력하라.
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE (JOB, DEPTNO) IN (('MANAGER',20),('CLERK',30));
[실행 결과]
ENAME JOB DEPTNO
------ -------- ------
JONES MANAGER 20
JAMES CLERK 30
2개의 행이 선택되었다.
SELECT ENAME, JOB, DEPTNO
FROM EMP
WHERE JOB IN ('MANAGER','CLERK') AND DEPTNO IN (20,30);
[실행 결과]
ENAME JOB DEPTNO
------ ------- ------
SMITH CLERK 20
JONES MANAGER 20
BLAKE MANAGER 30
ADAMS CLERK 20
JAMES CLERK 30
5개의 행이 선택되었다.
- LIKE 연산자
[예제] 요구 사항의 두 번째 조건에 대해서 LIKE 연산자를 WHERE 절에 적용해서 실행한다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION LIKE 'MF';
[예제] “장”씨 성을 가진 선수들의 정보를 조회하는 WHERE 절을 작성한다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE PLAYER_NAME LIKE '장%';
- BETWEEN a AND b 연산자
[예제] 세 번째로 키가 170 센티미터 이상 180센티미터 이하인 선수들의 정보를
BETWEEN a AND b 연산자를 사용하여 WHERE 절을 완성한다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE HEIGHT BETWEEN 170 AND 180;
BETWEEN a AND b는 범위에서 'a'와 'b'의 값을 포함하는 범위를 말하는 것이다.
- IS NULL 연산자
비교 연산자를 통해서 비교할 수도 없고, 만일 비교 연산을 하게 되면 결과는 거짓(FALSE)을 리턴
NULL 값의 비교 연산은 IS NULL, IS NOT NULL 이라는 정해진 문구를 사용해야 제대로 된 결과를 얻을 수 있음
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE POSITION = NULL;
선택된 레코드가 없다.
WHERE 절 조건이 FALSE 가 돼서 WHERE 절 만족하는 데이터를 얻지 못함
[예제] POSITION 칼럼(Column) 값이 NULL 값인지를 판단하기 위해서는 IS NULL을 사용
SELECT PLAYER_NAME 선수이름, POSITION 포지션, TEAM_ID
FROM PLAYER
WHERE POSITION IS NULL;
* 논리연산자
1) 소속팀이 삼성블루윙즈 OR 소속팀이 전남드래곤즈
2) AND 포지션이 미드필더
3) AND 키는 170 센티미터 이상 4) AND 키는 180 센티미터 이하
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;
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;
IN과 BETWEEN 사용
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02','K07') AND POSITION = 'MF' AND HEIGHT BETWEEN 170 AND 180 ;
* 부정연산자
[예제] 삼성블루윙즈 소속인 선수들 중에서 포지션이 미드필더(MF:Midfielder)가 아니고,
키가 175 센티미터 이상 185 센티미터 이하가 아닌 선수들의 자료를 찾아본다.
SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02' AND NOT POSITION = 'MF' AND NOT HEIGHT BETWEEN 175 AND 185;
[예제] 국적(NATION) 칼럼의 경우 내국인들은 별도 데이터를 입력하지 않았다.
국적 칼럼이 NULL이 아닌 선수와 국적을 표시하라.
SELECT PLAYER_NAME 선수이름, NATION 국적
FROM PLAYER
WHERE NATION IS NOT NULL;
* ROWNUM
- 수도컬럼으로써 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련 번호
- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WEHRE에서 행의 개수를 제한하는 목적으로 사용
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM < 2;
- 두 건 이상의 N 행을 가져오고 싶을 때
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;
- 추가적으로 테이블 내의 고유한 키나 인덱스 값을 만들 수 있음
UPDATE MY_TABLE SET COLUMN1 = ROWNUM;
* TOP 절
- SQL server는 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;
- ORDER BY절이 사용되지 않으면 오라클의 ROWNUM과 SQLserver의 TOP절은 같은 기능을 함
- ORDER BY절이 사용되면 기능의 차이가 발생함
'SQLD' 카테고리의 다른 글
[SQLD : Ⅲ. SQL 기본] 7. GROUP BY, HAVING 절 (0) | 2020.08.17 |
---|---|
[SQLD : Ⅲ. SQL 기본] 6. 함수 FUNCTION (0) | 2020.08.17 |
[SQLD : Ⅲ. SQL 기본] 4. TCL (0) | 2020.08.16 |
[SQLD : Ⅲ. SQL 기본] 3. DML (0) | 2020.08.16 |
[SQLD : Ⅲ. SQL 기본] 2. DDL (0) | 2020.08.16 |