Darren's Devlog

[불친절한SQL] 기초쿼리, WHERE절 - 1 본문

SQL

[불친절한SQL] 기초쿼리, WHERE절 - 1

Darren Gwon 2022. 12. 4. 18:17
반응형

● WHERE절

WHERE절을 사용하면 특정 행만 선택하여 조회할 수 있다.

WHERE절은 FROM절 다음에 기술하며, FROM절 이후에 수행된다.

SELECT 절 -- (3)
  FROM 절 -- (1)
 WHERE 절 -- (2)

 

WHERE절의 구문은 아래와 같다. 조건(condition은) 행마다 평가되며,

TRUE, FALSE, UNKNOWN 중 하나의 값을 반환한다.

 

SELECT 문은 WHERE절의 평가 결과가 TRUE인 행만 반환한다.

WHERE condition

비교 조건, 논리 조건, IN 조건, BETWEEN 조건, LIKE 조건, NULL 조건을 차례대로 살펴보자.

 

 

비교 조건

비교 조건으로 표현식을 비교할 수 있다. 아래와 같은 비교 조건을 사용할 수 있다.

비교 조건 설명 비교 조건 설명
= 같음 <>, !=, ^=  다름
> < 작음
>= 크거나 같음 <= 작거나 같음
ANY, SOME 목록 일부를 비교 ALL 목록 전체를 비교

 

아래 쿼리는 job이 ANALYST인 행을 조회한다.

SELECT ename, job FROM emp WHERE job = 'ANALYST';

 

아래 쿼리는 sal가 2500보다 큰 행을 조회한다.

SELECT ename, sal FROM emp WHERE sal > 2500;

 

아래 쿼리는 hiredate가 1981년 이전인 행을 조회한다.

SELECT ename, hiredate FROM emp WHERE HIREDATE < DATE '1981-01-01';

 

NULL은 비교 조건에서 UNKNOWN으로 평가된다.

SELECT ename, comm FROM emp WHERE comm = NULL;
-- 선택된 레코드가 없습니다.

 

아래 쿼리는 comm이 0이 아닌 행을 조회한다.

NULL <> 0 조건UNKNOWN으로 평가되기 때문에 comm이 NULL인 행이 반환되지 않는다.

SELECT ename, comm FROM emp WHERE comm <> 0;

 

ANY 조건은 목록의 일부를 비교하여 조건을 만족하는 행을 반환한다.

목록을 일부 만족하면 행이 반환된다.

아래 쿼리는 sal > 1000 조건과 동일한 결과를 반환한다.

 

위 쿼리는 아래 쿼리와 논리적으로 동일하다.

LEAST 함수를 사용하는 편이 명시적이다.

SELECT ename, sal FROM emp WHERE sal > ANY(1000, 2500);
SELECT ename, sal FROM emp WHERE sal > LEAST(1000, 2500);

 

ALL 조건은 목록의 전체를 비교하여 조건을 만족하는 행을 반환한다.

목록을 모두 만족해야 행이 반환된다.

SELECT ename, sal FROM emp WHERE sal > ALL(1000, 2500);
SELECT ename, sal FROM emp WHERE sal > GREATEST(1000, 2500);

 

비교 조건은 데이터 타입이 동일한 값을 비교해야 한다.

데이터 타입이 다르면 암시적 데이터 변환이 발생한다.

 

논리 조건

조건을 결합하거나 부정할 수 있다.

AND 조건, OR 조건, NOT 조건을 사용할 수 있다.

 

deptno가 30이고 job이 CLERK인 행을 조회한다.

SELECT ename, deptno, job FROM emp WHERE deptno = 30 AND job = 'CLERK';

 

deptno가 30이거나 job이 CLERK인 행을 조회한다.

SELECT ename, deptno, job FROM emp WHERE deptno = 30 OR job = 'CLERK';

 

아래 쿼리는 deptno가 30이거나 job이 CLERK인 행이 아닌 행을 조회한다.

SELECT ename, deptno, job FROM emp WHERE not (deptno = 30 OR job = 'CLERK');
SELECT ename, deptno, job FROM emp WHERE deptno <> 30 AND job <> 'CLERK';

 

BETWEEN 조건

expr1이 expr2와 expr3의 범위에 해당하는 행을 반환한다.

BETWEEN 조건을 범위 조건으로 부르기도 않다.

 

expr [NOT] BETWEEN expr2 AND expr3

 

아래 쿼리는 sal가 2500 이상, 3000 이하인 행을 조회한다.

2500 ~ 3000 사이의  값

SELECT ename, sal FROM emp WHERE sal BETWEEN 2500 AND 3000;
SELECT ename, sal FROM emp WHERE sal >= 2500 AND sal <= 3000;

 

아래 쿼리는 sal가 2500 이상, 3000이하가 아닌 행을 조회한다.

~ 2499, 3001~ 에 해당하는 값

SELECT ename, sal FROM emp WHERE sal NOT BETWEEN 2500 AND 3000;

위 쿼리는 아래와 같이 해석된다.

순서 쿼리
1 SELECT ename, sal FROM emp WHERE NOT (sal BETWEEN 2500 AND 3000);
2 SELECT ename, sal FROM emp WHERE sal NOT (sal >= 2500 AND sal <= 3000);
3 SELECT ename, sal FROM emp WHERE (sal < 2500 OR sal > 3000);

 

 

아래의 방식으로도 사용할 수 있다.

위 쿼리는 아래 쿼리로 해석된다.

SELECT * FROM salgrade WHERE 1500 BETWEEN losal AND hisal;
SELECT * FROM salgrade WHERE losal <= 1500 AND hisal >= 1500;

 

IN 조건

expr1이 expr2의 목록에 포함되는 행을 반환한다.

expr1 [NOT] IN (expr2 [, expr2])

 

SELECT ename, job FROM emp WHERE job IN('ANALYST', 'MANAGER');
SELECT ename, job FROM emp WHERE (job = 'ANALYST' OR job = 'MANAGER');

 

IN 조건은 다중 열(multiple column)을 사용할 수 있다.

아래 쿼리는 deptno가 10이고 job이 MANAGER인 행이나,

deptno가 20이고 job이 ANALYST인 행을 조회한다.

SELECT ename, deptno, job FROM emp WHERE (deptno, job) IN((10, 'MANAGER'), (20, 'ANALYST'));

 

아래 쿼리는 job이 아닌 ANALYST와 MANAGER가 아닌 행을 조회한다.

SELECT ename, job FROM emp WHERE job NOT IN('ANALYST', 'MANAGER');

 

위 쿼리는 아래 쿼리로 해석된다. NOT IN 조건은 AND 조건으로 평가된다.

순서 쿼리
1 SELECT ename, job FROM emp WHERE NOT (job IN ('ANALYST', 'MANAGER'));
2 SELECT ename, sal FROM emp WHERE NOT (job = 'ANALYST' OR job = 'MANAGER');
3 SELECT ename, sal FROM emp WHERE (job <> 'ANALYST' AND job <> 'MANAGER');

NOT IN 조건은 expr에 NULL이 입력되면 결과가 반환되지 않는다.

SELECT ename, mgr FROM emp WHERE mgr NOT IN(7839, NULL);
--선택된 레코드가 없습니다.

 

위 쿼리는 아래 쿼리로 해석된다. mgr <> NULL 조건은 UNKNOWN으로 평가되고,

AND 조건은 조건이 하나라도 UNKNOWN이므로 결과가 반환되지 않는다.

순서 쿼리
1 SELECT ename, job FROM emp WHERE NOT (job IN ('ANALYST', 'MANAGER'));
2 SELECT ename, sal FROM emp WHERE NOT (job = 'ANALYST' OR job = 'MANAGER');
3 SELECT ename, sal FROM emp WHERE (job <> 'ANALYST' AND job <> 'MANAGER');

 

IN 조건은 NULL이 입력되어도 결과가 반환된다.

SELECT ename, mgr FROM emp WHERE mgr IN(7839, NULL);

 

아래 쿼리로 해석된다. mgr = NULL 조건은 UNKNOWN으로 평가되고,

OR조건은 조건이 하나라도 TRUE이면 TRUE이므로 mgr = NULL 조건이 무시된다.

SELECT ename, mgr FROM emp WHERE mgr = 7839 OR mgr = NULL;

 

다음과 같은 방식으로도 사용할 수 있다. empno나 mgr가 7839인 행을 조회한다.

SELECT ename, empno, mgr FROM emp WHERE 7839 IN (empno, mgr);

 

아래 쿼리로 해석된다. 구문이 다소 길어지더라도

아래와 같이 가독성 높은 쿼리를 작성하는 편이 바람직하다.

SELECT ename, empno, mgr FROM emp WHERE (empno = 7839 OR mgr = 7839)

 

반응형
Comments