---
# System prepended metadata

title: Untitled

---

## SQL 처리순서
![](https://i.imgur.com/CIN7hLt.png)

## Alias(사용 범위)

## SQL종류

### DDL(Data Definition Language)

- 데이터 조작어
- 데이터베이스 객체의 구조를 정의
- 테이블로부터 데이터 구조를 생성,병경, 제거.

CREATE : 데이터베이스 객체 생성 : 기존에 존재하는 데이터베이스 객체 수정

- char(고정 길이를 갖는 문자열을 저장) vs varchar(가변길이를 갖는 문자열을 저장 )
    - char(20) : 컬럼에 10자만 저장하더라도, 20자 만큼의 기억장소를 차지
    - varchar(20) : 컬럼에 10자를 저장하면 실제 저장 기억소에도 10자만큼만 차지.
- Datetime() vs timestamp

![](https://i.imgur.com/ENt2YVH.png)


- 제약조건
    - 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. 논리 관련 함수

    ![](https://i.imgur.com/CsUnUpK.png)


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

    ![](https://i.imgur.com/srlePYX.png)


## Group by / having (집계함수, 그룹함수)

### Group by
- 쿼리된 테이블의 행을 그룹으로 묶는다.
- 집계 함수를 각 행 그룹에 적용하고 각 그룹에 대해 __단일 결과 행__ 을 반환 한다.
- select절의 모든 요소는 group by절의 표현식, 집계함수를 포함하는 표현식, 상수만 가능
  ![](https://i.imgur.com/nQavqiF.png)
- 단일행 반환, 다중행 반환을 잘 못 파악해서 에러난다!

### having
- group by 한 결과에 조건 추가할 경우 씀
- 실행 순서 중요중요!! where가 group by보다 먼저 실행되기 때문에, 집계 함수 및 조건은 여기에 쓴다.
  ![](https://i.imgur.com/XN3SJEy.png)

## roll up

## JOIN, Subquery

조인시 어느 테이블을 먼저 읽을지를 결정하는 것이 중요하다. 처리할 작업량이 상당히 달라진다.

### INNER JOIN(Equi Join)

- 어느 테이블을 먼저 읽어도 결과가 달라지지 않음. 옵티마이저가 최적화~.~개꿀!
- N개의 테이블 조인시 N-1의 조인조건이 필요함.
- Join 조건1 : ON 사용 : alias 사용가능
일반 조건 : WHERE 사용
- Join 조건2 : USING(공통 칼럼) : table이름 , alias 사용 불가능
 *— 이게 당연한게.. 공통칼럼이니까...ㅇㅅㅇ*

### OUTER JOIN

- 반드시 OUTER가 되는 테이블을 먼저 읽어야하므로 옵티마이저가 조인순서 어케 못함... ㅠㅠ

    ![](https://i.imgur.com/OHHCZw5.png)

### SELF JOIN

### None-Equi JOIN

### NATUAL JOIN(조건 명시에 따른 구분1)

- 조건 명시 No!

![](https://i.imgur.com/W3yREeB.png)

- 자연 조인은 테이블간에 동일한 형식을 갖는 공통 컬럼이 반드시 하나만 존재해야 한다!!!

### 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질의에 해당하는 서브쿼리를 만들어보자.

![](https://i.imgur.com/sA93Ee8.png)


### Limit

![](https://i.imgur.com/EQB9WTo.png)

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

## 모델링
![](https://i.imgur.com/lRmsn2B.png)
- 개념적 모델링 : 개체를 추출하고 속성 구성 및 관계를 정의하여 ERD 작성 및 정의
- 논리적 모델링 : 앞단계에서 정의된 ER다이어그램을 Mapping rule을 적용하여 스키마를 설계, 더 나아가 정규화까지
    - 1:1, 1:N 관계는 주로 pk,fk로 해결
    - M:N 관계는 pk가 유일하다는 제약조건을 위배 -> Relation을 따로 table로 만들어야 한다.
  ![](https://i.imgur.com/J92Ucs7.png)
- 물리적 모델링 : 앞단계에서 얻은 스키마를 좀더 효율적으로 구현하기 위한 작업
    - Index 작업, Trigger
    - 역정규화
### 정규화
- 속성 간에 존재하는 함수적 종속성을 분석해서 관계형 스키마를 더 좋은 구조로 정제해 나가는 과정
- __중복제거__
  ![](https://i.imgur.com/5J1mZ1a.png)
1. 제 1정규화
    - __중복되는 기본 속성 데이터__ 분리
2. 제 2정규화
    - __복합키__ 에 전체적으로 의존하지 않는( __부분적 의존__ )하는 속성을 분리
3. 제 3정규화
    - 기본키에 의존하지 않고 __일반 컬럼에 의존__ 하는 컬럼 분리
4. 역정규화(Denomalization)
    - 정규화에 위배되는 행위
    - 시스템 성능을 고려하여 기존 설계 재구성
    ![](https://i.imgur.com/4AZ1GE3.png)
    ![](https://i.imgur.com/wlBTPM9.png)
### 모델링 3대 요소
- 개체(Entity), 속성(Attribute), 관계 (Relation)

## 덤덤덤덤덤덤~~
### 마지막 ppt에 set이 있었누..(p18-p22)
![](https://i.imgur.com/pfgVvCd.png)
