[SQLD] 2과목 SQL 기본및 활용 - 1장 5절 WHERE


1. WHERE 조건절 개요

- 사용자들은 자신이 원하는 자료만을 검색하기 위해서 SQL문장에 WHERE 절을 이용하여 자료들에 대하여 제한할 수 있다.

- WHERE절에는 두 개 이상의 테이블에 대한 조인 조건을 기술하거나 결과를 제한하기위한 조건을 기술할 수도 있다.

- WHERE절에 조건이 없는 경우 FULL TABLE SCAN이 발생하므로 SQL튜닝의 1차적인 검토대상이 된다.


2. 연산자의 종류


 구분

연산자 

의미 

비교연산자

 = 

같다 

 >

크다 

 > =

크거나 같다

 < = 

작거나 같다 

 SQL 연산자

BETWEEN a AND b

a보다 크거나 같고 b보다 작거나 같다  

IN( list)

list에 있는 값 중에서 어느 하나라도 일치하면 된다. 

LIKE '비교문자열'

비교문자열과 형태가 일치하면 된다.

(%, _) 사용 

IS NULL

NULL 값인 경우 

AND

앞에 있는 조건과 뒤에 오는 조건이 참이되면 결과도 참이된다. 

(둘다 참) 

 OR

앞의 조건이 참이거나 뒤의조건이 참이 되어야 결과도 참이된다 

(둘 중 하나 이상 참)

NOT 

뒤에 오는 조건에 반대되는 결과를 되돌려준다. 

 부정비교연산자

! = 

같지 않다.

^ = 

같지 않다. 

 < >

같지않다. 

 NOT 칼럼명 = 

 ~ 와 같지않다. 

 NOT 칼럼명 > 

 ~ 보다 크지 않다 

 부정 SQL 연산자

NOT BEETWEEN a AND b 

a 보다 크거나 같지않으며 b보다 작거나 같지않다. 

 NOT IN (list)

list 값과 일치하지 않는다. 

 IS NOT NULL

NULL 값을 갖지 않는다. 



* 연산자 우선순위 (처리순서)

1) 괄호를 묶은 연산이 가장 먼저 처리된다.

2) 연산자들 중에는 부정 연산자가 먼저 처리되고

3) 비교연산자( =, > ,>=, <, <=), SQL 비교연산자 (BETWEEN a AND b, IN (list), LIKE, IS NULL) 처리되고

4) 논리연산자 중에는 AND, OR 순으로 처리된다.


Q. K 리그 일부 선수들의 이름과 포지션, 백넘버를 알고싶다.

조건은 소속팀이 삼성블루윙즈이거나 전남드래곤즈에 소속된 선수들 중에 포지션이 미드필드이면서 키는 170이상 180 이하여야한다.


A.

SELECT PLAYER_NAME, POSITION, BACKNO

FROM PLAYER

WHERE (TEAMNAME ='삼성블루윙즈' 

        OR TEAMNAME='전남드래곤즈')

      AND POSITION = 'MF'

      AND HEIGHT 170 BETWEEN 180 ;


3. 비교연산자.

* 문자 유형 비교 방법

 구분

비교방법 

 비교연산자의 양쪽이 모두 CHAR 유형인 경우

길이가 서로 다른 CHAR형 타입이면 작은 쪽에 SPACE를 추가하여 길이를 같게한 후 비교한다. 

서로 다른 문자가 나올 때까지 비교한다.

달라진 첫 번째 문자의 값에 따라 크기를 결정한다.

BLANK의 수만 다르다면 서로 같은 값으로 결정한다.

 비교 연산자의 어느 한쪽이 VARCHAR인 경우

서로 다른 문자가 나올 때 까지 비교한다 

길이가 다르다면 짦은 것이 끝날 때까지만 비교한 후에 길이가 긴 것이 크다고 판단한다.

길이가 같고 다른 것이 없다면 같다고 판단한다.

VARCHAR는 NOT NULL까지 길이를 말한다. 

 상수값과 비교할 경우

상수 쪽을 변수 타입과 동일하게 바꾸고 비교한다. 

변수 쪽이 CHAR 유형 타입이면 위의 CHAR 유형 타입의 경우를 적용한다.

변수 쪽이 VARCHAR 유형 타입이면 위의 VARCHAR 유형 타입의 경우를 적용한다. 

 



4. SQL 연산자

1) IN 연산자 사용

SELECT PLAYER_NAME 

FROM PLAYER

WHERE TEAM_ID IN ('K02', 'K07');


Q. 사원테이블에서 JOB이 MANAGER 이면서 20번 부서에 속하거나 JOB이 CLERK 이면서 30번 부서에 속하는 사원의 정보를 IN 연산자를 이용하여 출력하라


A1.

   SELECT * 

   FROM EMP

   WHERE (JOB,DEPTNO) IN (('MANAGER',20),('CLERK',30));

 

     EMPNO ENAME      JOB       MGR HIREDATE     SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7566 JONES      MANAGER       7839 02-APR-81   2975    20

 

      7900 JAMES      CLERK       7698 03-DEC-81     950    30


* 이렇게 조회하면 결과가 다르므로 용도에 맞춰 사용한다.

SELECT * 

FROM EMP

WHERE JOB IN ('MANAGER','CLERK')

      AND  DEPTNO IN (20,30);



EMPNO ENAME      JOB       MGR HIREDATE     SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7566 JONES      MANAGER       7839 02-APR-81   2975    20

      7698 BLAKE      MANAGER       7839 01-MAY-81   2850    30

      7876 ADAMS      CLERK       7788 23-MAY-87   1100    20

 

      7900 JAMES      CLERK       7698 03-DEC-81     950    30


2) LIKE 연산자 사용

-  LIKE 연산자에서는 와일드카드 사용이 가능하다.

 와일드카드

설명 

 %

0개 이상의 어떤 문자를 의미함 

 _

1개 인 단일 문자를 의미함. 



SCOTT@PROD>SELECT ENAME FROM EMP WHERE ENAME LIKE 'J%';

 

ENAME

----------

JONES

 

JAMES



* _ (언더바) 와일드카드 사용할 때는 길이를 정확히 맞춰야함.

SCOTT@PROD>SELECT ENAME FROM EMP WHERE ENAME LIKE 'J__';

 

no rows selected


SCOTT@PROD>SELECT ENAME FROM EMP WHERE ENAME LIKE 'J____';

 

ENAME

----------

JONES

JAMES


 


3) IS NULL연산자

* NULL값의 특성

- NULL값과 수치연산은 NULL을 리턴한다.

- NULL과 비교 연산은 FALSE를 리턴한다.

- 어떤 값과 비교할 수도 없으며 특정 값보다 크다, 적다라고 표현할 수 없다.

 * NULL값의 비교연산은 IS NULL, IS NOT NULL을 사용해야 원하는 결과를 얻을 수 있다.

 구성

SCOTT@PROD>select * from emp order by empno;

 

     EMPNO ENAME      JOB       MGR HIREDATE     SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

            1 noname

      7369 seungho    singer       7902 17-DEC-80     800    20

      7499 ALLEN      people       7698 20-FEB-81   1600        300   30

 

      7521 WARD       actor       7698 22-FEB-81   1250        500   30


* WHERE절에 = 연산자를 통한 NULL값 비교

1) ' ' 표기

SELECT * 

FROM EMP 

WHERE JOB = 'NULL';


2) 

SELECT * 

FROM EMP 

WHERE JOB = NULL;


1,2 결과 모두 원하는 결과를 출력할 수 없다.


3) IS NULL 사용

SELECT * 

FROM EMP

WHERE JOB IS NULL ;


결과

    EMPNO ENAME      JOB       MGR HIREDATE     SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

1 noname

 

* NULL인 값만 조회 가능


4) IS NOT NULL 사용

SELECT *

FROM EMP

WHERE JOB IS NOT NULL;


     EMPNO ENAME      JOB       MGR HIREDATE     SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7369 seungho    singer       7902 17-DEC-80     800    20

      7499 ALLEN      people       7698 20-FEB-81   1600        300   30

 

      7521 WARD       actor       7698 22-FEB-81   1250        500   30

*  NULL 이 아닌 값만 조회 가능.

 


4) ROWNUM, TOP 사용


- 오라클 ROWNUM 사용

SQL 처리 결과 집합과 각 행에 대해 임시로 부여되는 일련번호로 테이블이나 집합에서 원하는 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.


 한 건의 행만 가져오고 싶을 때

- SELECT * FROM EMP WHERE ROWNUM = 1;

- SELECT * FROM EMP WHERE ROWNUM <= 1;

- SELECT * FROM EMP WHERE ROWNUM < 2;


두 건 이상의 N행을 가져오고싶을 때

- SELECT * FROM EMP WHERE ROWNUM <= N;

- SELECT * FROM EMP WHERE ROWNUM < N+1;



- SQL server TOP 사용


TOP (Expression) [PERCENT] [WITH TIES]


- Expression : 반환할 행의 수를 지정하는 숫자.

- PERCENT : 쿼리 결과 집합에서 처음 Expresseion%의 행만 반환됨.

- WITH TIES : ORDER BY 절이 지정된 경우에만 사용할 수 있으며, TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.



 한 건의 행만 가져오고 싶을 때

- SELECT TOP(1) ENAME FROM EMP;


두 건 이상의 N행을 가져오고싶을 때

- SELECT TOP(N) ENAME FROM EMP; 

 


* SQL 문장에서 ORDER BY 절이 사용되지않으면 ROWNUM과 TOP절은 같은 기능을 하지만 ORDER BY 절이 사용되면 기능상 차이를 보인다.