- 이 글은 도서 '초보자를 위한 SQL 200제'라는 책을 바탕으로 작성되었습니다.
- 들어가기에 앞서 SQL의 종류에 대한 글을 선행하고 오시는 걸 추천드립니다
- 비교 연산자에 대한 설명은 다음 글을 참고하시는 걸 추천드립니다 - 007 WHERE절 배우기
010 비교연산자 배우기 (>, <, >=, <=, =, !=, <>, ^=)
Q. 월급이 1200 이하인 사원들의 이름과 월급, 직업, 부서번호를 출력하라
1-2 EMP테이블로 부터 이름과 월급, 직업, 부서 번호 컬럼을 선택한다
3 월급이 1200 이하인 사원들의 데이터로만 행을 제한한다.
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE SAL <= 1200;
Q. 직업이 SALESMAN이 아닌 사원들의 이름과 부서 번호, 직업을 출력하라
1-2 EMP 테이블로부터 이름과 월급, 직업 컬럼을 선택한다.
3 직업이 SALESMAN이 아닌 사원들의 데이터로만 행을 제안한다.
※부등호를 나타내는 연산자: <>, ^=, != 모두 가능하다.
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE JOB != 'SALESMAN';
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE JOB ^= 'SALESMAN';
SELECT ENAME, DEPTNO, JOB
FROM EMP
WHERE JOB <> 'SALESMAN';
011 비교연산자 배우기 (BETWEEN AND)
두 값 사이의 값들을 검색할 때 BETWEEN AND 연산자를 사용하여 검색합니다. BETWEEN AND 사용 시 주의사항은 "BETWEEN 하한값 AND 상한 값" 순서로 작성해야 검색이 가능합니다. "BETWEEN 상한 값 AND 하한 값"으로 검색할 경우 올바르게 검색되지 않습니다.
Q. 월급이 1000에서 3000사이인 사원들의 이름과 월급을 출력하라
SELECT ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1000 AND 3000;
위 코드는 아래와 같이 논리연산자를 이용하여 쓸 수 있습니다
SELECT ENAME, SAL
FRO EMP
WHERE (SAL >= 1000 AND SAL <= 3000);
Q. 월급이 1000에서 3000사이가 아닌 사원들의 이름과 월급을 출력하라
SELECT ENAME, SAL
FROM EMP
WHERE SAL NOT BETWEEN 1000 AND 3000;
위 코드는 아래와 같이 논리연산자를 이용하여 쓸 수 있습니다
SELECT ENAME, SAL
FROM EMP
WHERE (SAL < 1000 OR SAL > 3000);
논리 연산자로 같은 정보를 검색할 수 있지만 BETWEEN AND 연산자를 사용하는 것이 훨씬 가동성이 있고 코드가 심플한 것을 확인할 수 있습니다.
Q. 1982년도에 입사한 사원들의 이름과 입사일을 출력하라
SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE '1982/01/01' AND '1982/12/31';
012 비교연산자 배우기 (LIKE)
'%'는 와일드 카드(Wild Card)로, 이 자리에 어떤 철자가 와도 상관없고, 철자의 개수가 몇 개가 되는 관계없다는 뜻입니다. 예를 들어 첫 철자가 E로 시작하면 WHERE ENAME LIKE 'E%'로 작성함으로써 두 번째 철자가 % 인 데이터를 검색하겠다는 의미가 됩니다.
Q. 이름의 첫 글자가 S로 시작하는 사원들의 이름과 월급을 출력하라
SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE 'S%';
Q. 이름의 끝 글자가 T로 끝나는 사원들의 이름과 월급을 출력하라
SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '%T';
LIKE와 쓰이는 기호로 와일드카드(%) 뿐만 아니라 언더바(_) 또한 같이 사용됩니다. 와일드 카드(%)는 와일드카드가 있는 자리에 어떠한 철자가 와도 관계없고, 그 철자의 개수가 몇 개이든 관계가 없었지만 언더바(_)는 어떠한 철자가 와도 상관없지만 자릿수는 한 자리여야 된다는 의미입니다. 만약 첫 번째, 또는 마지막 철자가 아닌 세 번째 철자가 S인 사원의 이름을 검색한다면 WHERE ENAME LIKE '__S%'로 자리의 위치는 언더바(_)로 표시합니다
Q. 이름의 두 번째 철자가 M인 사원의 이름과 월급을 출력하라;
SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '_M%';
Q. 이름에 A를 포함하고 있는 사원들의 이름을 출력하라
이름에 A를 포함한다는 것은 A 앞뒤로 어떤 철자가 오는지, 몇 개가 오는지 명시되어있지 않기 때문에 와일드카드(%)를 양쪽에 기술하게 되면 이름이 A가 포함된 사원들을 전부 검색할 수 있습니다.
SELECT ENAME, SAL
FROM EMP
WHERE ENAME LIKE '%A%';
013 비교연산자 배우기 (IS NULL)
NULL 값은 데이터가 할당되지 않은 상태 또는 알 수 없는 값이라고도 합니다. 알 수 없는 값이기 때문에 비교 연산자 또는 이퀄 연산자(=)로는 비교할 수 없습니다. NULL값을 검색하기 위해서는 IS NULL 연산자를 사용하고, NULL이 아닌지를 검색할 때는 NOT연산을 이용합니다. 이 부분은 뒤에서 더 자세히 다뤄보겠습니다.
Q. 커미션이 NULL인 사원들의 이름과 커미션을 출력하라
SELECT ENAME, COMM
FROM EMP
WEHRE COMM IS NULL;
014 비교연산자 배우기 (IN)
하나의 값이 아닌 여러개의 값을 검색할때 이퀄 연산자(=)와 논리 연산자를 이용해 검색할 수도 있지만 좀더 간단하게 IN연산자로 여러 리스트의 값을 조회할 수 있습니다.
SELECT 컬럼1, 컬럼2
FROM 테이블 명
WHERE 컬럼1 IN (값1, 값2, 값3);
SELECT 컬럼1, 컬럼2
FROM 테이블 명
WHERE (컬럼1 = 값1 OR 컬럼1 = 값2 OR 컬럼1 = 값3);
Q. 직업이 SALESMAN, ANALYST, MANAGER인 사원들의 이름, 월급, 직업을 출력하라
SELECT ENAME, SAL, JOB
FROM EMP
WHERE JOB IN (SALESMAN, ANALYST, MANAGER);
SELECT ENAME, SAL, JOB
FROM EMP
WHERE (JOB = 'SALESMAN' OR JOB = 'ANALYST' OR JOB = MANAGER);
Q. 직업이 SALESMAN, ANALYST, MANAGER가 아닌 사원들의 이름, 월급, 직업을 출력하라
SELECT ENAME, SAL, JOB
FROM EMP
WHERE JOB NOT IN (SALESMAN, ANALYST, MANAGER);
SELECT ENAME, SAL, JOB
FROM EMP
WHERE (JOB != 'SALESMAN' AND JOB != 'ANALYST', JOB != 'MANAGER' );
015 논리연산자 배우기 (AND, OR, NOT )
AND 연산자 진리 연산표
AND | TRUE | FALSE | NULL |
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
AND 연산자에서 TRUE AND TRUE는 결과가 TRUE이고, TRUE AND FALSE는 결과가 FALSE입니다. AND 연산은 둘다 TRUE 여야 TRUE가 반환됩니다. 여기서 NULL은 알 수 없는 값이기 때문에 TRUE인지 FALSE인지 알 수 없습니다. 따라서 FALSE AND NULL을 제외하고 결과가 NULL값이 되는 조건이 있는 WHERE문의 결과는 NULL을 반환합니다.
OR 연산자 진리 연산표
OR | TRUE | FALSE | NULL |
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
반면 OR 연산자는 AND 연산자와 다르게 둘 중에 하나만 TRUE 여도 TRUE입니다.
NOT 연산자 진리 연산표
NOT | TRUE | FALSE | NULL |
TRUE | FALSE | TRUE | NULL |
Q. 직업이 SALESMAN이고 월급이 1200 이상인 사원들의 이름, 월급, 직업을 출력하라
SELECT EANE, SAL, JOB
FROM EMP
WHERE (JOB = 'SALESMAN' AND SAL >= 1200);