on my way

Do it! 오라클로 배우는 DB 입문 : 05 더 정확하고 다양하게 결과를 출력하는 WHERE절과 연산자 + 실습 문제 본문

Computer Science/Database

Do it! 오라클로 배우는 DB 입문 : 05 더 정확하고 다양하게 결과를 출력하는 WHERE절과 연산자 + 실습 문제

wingbeat 2024. 4. 1. 17:24
반응형

 

05-1 필요한 데이터만 쏙 출력하는 WHERE절 

해당 조건이 만족(true)하는 행을 출력한다.

SELECT *
FROM EMP
WHERE deptno=30; --dept가 30인 데이터만 출력

 

 

05-2 여러 개 조건식을 사용하는 AND, OR 연산자 

SELECT *
FROM EMP
WHERE deptno=30 AND job='SALESMAN' ;


SELECT *
FROM EMP
WHERE deptno=30 OR job!='CLERK' ;

열을 비교하는 문자열 데이터는 반드시 대소문자 정확하게 작성해야 한다.

틀리게 작성하면 invalid identifier 에러 발생할 수 있다.

 

SELECT * FROM EMP
WHERE deptno=30 AND empno=7499;

 

SELECT * FROM EMP
WHERE deptno=20 OR job='SALESMAN';

 

WHERE절 조건식의 개수

사실상 제한이 없다.

 

실무에서의 AND, OR 연산자

실무에선 AND를 많이 사용한다.

 

 

 

05-3 연산자 종류와 활용 방법 알아보기

산술 연산자

 

비교 연산자

 

숫자가 아니라 문자열에서도 비교 연산자를 사용할 수 있다.

ENAME 열 값의 첫 문자와 대문자 F를 비교했을 때 F보다 같거나 뒤인 문자열을 출력한다.

 

 

 

등가 비교 연산자

 

 

논리 부정 연산자

not은 산술 연산자보다 키워드 연산자에서 사용하는 경우가 많다.

산술 연산자에서는 !에서 사용

 

IN 연산자

특정 열 데이터 값만을 조회하고자 할 때 사용한다.

서브쿼리(쿼리 안의 쿼리. 하위로 또 다른 SQL들어갈 때)에 많이 사용한다.

OR로도 쓸 수 있지만, IN 연산자로 조건을 여러개 지정할 수 있다.

 

BETWEEN A AND B 연산자

 

-- 회계 부서의 직원명 출력
SELECT ename FROM EMP WHERE deptno=10;

-- 급여 1000이상인 직원 이름, 급여 출력
SELECT ename, sal FROM EMP WHERE sal>=1000;

-- 급여가 500이상, 1000이하 (500~1000)인 직원명, 급여 출력
SELECT ename, sal FROM EMP WHERE sal >= 500 and sal<=1000;

-- 위와 같은 코드
SELECT ename, sal FROM EMP WHERE sal between 500 and 1000;

-- 500보다 작거나 1000보다 큰
SELECT ename, sal FROM EMP WHERE sal not between 500 and 1000;

-- 부서코드가 10, 30인 직원명, 부서코드 출력
SELECT ename, deptno FROM EMP WHERE deptno=10 OR deptno=30;
SELECT ename, deptno FROM EMP WHERE deptno in (10, 30);
-- 10, 30이 아닌 것
SELECT ename, deptno FROM EMP WHERE deptno not in (10, 30);

 

LIKE 연산자와 와일드 카드

길이와 상관없이 일부 문자열이 포함된 데이터를 조회할 때 사용하는 기능

-- Like 검색
--대문자 S로 시작하는 데이터
SELECT * FROM emp WHERE ename LIKE 'S%'; 
SELECT * FROM emp WHERE ename LIKE '%S'; -- S로 끝
SELECT * FROM emp WHERE ename LIKE '%S%'; -- S 포함

-- 두번째가 L인 사원
SELECT * FROM emp WHERE ename LIKE '_L%'; 
SELECT * FROM emp WHERE ename LIKE 'SMITH_'; 

-- 사원 이름에 AM 포함
SELECT * FROM emp WHERE ename LIKE '%AM%'; 
SELECT * FROM emp WHERE ename NOT LIKE '%AM%'; --미포함

 

와일드 카드 문자가 데이터 일부일 경우

ESCAPE 절을 사용하면 와일드카드 기호가 아닌 데이터로서의 문자로 다루는 것이 가능해짐. (자주 사용 안 함)

 

IS NULL 연산자

0은 숫자 0이 존재한다는 뜻이다. NULL과 혼동되어서는 안됨

NULL은 산술연산자 = 로 비교가 안됨.

따라서 NULL을 구별하려면 IS NULL을 사용해야 함

-- null check
-- null은 연산이 불가능.
SELECT * FROM emp WHERE comm = null; --결과 안 뜸
SELECT * FROM emp WHERE comm is null;

SELECT sal+10, comm+10 FROM emp;

SELECT ename, sal, sal*12+comm AS ANNSAL, comm FROM emp 
WHERE comm IS NOT NULL AND comm != 0;

SELECT ename, sal, sal*12+comm AS ANNSAL, comm FROM emp 
WHERE comm > NULL; -- 결과 안 뜸. 산술연산자 사용 불가.

 

집합 연산자

JOIN인 A+B가 가로로 합쳐지는거고 (두 개 이상의 테이블에서 데이터 결합)

UNION은 위아래로 합쳐진다. (두 개 이상의 SELECT문 결과 결합)

UNION : 중복제거

UNION ALL : 중복 허용

-- 집합 연산자
SELECT empno, ename, sal, deptno FROM emp WHERE deptno=10
UNION 
SELECT empno, ename, sal, deptno FROM emp WHERE deptno=20;

컬럼 수가 같아야 한다.

컬럼끼리 매칭이 아님, 타입만 같으면 컬럼 순서대로 출력된다.

사실 SQL이 느려지는 대표적인 요인이므로 가능한 쓰지 않는 것이 좋음.

 

-- 집합 연산자
SELECT empno, ename, sal, deptno, comm FROM emp WHERE deptno=10
UNION 
SELECT sal, ename, empno, deptno, mgr FROM emp WHERE deptno=20 
ORDER BY deptno;

실행순서가 매우 중요하다.

ORDER BY는 끝에 나와야 한다. (UNION 한 다음에 실행 됨)

 

연산자 우선순위

 

 

확인문제

SELECT * FROM emp WHERE ename LIKE '%S';

 

SELECT empno, ename, job, sal, deptno FROM emp
WHERE deptno=30 AND job='SALESMAN';

 

-- 집합연산자 사용X
SELECT empno, ename, job, sal, deptno FROM emp 
WHERE deptno in (20, 30) AND  sal > 2000;

-- 집합연산자 사용
SELECT empno, ename, job, sal, deptno FROM emp
WHERE deptno = 20 AND sal > 2000
UNION
SELECT empno, ename, job, sal, deptno FROM emp
WHERE deptno = 30 AND sal > 2000;

 


SELECT * FROM emp
WHERE sal < 2000 OR sal > 3000 ;

 

SELECT ename, empno, sal, deptno FROM emp
WHERE ename like '%E%'
AND deptno = 30
AND sal NOT BETWEEN 1000 and 2000;

 

select * from emp
where ename not like '_L%'
and job in ('MANAGER', 'CLERK')
and comm is null
and mgr is not null;

 

반응형