1. JOIN 214P
1) 정의
JOIN : 테이블을 좌우로 합쳐주는 방식
등가 JOIN : 같다라는 조건의 조인을 걸어주는 방식 예시 ( ~~ WHERE E.DEPTNO = D.DEPTNO)
비등가 JOIN :
2) 등가 JOIN
--14 rows
SELECT * FROM EMP ORDER BY EMPNO;
--4 rows
SELECT * FROM DEPT ORDER BY DEPTNO;
--14*4=56 rows
--부서정보가 4개라 1*4의 방식으로 같은 이름이 4명이 만들어짐.
SELECT * FROM DEPT, EMP ORDER BY EMPNO;
--내부 조인 = 등가조인 = 단순조인
--보통 말하는 조인의 경우에 해당함
SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;
--테이블 별칭 사용
SELECT * FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
--실무 방식 (주석같은 느낌으로 확인할 수 있게)
SELECT E.EMPNO , E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO,
D.DNAME, D.LOC
FROM EMP E, DEPTNO D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
--동시에 같은 열을 가지고 있는 경우
--DEPTNO은 둘 다 가지고 있어서 어디서 가지고 와야 하는지 알려줘야 함.
--(D.를 쓰던지 E.를 쓰던지) (DEPTNO)
SELECT EMPNO,ENAME,DEPTNO,DNAME,LOC FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--열의 출처를 구체적으로 명시해야 함 (D.DEPTNO)
SELECT EMPNO,ENAME,D.DEPTNO, DNAME,LOC FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--조건 추가
--조건은 반드시 최소 테이블 개수 - 1개 만큼 필요함 (조건의 개수 = 등가 조인 -1개)
SELECT E.EMPNO,E.ENAME ,E.SAL,D.DEPTNO,D.DNAME ,D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO =D.DEPTNO
AND SAL >= 3000;
--문제
SELECT E.EMPNO,E.ENAME,E.SAL,D.DEPTNO,D.DNAME,D.LOC
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO
AND SAL <= 2500
AND EMPNO <= 9999;
--조건이 추가된다는 것의 의미
SELECT E.EMPNO,E.ENAME,E.SAL,D.DEPTNO,D.DNAME,D.LOC
FROM EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO
AND E.EMPNO=E.MGR
AND SAL <= 2500
AND EMPNO <= 9999;
3) 비등가 조인
--비등가조인 = 등가 조인 이외의 조인 방식
SELECT * FROM EMP;
SELECT * FROM SALGRADE;
--BETWEEN X AND Y -> 이렇게 한묶음
SELECT * FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
4) 자체 조인
--자체 조인 = 같은 테이블끼리 조인
SELECT E1.EMPNO,E1.ENAME,E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;
----외부조인
--LEFT OUTER JOIN (+이 없는 곳이 기준점임)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO (+)
ORDER BY E1.EMPNO;
--직속상관이 없는 사람도 나옴
--RIGHT OUTER JOIN
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO
ORDER BY E1.EMPNO;
--부하직원이 없는 사람도 나옴
5) NATURAL JOIN (등가 조인 방식)
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,DEPTNO,
D.DNAME,D.LOC
FROM EMP E NATURAL JOIN DEPT D
ORDER BY DEPTNO,E.EMPNO;
--JOIN ~ USING
--조인할 공통 열을 지정해야 함
--USING을 써서 어떤거랑 같은 것인지 확인시켜야 함.
--USING = WHERE 같은 느낌 (DEPTNO)와 같다면
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,DEPTNO,
D.DNAME,D.LOC
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
6) JOIN USING
--JOIN ~ USING
--조인할 공통 열을 지정해야 함
--USING을 써서 어떤거랑 같은 것인지 확인시켜야 함.
--USING = WHERE 같은 느낌 (DEPTNO)와 같다면
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,DEPTNO,
D.DNAME,D.LOC
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
7) JOIN ON
--JOIN ~ ON
--조인할 공통 열을 지정해야 함 = 같다는 조건으로
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,E.DEPTNO,
D.DNAME,D.LOC
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE SAL <= 3000
ORDER BY E.DEPTNO, EMPNO;
8) OUTER JOIN ON (LEFT) // 앞서 자체 테이블 조인한 것과 같은 결과
-- OUTER JOIN ON
-- LEFT OUTER JOIN ON
-- +을 넣은 것과 같은 이지
-- 괄호는 조건을 의미
SELECT E1.EMPNO,E1.ENAME,E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
--RIGHT OUTER JOIN ON
SELECT E1.EMPNO,E1.ENAME,E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
--FULL OUTER JOIN ON
SELECT E1.EMPNO,E1.ENAME,E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 FULL OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
-- 직속상관이 없는 사람 + 부하직원이 없는 사람
2. 서브쿼리 (242P)
1) 특징
기본적으로 WHERE 절 뒤 ,FROM 절 뒤, SELECT 절 뒤에 온다.
* ORDER BY를 쓰지 않음
--단일행 서브쿼리 소재
SELECT SAL
FROM EMP
WHERE ENAME = 'JONES';
SELECT *
FROM EMP
WHERE SAL > 2975;
-- 실제 단일행 서브쿼리
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME = 'JONES');
2) 실행결과가 하나인 단일행 서브쿼리
--단일행서브쿼리 & 날짜형 데이터
SELECT *
FROM EMP
WHERE HIREDATE < (SELECT HIREDATE
FROM EMP
WHERE ENAME = 'SCOTT');
3) 단일행 서브쿼리와 함수 (꺼내쓰기)
--단일행서브쿼리 & 함수
SELECT E.EMPNO,
E.ENAME,
E.JOB,
E.SAL,
E.DEPTNO,
D.DNAME,
D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO = 20
AND E.SAL > (SELECT AVG(SAL) FROM EMP);
4) 다중행 서브쿼리
- IN : OR 연산자의 기능 TRUE
- ANY, SOME : 하나 이상이면 TRUE
- ALL : AND 연산자의 기능 TRUE
- EXISTS : 결과가 존재하면 TRUE
-- 다중행서브쿼리
-- 다중행 연산자 IN
SELECT * FROM EMP WHERE DEPTNO IN (20,30);
SELECT * FROM EMP WHERE SAL IN (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);
-- 같다는 OR 조건 여러 개와 동일
-- 다중행 연산자 ANY
SELECT * FROM EMP WHERE SAL = ANY (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);
-- 다중행 연산자 SOME
SELECT * FROM EMP WHERE SAL = SOME (SELECT MAX(SAL) FROM EMP GROUP BY DEPTNO);
--ANY/SOME
--결과는 최대값보다 작은 것과 같다
--950 1250 1500 1600 2850
SELECT * FROM EMP WHERE SAL < ANY (SELECT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
SELECT * FROM EMP WHERE SAL < SOME (SELECT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
-- 단일행 서브쿼리로 대체
SELECT * FROM EMP WHERE SAL < (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
SELECT * FROM EMP WHERE SAL > ANY (SELECT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
SELECT * FROM EMP WHERE SAL > SOME (SELECT SAL FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
SELECT * FROM EMP WHERE SAL > (SELECT MIN(SAL) FROM EMP WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
< all :최소값보다 작다 (작다는 최소값)
> all : 최대값보다 크다 (크다는 최대값)
-- ALL 다중행 연산자
-- < ALL
-- 결과는 최소값보다 작은 것과 같다.
SELECT * FROM EMP WHERE SAL < ALL (SELECT SAL FROM EMP WHERE DEPTNO = 30;
-- > ALL
-- 결과는 최대값보다 큰 것과 같다.
SELECT * FROM EMP WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO = 30);
-- 단일행
SELECT * FROM EMP WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = 30);
-- EXISTS 다중행 연산자
SELECT * FROM DEPT;
SELECT * FROM EMP WHERE EXISTS (SELECT DNAME FROM DEPT WHERE DEPTNO = 10);
SELECT * FROM EMP WHERE EXISTS (SELECT DNAME FROM DEPT WHERE DEPTNO = 50);
5) 다중열 서브쿼리 - 실무적으로 외우기
--다중열 서브쿼리
--여러 개의 열을 비교하는 경우는 실무에서 꽤 많이 사용하므로 기억해두기
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN ( SELECT DEPTNO, MAX (SAL)
FROM EMP
GROUP BY DEPTNO);
6) 인라인뷰 - FROM 뒤
--FROM절 뒤에서 사용하는 서브쿼리 = 인라인뷰
SELECT E10.EMPNO,
E10.ENAME,
E10.DEPTNO,
D.DNAME,
D.LOC
FROM (SELECT *
FROM EMP
WHERE DEPTNO = 10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
* 데이터가 클 때는 인라인뷰를 자주 사용함.
7) 조건을 별칭으로 바꿔주는 기능 - WITH
--인라인뷰가 많을 때는 WITH절로 먼저 별칭으로 선언해서 사용하면 가독성에 좋다.
WITH
E10
AS
(SELECT *
FROM EMP
WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMPNO,
E10.ENAME,
E10.DEPTNO,
D.DNAME,
D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;
* 조건을 달 때 별칭 설정은 (이름) AS (조건)이 된다. (SELECT와 다른 별칭 지정)
-- SELECT 절에서 사용하는 서브쿼리 = 스칼라 서브쿼리
SELECT GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN LOSAL AND HISAL;
SELECT DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--
SELECT EMPNO,
ENAME,
JOB,
SAL,
(SELECT GRADE
FROM SALGRADE S
WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
DEPTNO,
(SELECT DNAME
FROM DEPT
WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
FROM EMP E;
- 열을 추가할 수 있는 것이 스칼라 서브쿼리임.
3. DML (266P)
1) 정의
DML : INSERT, UPDATE, DELETE와 같은 정보를 수정하는 기능 (데이터 조작)
TCL : COMMIT, ROLLBACK와 TCL(트랜잭션 제어 언어)은 데이터베이스의 데이터 변경 사항을 관리하는 데
사용되는 기능
DDL : CREATE, ALTER, RENAME, TRUNCATE, DROP 데이터베이스 스키마를 정의하는 데 사용됩니다.
* 데이터베이스 스키마 : 최적화된 검색, 조작 작업
핵심
1. JOIN ON 4가지 구문 꼭
2. ON 뒤에는 조건이 들어간다 (WHERE) 같은 느낌으로
3. 조인은 FROM 뒤에서
4. 244P
5. 950 1250 1500 1600 2850
6. 실무의 스타트는 서브쿼리의 연산자를 자유자재로 이용할 수 있어야 함
7. 다중 열 서브쿼리
8. WITH (조건 별칭 지점)
'배운 책들 정리 > 오라클로 배우는 데이터베이스 입문' 카테고리의 다른 글
0208 오라클 DB 입문 - 제약 조건 및 사용자, 권한, 롤 관리 (0) | 2023.02.08 |
---|---|
0207 오라클 DB 입문 - 데이터 정의어, 객체 종류, 제약 조건 (0) | 2023.02.07 |
0206 오라클 DB 입문 - 데이터 조작어, 트랜잭션 제어와 세션 (0) | 2023.02.06 |
0202 오라클 DB 입문 - 오라클 함수 (1) | 2023.02.02 |
0201 - 목차 및 데이터베이스, SQL 쿼리 조회까지 (0) | 2023.02.01 |