## SQL 처리순서

## Alias(사용 범위)
## SQL종류
### DDL(Data Definition Language)
- 데이터 조작어
- 데이터베이스 객체의 구조를 정의
- 테이블로부터 데이터 구조를 생성,병경, 제거.
CREATE : 데이터베이스 객체 생성 : 기존에 존재하는 데이터베이스 객체 수정
- char(고정 길이를 갖는 문자열을 저장) vs varchar(가변길이를 갖는 문자열을 저장 )
- char(20) : 컬럼에 10자만 저장하더라도, 20자 만큼의 기억장소를 차지
- varchar(20) : 컬럼에 10자를 저장하면 실제 저장 기억소에도 10자만큼만 차지.
- Datetime() vs timestamp

- 제약조건
- unique(중복X, null 허용) vs primary key(중복X, null X)
ALTER : 기존에 존재하는 데이터베이스 객체 수정
DROP: 데이터베이스 객체를 삭제
RENAME:
### DML(Data Manipulation Language)
- 데이터 조작어
- 테이블 **레코드**를 CRUD
INSERT : 입력( C )
SELECT : 조회( R )
- null 조오심!! 산술연산자할 때 IFNULL(exp1,exp2)이거!!해줘야 한다눙...
UPDATE : 수정( U )
- UPDATE [table] SET [col] = [new_col] WHERE ~ ;
DELETE : 삭제( D )
- DELETE FROM [table] WHERE ~ ;
### DQL : SELECT 쿼리
### DCL(Data Control Language)
- 데이터 제어어
- DB, Table의 접근권한이나 CRUD권한 을 정의
- 특정 사용자에게 테이블의 검색권한 부여/금지 등등
grant : 데이터베이스 객체에 권한을 부여
revoke : 데이터베이스 객체 권한 취소.
### TCL(Transaction Control Language)
- 트랜잭션 제어어
- transaction : 데이터베이스의 논리적 연산 단위
- mysql에서 commit, rollback은 실행시 transaction 풀리고, rollback to [savepoint]는 안풀림. 따라서 r전자의 경우, START TRANSACTION해줘야 함~
START TRANSACTION : Commit, rollback이 나올 때까지 실행되는 모든 sql
COMMIT : 실행한 Query를 최종적으로 적용
ROLLBACK : 실행한 Query를 마지막 commit 전으로 취소시켜 데이터 복구
SAVE POINT : 롤백시 돌아갈 지점...
## 연산자 정리
- 숫자에 대해서 +/*/-//가능하다. but, 값이 NULL이면 무시되니 조오심!
## 함수(교재 위주 - 너허무 많다 ㅠㅠㅋㅋ)
1. 숫자 관련함수
- CEILING, TRUNCATE, ROUND
2. 문자 관련 함수
- substring, mid : substring('문자열', 시작위차, 길이');
- insert : insert('문자열', 시작위치, 길이, '대체할 문자열')
replace : replace('문자열', '대체될 문자열', '대체할 문자열')
3. 날짜 관련 함수
- sysdate, now, date
- str_to_date : str_to_date('2021/04/07','%Y/%m/%d') **String → date**
dateformat : dateformat(sysdate(), '%Y/%m/%c') **date → String**
4. 논리 관련 함수

5. 그룹(aggregate) 함수
- count(*)의 경우는 null인것도 같이 센다는 썰이 있던뎅...??

## Group by / having (집계함수, 그룹함수)
### Group by
- 쿼리된 테이블의 행을 그룹으로 묶는다.
- 집계 함수를 각 행 그룹에 적용하고 각 그룹에 대해 __단일 결과 행__ 을 반환 한다.
- select절의 모든 요소는 group by절의 표현식, 집계함수를 포함하는 표현식, 상수만 가능

- 단일행 반환, 다중행 반환을 잘 못 파악해서 에러난다!
### having
- group by 한 결과에 조건 추가할 경우 씀
- 실행 순서 중요중요!! where가 group by보다 먼저 실행되기 때문에, 집계 함수 및 조건은 여기에 쓴다.

## roll up
## JOIN, Subquery
조인시 어느 테이블을 먼저 읽을지를 결정하는 것이 중요하다. 처리할 작업량이 상당히 달라진다.
### INNER JOIN(Equi Join)
- 어느 테이블을 먼저 읽어도 결과가 달라지지 않음. 옵티마이저가 최적화~.~개꿀!
- N개의 테이블 조인시 N-1의 조인조건이 필요함.
- Join 조건1 : ON 사용 : alias 사용가능
일반 조건 : WHERE 사용
- Join 조건2 : USING(공통 칼럼) : table이름 , alias 사용 불가능
*— 이게 당연한게.. 공통칼럼이니까...ㅇㅅㅇ*
### OUTER JOIN
- 반드시 OUTER가 되는 테이블을 먼저 읽어야하므로 옵티마이저가 조인순서 어케 못함... ㅠㅠ

### SELF JOIN
### None-Equi JOIN
### NATUAL JOIN(조건 명시에 따른 구분1)
- 조건 명시 No!

- 자연 조인은 테이블간에 동일한 형식을 갖는 공통 컬럼이 반드시 하나만 존재해야 한다!!!
### CROSS JOIN(조건 명시에 따른 구분2)
-- equi-join : 동등비교 조건
-- nonequi-join : 동등비교가 아닌 조건
-- 조인결과 처리 방식에 따라
-- inner join : 조인 조건에 부합하는 레코드만 (조인이 가능한 레코드만) 결과집합으로
-- outer join : 조인 조건에 부합하는 레코드뿐만 아니라 부합하지 않는 레코드(기준 테이블 기준)도 결과집합으로
-- mysql에서는 full outer join을 지원하지 않는다
-- 그 밖의 조인
-- self join : 자신과 자신을 조인하는 형태 (계층형 테이블일 경우)
-- 사원(사원 - 상사), 카테고리, 게시판(자식글- 부모글)
-- cross join : 두 테이블의 모든 가능한 조인을 다 처리한 형태의 결과
-- 조인 조건 명시하지 않음
-- natural join : 자연스럽게 조인
-- 조인 조건을 명시하지 않으면
-- 중복 컬럼 제거 (그래서 추천하지 않음)
-- join ~ using : 두테이블 공통컬럼을 동등비교로 조인하는 형태
### Subquery
- 메인쿼리 : 서브쿼리를 포함하고 있는 외부 쿼리
- 서브쿼리는 반드시 ()로 감싸져 있어야한다.
- 서브쿼리 종류
- WHERE 절 서브쿼리 : Nested 서브쿼리(중첩서브쿼리) - 단일행, 다중행, 다중열 리턴
1. 단일행 WHERE ... = (...)
2. 다중행 WHERE ... IN(...), WHERE ... ANY(...), WHERE ...ALL(...)
3. 다중열 WHERE ( ... , ...) IN (select ..., ... ...)형태
- FROM절 서브쿼리 : Inline View
- view처럼 결과가 동적으로 생성
- 임시 view라서 데이터베이스에 저장 안 됨
- SELECT절 서브쿼리 : Scalar 서브쿼리 - 단일행만 리턴
- 여기서 다루지 못했지만, CREATE, INSERT, UPDATE, DELETE에서도 쓸 수 있음 *DB 두번 째 ppt 46-49p참조!*
## TopN쿼리와 Limit (Inline View)
### Inline View를 이용해 TopN질의에 해당하는 서브쿼리를 만들어보자.

### Limit

## View
## Index(개념만 알아둣삼)
## 모델링

- 개념적 모델링 : 개체를 추출하고 속성 구성 및 관계를 정의하여 ERD 작성 및 정의
- 논리적 모델링 : 앞단계에서 정의된 ER다이어그램을 Mapping rule을 적용하여 스키마를 설계, 더 나아가 정규화까지
- 1:1, 1:N 관계는 주로 pk,fk로 해결
- M:N 관계는 pk가 유일하다는 제약조건을 위배 -> Relation을 따로 table로 만들어야 한다.

- 물리적 모델링 : 앞단계에서 얻은 스키마를 좀더 효율적으로 구현하기 위한 작업
- Index 작업, Trigger
- 역정규화
### 정규화
- 속성 간에 존재하는 함수적 종속성을 분석해서 관계형 스키마를 더 좋은 구조로 정제해 나가는 과정
- __중복제거__

1. 제 1정규화
- __중복되는 기본 속성 데이터__ 분리
2. 제 2정규화
- __복합키__ 에 전체적으로 의존하지 않는( __부분적 의존__ )하는 속성을 분리
3. 제 3정규화
- 기본키에 의존하지 않고 __일반 컬럼에 의존__ 하는 컬럼 분리
4. 역정규화(Denomalization)
- 정규화에 위배되는 행위
- 시스템 성능을 고려하여 기존 설계 재구성


### 모델링 3대 요소
- 개체(Entity), 속성(Attribute), 관계 (Relation)
## 덤덤덤덤덤덤~~
### 마지막 ppt에 set이 있었누..(p18-p22)
