본문 바로가기

SQLD

[SQLD : Ⅲ. SQL 기본] 5. WHERE절

* 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