신입사원 입문교육_정리

SQL - Day2

FireStone 2021. 1. 27. 09:47
  •   JOIN  

: 원하는 데이터가 여러개의 테이블에 나눠져있을때 연결하는 방법

 

- inner join : 테이블을 연결할때 일치하는 것들만 나오도록 하는 것

- outer join: 일치하지 않아도 나오게 하는 것

 

 오라클 조인  

 

 - cartesian product

: 조인 조건을 생략하거나 잘못된 경우

 -> 결과는 나오지만 데이터로 활용은 못함

 -> 전체를 합친 결과나 나옴 - 모든 데이터가 연결됨

 

 - equi 조인

 : 반드시 조건이 일치할때 (동등연산자로)

 

SELECT 테이블1.컬럼 , 테이블2.컬럼
FROM 테이블1 , 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼;    //동등연산자 사용

==> primary key 와 foreign key를 많이 사용

 

  * primary key를 갖고있는 곳이 master

  foreign key인 곳이 slave

  ==>반드시 master의 pk, uk(unique), null 만 참조할 수 있다.

 

  * fk 저장가능한 값 

   1) master의 값이어야함 

   2) null을 가질 수 있다.

 

  *테이블 이름에 alias를 사용할 수 있는데, 만약 alias를 사용했다면 테이블 이름대신 alias로 접근해야한다.

 

  - 검색조건 추가 가능

  WHERE emp.department_id = dept.department_id   ==> 조인조건
  AND last_name='Whalen';  ==> 검색조건

 

 - non-equi 조인

 : 정확히 일치하지 않아도 범위에 포함이 되는 것들 => 비교연산자 사용

 

SELECT last_name, salary, grade_level
FROM employees e, job_grades g
WHERE e.salary BETWEEN g.lowest_sal AND g.highest_sal;

 

 - outer 조인

 : 일치하지 않는 것들까지 나오는 조인

 

SELECT 테이블1.컬럼 , 테이블2.컬럼
FROM 테이블1 , 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼 (+);

 => +를 붙이는 쪽이 null이 생성됨

 -> 조인조건과 일치하는 않는 테이블1의 데이터도 결과에 포함되어 출력된다.

 * 한쪽만 가능함 / 둘다 +는 안됨

 

 - self 조인

 : 자기자신을 조인함 ex) 사원의 관리자 이름 - 둘다 같은 테이블일때

 

SELECT e.last_name 사원명, m.last_name 관리자명
FROM employees e, employees m
WHERE e.manager_id = m.employee_id;

 

 

ANSI 조인 

: from절에 조인조건을 씀 * 오라클 조인은 where절에 씀

 

 - cross 조인

 : 조인하는 각 테이블의 행 개수를 서로 곱한 결과가 반환

 

SELECT last_name,department_name, e.department_id
FROM employees e CROSS JOIN departments d;

 

 - natural 조인

 : 같은 이름을 가진 컬럼에 기반하여 동작이 된다 => 공통컬럼이 있어야함

 

SELECT 테이블1.컬럼 , 테이블2.컬럼
FROM 테이블1 NATURAL JOIN 테이블2
[WHERE 검색조건];

 

*alias를 사용해서 select하면 에러남 -> 알아서 찾는 것이기 때문에

 

 - using(컬럼)

 : 명시적으로 어떤 컬럼으로 조인할지를 지정

 

SELECT 테이블1.컬럼 , 테이블2.컬럼
FROM 테이블1 [INNER] JOIN 테이블2 USING(공통컬럼)
[WHERE 검색조건];

*alias 사용불가

 

- join ~ on절

: 동등/부등호 가능 - 특정 조건 가능

 

SELECT 테이블1.컬럼 , 테이블2.컬럼
FROM 테이블1 [INNER] JOIN 테이블2 ON 조인조건
[WHERE 검색조건];

 

  - 3개의 테이블 조인

SELECT e.last_name 사원명, d.department_name 부서명,
g.grade_level 등급
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id     //여기서 나온 결과로 밑과 조인 -> using(department_id)로도 변경가능
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

 

- LEFT OUTER | RIGHT OUTER | FULL OUTER 조인

: left -> table1에 있는 모든 것을 출력 /  right -> table2에 있는 모든 것을 출력 / full -> 양쪽

 

SELECT e.last_name 사원명, m.last_name 관리자명
FROM employees e LEFT OUTER JOIN employees m
ON e.manager_id = m.employee_id;  

=> oracle의 outer join과 같음

 

  •   subquery  

: 하나의 SELECT 만으로 원하는 데이터를 조회할 수 없을 때 사용하는 방법

 

SELECT select_list     ===> main query
FROM 테이블
WHERE 컬럼명 연산자 (SELECT select_list
FROM 테이블);    ===> subquery

 

- subquery가 먼저 실행되고, 그 결과를 가지고 main query가 실행됨

*서브쿼리는 select, from, where 에 다 있을 수 있다.

 

 단일행 서브쿼리 
 : 서브쿼리 실행 결과가 한 개의 행을 반환한다.
=, >, >=, <, <= ,!= 와 같은 비교 연산자

 

ex) WHERE salary >= (SELECT AVG(salary)
      FROM employees);  => 단일행


-  복수행 서브쿼리 
 : 서브쿼리 실행 결과가 복수 개의 행을 반환한다.
IN, ANY, ALL, EXIST 연산자

 

- IN

:동등 연산자(=) 방식

 

ex) WHERE salary IN ( SELECT salary
FROM employees
WHERE last_name IN ('Whalen','Fay') );  => whalen, fay의 salary 2개가 나옴

 

- ALL

: > 또는 < 같은 비교 연산자를 사용

 

 >  ==> 서브쿼리에서 반환된 최대값보다 커야함 

EX) 1000,2000,3000 이 나왔을때 1500이면 1000보다는 크지만 3000보다는 작기때문에 안됨

 * <최소값보다 작아야함

 

- ANY

: > 또는 < 같은 비교 연산자를 사용

 

>  ==> 서브쿼리에서 반환된 최소값 보다 큰값

< ==> 최대값 보다 작은값

 

- EXISTS

: 결과가 존재하면/존재하지 않으면 메인쿼리를 실행해라

* not exists

 

WHERE EXISTS ( SELECT employee_id
FROM employees
WHERE salary > 500000 );

 

- 다중컬럼 서브쿼리

: 여러 개의 컬럼값을 검색하여 메인쿼리의 조건절과 비교

 

WHERE (department_id, salary) IN ( SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id )

 

- 인라인 뷰

: 성능때문에 사용 / 쓸데없는 것들이 참여할 필요가 없음

 -> from 절에 사용

 

SELECT select_list
FROM ( 서브쿼리 ) alias
WHERE 조건식;

 

SELECT e.department_id, 합계, 평균, 인원수
FROM ( SELECT department_id, SUM(salary) 합계, AVG(salary) 평균 ,
COUNT(*) 인원수
FROM employees
GROUP BY department_id e, departments d
WHERE e.department_id = d.department_id
ORDER By 1;

 

* 필요한 형태만 보여주는 것이 '뷰'

* 이건 더 많은 것이 참여함 -> 위처럼 인라인뷰 사용하면 필요없는 데이터의 참여를 줄일 수 있음

SELECT e.department_id , SUM(salary) 총합, AVG(salary) 평균, COUNT(*) 인원수
FROM employees e , departments d
WHERE e.department_id = d.department_id
GROUP BY e.department_id
ORDER BY 1;

 

  •   DML  

: 테이블에 새로운 데이터를 저장(INSERT)하거나 삭제(DELETE) 또는 수정 (UPDATAE) 및 병합(MERGE)할 때 사용하는 데이터 조작어

 

*TCL

- COMMIT : sync를 맞춰줌

- ROLLBACK: 작업을 취소함 

*commit, rollback은 명시적으로 해줘야함

 

-   INSERT  

 

 - 단일행 INSERT문

: 행이 하나씩만 만들어짐

 

 - 컬렴명을 지정할 수도 있고, 지정하지 않을 수도 있음

 * 지정하지 않으면 NULL이 들어감

 * 컬럼명을 지정하면 모든 컬럼값을 지정하지 않아도 되지만 컬럼명을 지정하지 않으면 모든 컬럼명의 값을 순서대로 넣어줘야한다.

 

INSERT INTO 테이블명 [(컬럼명,컬럼명2,...)]
VALUES ( 값, 값2, ... );

 

 - 복수행 INSERT문

: 행이 하나씩만 만들어짐

 

INSERT INTO 테이블명 [(컬럼명,컬럼명2,...)]
Subquery;

 

ex)

CREATE TABLE mydept
AS
SELECT * FROM dept
WHERE 1=2;

 

 - 다중 테이블 다중행 INSERT

: 테이블을 다르개해서 삽입 가능

 

INSERT ALL
[WHEN 조건식 THEN]
INTO 테이블1 VALUES ( 컬럼명,컬럼명2,...,컬럼명n)
[WHEN 조건식2 THEN]
INTO 테이블2 VALUES ( 컬럼명,컬럼명2,...,컬럼명n)
Subquery;

 

-   UPDATE  

: 데이터를 수정하기 위해 사용

 

UPDATE mydept
SET dname='영업',loc='경기'
WHERE deptno = 50;

 

- subquery를 이용한 UPDATE

 

UPDATE mydept
SET dname= ( SELECT dname
FROM dept
WHERE deptno = 10)
,loc= ( SELECT loc
FROM dept
WHERE deptno=20)
WHERE deptno = 60;

 

-  DELETE  

: 데이터를 삭제하기 위해 사용

 

DELETE FROM mydept
WHERE deptno = 50;

 

- subquery를 이용한 DELETE

 

-  MERGE  

* 나중에.. 따로 공부해서 정리하기

 

 

  •   TRANSACTION  

: 여러 DML작업을 하나의 작업처럼 실행되는 논리적인 작업

 

- 이러한 경우

 

 가. 제주도 여행

  - 비행기 예약(insert) / 숙소 예약(insert) / 렌트카 예약 등

  => 3가지 작업은 모두 성공해서 제주도 여행을 성공적으로 하던지/ 모두 취소해서 여행을 안가던지..

 

- 각각의 작업 하나하나(insert, update etc..)가 트랜잭션이 될 수 있다.

- 명시적으로 트랜잭션을 종료해줘야한다.

'신입사원 입문교육_정리' 카테고리의 다른 글

workshop 3  (0) 2021.01.27
oracle db - 나머지공부 - 정리  (0) 2021.01.27
ddl workshop  (0) 2021.01.27
sql workshop - day1  (0) 2021.01.26
SQL - 1일차  (0) 2021.01.26