1) IN 연산자
▹ 질의 탐색을 위해 2개 이상의 표현식(항목)을 지정
▹ OR 연산자로 변환 가능
▹ '컬럼명'에 저장된 값이 ( )안에 기술된 표현식 중 어느 하나와 일치하면 전체조건이 참
2) SOME, ANY 연산자
▹ 기본 기능은 IN연산자와 동일
(사용형식)
컬럼명 관계연산자 ANY|SOME (표현식1, 표현식2, ...)
▹ IN 연산자는 동일성만 판단(=ANY, =SOME)
▹ ANY, SOME은 크기도 비교 가능
3) ALL연산자
▹ 질의 탐색을 위해 2개 이상의 표현식(항목)을 지정
▹ 모든 표현식의 평가 결과가 참이어야 WHERE절이 참이 되는 연산자 (거의 사용되는 경우가 없음)
▹ AND연산자로 변환 가능
4) EXISTS 연산자
▹ 반드시 뒤에 서브쿼리가 나와야함
(사용형식)
WHERE EXISTS (서브쿼리)
5) BETWEEN 연산자
▹ 범위를 지정하여 조건을 구성하는 경우 사용
▹ 기간을 정해서 무언가를 조회할 때 많이 사용
▹ 숫자열, 문자열 둘 다 가능
▹ 컬럼명의 값이 '값1'에서 '값2' 사이의 값이 참(true)을 반환
6) LIKE 연산자
▹ 문자열에 사용
▹ 패턴을 비교하는 경우 사용하는 연산자
▹ LIKE를 쓰면 해당되는 모든 자료를 꺼내오기 때문에 효율이 좋지 못함
▹ 쓰기는 간편하지만 부담
▹ 와이드카드(패턴문자열)로 '%'와 ''가 사용
▹ '%' : '%'가 사용된 위치에서 그 이후에 나오는 모든 문자열과 대응
예)
'김%' : '김'으로 시작하는 모든 문자열과 대응
'%김' : '김'으로 끝나는 모든 문자열과 대응
'%김%' : 단어 내부에 '김'이 존재하는 모든 문자열과 대응
▹ '' : ''가 사용된 위치에서 하나의 문자와 대응
예)
'김' : '김'으로 시작하고 2글자로 구성되며 두번째 글자는 어느글자든 상관없음
'김' : '김'으로 끝나는 2글자로 구성된 문자열과 대응
'김_' : '김'
(IN 연산자 사용하지 않은 경우)
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드,
SALARY AS 급여
FROM EMPLOYEES
WHERE DEPARTMENT_ID=20 OR DEPARTMENT_ID=60 OR DEPARTMENT_ID=80
ORDER BY DEPARTMENT_ID ASC
** ASC 오름차순 / DESC 내림차순
(IN 연산자 사용하는 경우)
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드,
SALARY AS 급여
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(20,60,80)
ORDER BY 3;
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드,
SALARY AS 급여
FROM EMPLOYEES
WHERE DEPARTMENT_ID AND(20, 60, 80)
ORDER BY 3;
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드,
SALARY AS 급여
FROM EMPLOYEES
WHERE DEPARTMENT_ID SOME(20, 60, 80)
ORDER BY 3;
(갑자기 여기에서 뜬금없이 서브쿼리를 사용 🤷♂️)
서브쿼리 실행 후 메인쿼리가 실행된다.
/*먼저 서브쿼리 안에 들어갈 내용을 작성*/
SELECT MEM_NAME, MEM_MILIEAGE
FROM MEMBER
WHERE MEM_JOB = '공무원'
ORDER BY MEM_MILEAGE DESC;
/*메인 쿼리 작성 1)IN 연산자*/
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_JOB AS 직업,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_MILEAGE IN (SELECT MEM_MILEAGE
FROM MEMBER
WHERE MEM_JOB = '공무원') --IN은 ( )와 같은 값을 가지면 참
/*메인 쿼리 작성 2)ANY 연산자*/
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_JOB AS 직업,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_MILIEAGE > ANY (SELECT MEM_MILEAGE
FROM MEMBER
WHERE MEM_JOB = '공무원') --ANY는 4가지 중 하나라도 만족하면 참
Q. 사원테이블에서 부서번호가 30, 50, 80부서에 속하지 않은 사원을 조회하시오.
Alias 사원번호, 사원명, 부서번호, 입사일
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
HIRE_DATE AS 입사일
FROM EMPLOYEES
WHERE NOT DEPARTMENT_ID = ANY(30, 50, 80)
--WHERE DEPARTMENT_ID NOT IN(30, 50, 80) --둘 중 어느 것을 사용해도 상관없음
ORDER BY DEPARTMENT_ID;
Q. 회원테이블에서 여성회원이고 마일리지 3000이상인 회원정보를 조회하시오.
Alias 회원번호, 회원명, 주민번호, 직업, 마일리지
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_REGNO1|| '-' || MEM_REGNO2 AS 주민번호,
MEM_JOB AS 직업,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE SUBSTR(MEM_REGNO2,1,1) IN (2,4) --SUBSTR : 문자열 추출
AND MEM_MILEAGE >= 3000;
Q. 상품테이블(PROD)에서 분류코드(PROD_LGU)가 'P102'이고 판매가격(PROD_PRICE)이
10만원 이상인 상품을 조회하시오.
Alias 상품코드, 상품명, 분류코드, 판매가격
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
PROD_LGU AS 분류코드,
PROD_PRICE AS 판매가격
FROM PROD
WHERE PROD_LGU = 'P102'
AND PROD_PRICE>=100000;
Q. 장바구니 테이블에서 2005년 7월 1일 ~ 7월 15일 판매정보를 조회하시오.
Alias 장바구니번호, 회원번호, 수량
단, 구매수량이 많은 것부터 출력(ORDER BY 사용)
SELECT CART_NO AS 장바구니번호,
CART_MEMBER AS 회원번호,
CART_QTY AS 수량
FROM CART
WHERE SUBSTR(CART_NO,1,8) > '20050701' AND SUBSTR(CART_NO,1,8)<'20050715'
ORDER BY 3 DESC;