## 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)