연산자
! : 1의 보수를 구하는 연산자(=NOT의 의미)
다중행 서브쿼리 - 일반 관계연산자나 논리연산자 사용 불가능
-> 이 때 사용하는 게 IN, ANY, SOME 등
EXISTS : 뒤에 서브쿼리가 나와야 함.
LIKE : 패턴을 비교할 때 쓰는 것 - 문자열 비교시 사용, 날짜타입 사용금지(ex. 거주지가 대전인 사람을 추출해라.)
BETWEEN : 어미를 지정해서 비교할 때 사용, 날짜, 숫자, 문자 모두 비교할 수 있음.(AND 연산자와 함께사용.)
|| : 문자열을 합쳐줌.
** ORACLE은 숫자가 가장 우선순위가 높음.
사용예) 회원테이블에서 마일리지가 3000 이상인 회원들을 조회하시오
조회할 컬럼은 회원번호, 회원명, 주소, 나이, 마일리지이다.
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_ADD1 ||' '||MEM_ADD2 AS 주소
EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FORM MEM_BIR) AS 나이
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_MILEAGE>=3000;
줄을 선택 : WHERE 절(줄의 갯수 선택) / 열을 선택 : SELECT 절
회원테이블, 마일리지 3000이상
WHERE절 부터 수행 - WHERE절이 참일때만 SELECT절이 수행됨
참일 때 - 리스트업
거짓일 때 - 패스
FROM keyword not found where expected 에러메시지 : 컬럼 별칭에 공백을 썼거나, 콤마를 생략할 때 나옴.
사용예) 상품테이블에서 매입가가 10만원 이상인 상품을 조회하시오
Alias는 상품코드,상품명,매입가,거래처명
SELECT A.PROD_ID AS 상품코드,
A.PROD_NAME AS 상품명,
A.PROD_COST AS 매입가,
B.BUYER_NAME AS 거래처명
FROM PROD A, BUYER B
WHERE A.PROD_COST>=100000 -- 테이블을 두 개 가져올 때 A와 B로 바꿔줌
AND A.PROD_BUYER=B.BUYER_ID;
다른 계정에서 테이블을 불러오려면 HR.TABLE명으로 써야함.
사용예) 사원테이블에서 급여가 5000이상 10000이하인 사원을 조회하시오
Alias는 사원번호,사원명,입사일,부서코드,급여 --HR의 테이블을 참조하려면 HR.TABLE명 으로 사용할 수 있음
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
HIRE_DATE AS 입사일,
DEPARTMENT_ID AS 부서코드,
SALARY AS 급여
FROM HR.EMPLOYEES
WHERE SALARY>=5000 AND SALARY<=10000;
(WHERE SALARY BETWEEN 5000 AND 10000 같은 의미)
ORDER BY 4, SALARY DESC; -- 부서코드가 작은 값에서 큰 값 순으로 정렬, 그 중 급여가 많은 순으로 정렬
사용예) 2005년 1월 매입정보를 조회하시오
Alias는 일자,상품코드,매입수량,매입단가,금액
SELECT BUY_DATE AS 일자,
BUY_PROD AS 상품코드,
BUY_QTY AS 매입수량,
BUY_COST AS 매입단가,
BUY_QTY*BUY_COST AS 금액
FROM BUYPROD
WHERE EXTRACT(YEAR FROM BUY_DATE) = '2005' AND EXTRACT(MONTH FROM BUY_DATE) = '01';
-- WHERE BUY_DATE>=TO_DATE('20050101') AND BUY_DATE<=TO_DATE('20050131')
ORDER BY 1;
날짜를 바꾸는 방법은 여러가지가 있음
TO_DATE(' ')로 날짜형 데이터로 변경하는 방법
사용예)회원테이블에서 직업이 주부이면서 마일리지가 3000이상인 회원을 조회하시오.
Alias는 회원번호,회원명,직업,마일리지
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_JOB AS 직업,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_JOB ='주부' AND MEM_MILEAGE >= 3000;
사용예) 사원테이블에서 부서번호 10-30번 부서의 사원번호를 조회하시오
Alias는 사원번호, 사원명, 부서번호, 직무코드 => 이 경우 IN 연산자보다 BETWEEN 또는 AND 연산자가 효율적임.
(AND 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID>='10' AND DEPARTMENT_ID <='30'
ORDER BY 3;
(BETWEEN 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID BETWEEN '10' AND '30'
ORDER BY 3;
(IN 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IN(10,20,30)
ORDER BY 3;
(OR 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID =10
OR DEPARTMENT_ID =20
OR DEPARTMENT_ID =30
ORDER BY 3;
사용예2) 사원테이블에서 부서번호 30,70,90,100번부서의 사원정보를 조회하시오
Alias는 사원번호,사원명,부서번호,직무코드 =>이 경우 IN 연산자가 다른 연산자보다 더 효율적임(불특정하거나 규칙적이지 않을 때)
(IN 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IN(30,70,90,100)
ORDER BY 3;
(OR 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = 30
OR DEPARTMENT_ID = 70
OR DEPARTMENT_ID = 90
OR DEPARTMENT_ID = 100
ORDER BY 3;
(=SOME, =ANY 연산자 사용)
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID =ANY(30,70,90,100)
ORDER BY 3;
사용예)사원의 수가 5명 이상인 부서에 속한 사원들을 조회하시오
Ailas는 사원번호, 사원명, 부서코드
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID IN(SELECT A.DID
FROM (SELECT DEPARTMENT_ID AS DID,
COUNT(*) AS CNT
FROM HR.EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>=5) A)
ORDER BY 3;