SQLD / 2 과목 - SQL 기본 및 활용
학습 목적으로 직접 타이핑해서 옮김.
문제 시 삭제.
2 과목의 경우 간단히 정리하고 최대한 문제 풀이 위주로 진행
2 과목
SQL 기본
관계형 데이터베이스 개요
- 효율적인 데이터 관리와 데이터 손상을 피하고 복구를 위한 시스템 (DBMS)
명령어 종류
- DML
- SELECT / INSERT / UPDATE / DELETE
- DDL
- CREATE / ALTER / DROP / RENAME
- DCL
- GRANT / REVOKE
- TCL
- COMMIT / ROLLBACK
- 일반 집합 연산자
- UNION / INTERSECTION / DIFFERENCE / PRODUCT(CROSS JOIN)
- 순수 관계 연산자
- SELECT / PROJECT / JOIN / CHARACTER(s) / VARCHAR(s) / NUMERIC / DATETIME
SELECT 문
1
2
SELECT [ALL/DISTICT/(*)] 칼럼명1 [(as) ALIAS], 칼럼명2 ...
FROM 테이블명;
ALIAS (별칭)
- 칼럼명 바로 뒤에 위치
- 칼럼명과 ALIAS 사이에 AS 키워스 사용 가능
- 이중 인용부호(큰 따옴표)는 ALIAS가 공백, 특수문자를 포함하는 경우나 대소문자 구분이 필요할 때 사용
합성 연산자 (합침)
수직바 | (Oracle) - 플러스 + (SQL server)
- CONCAT (string1, string2)
1
2
SELECT first_name || last_name AS full_name
FROM employees;
쿼리 실행 순서
- FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
함수
함수 종류
- 문자형 함수
- CONCAT / UPPER / LOWER / SUBSTR / LENGTH / TRIM / REPLACE / INSTR / LEFT / RIGHT / MID 등
- 숫자형 함수
- ABS / POWER / ROUND / CEIL (올림) / FLOOR (내림) / TRUNC(숫자,[m]) (숫자를 m 자리에서 반올림, m 생략 시 디폴트 0) / MOD / SIGN(양수, 음수, 0인지 구별) / SQRT / EXP (지수 값 리턴) / LOG 등
- 날짜형 함수
- DATEADD / DATEDIFF / YEAR / MONTH / DAY / HOUR / MINUTE / SECOND / DATEPART / GETDATE 등
- 변환형 함수
- CAST / CONVERT / TO_CHAR / TO_NUMBER / TO_DATE / NUMTOYMINTERVAL (시간, 날짜 interval을 date 타입으로) / TO_TIMESTAMP 등
단일행 NULL 관련 함수 종류
- NVL(표현식1, 표현식2) : 표현식 1 이 NULL 이면 표현식 2 출력
- NVL2(표현식1, 표현식2, 표현식3) : 표현식1 이 NULL이면 표현식3, 아니면 표현식2 출력
- NULLIF(표현식1, 표현식2) : 표현식1==표현식2 면 NULL 리턴, 표현식1<>표현식2 면 표현식1 리턴
- COALESCE(표현식1, 표현식2) : 임의의 개수 표현식 중 NULL이 아닌 표현식 들을 리턴 (병합)
WHERE 절
- 조건식
- 칼럼명 비교연산자 문자,숫자,표현식 비교칼럼명(JOIN 사용시) - 순
연산자 종류
- 비교
- =
- >
- >=
- <
- <=
- SQL
- BETWEEN a AND b
- IN (list)
- LIKE ‘비교문자열’
- IS NULL
- 논리
- AND
- OR
- NOT
- 부정 비교
- !=
- ^=
- <>
- NOT=
- 부정 SQL
- NOT BETWEEN a AND b
- NOT IN (list)
- IS NOT NULL
참고
- 오라클에 ‘’ 입력하면 NULL로 입력되어 조회하려면 IS NULL 조건으로 조회해야 함
- SQL에서는 ‘‘로 저장 및 조회 가능
조건
- 검색 CASE 표현식 : 개별 조건 확인하고 반환
- 단순 CASE 표현식 : 표현식 값 기준, 여러 조건을 확인
- DECODE : 여러 조건 비교하고 일치하는 조건의 결과 반환
GROUP BY, HAVING 절
- 일반적으로 집계 함수는 GROUP BY 절과 같이 사용되지만 테이블 전체가 하나의 그룹이 되는 경우에는 GROUP BY 절 없이 단독으로 사용 가능함
- GROUP BY 절을 통해 소그룹 별 기준을 정한 후, SELECT 절에 집계 함수를 사용함
- 집계 함수의 통계 정보는 NULL을 제외하고 수행됨
- SELECT 절과 달리 ALIAS 사용 불가
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 사용한 조건을 표시함
- GROUP BY 절에 의한 소그룹 별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 만족하는 내용만 출력함
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치하지만 GROUP BY 가 없어도 사용 가능
집계 함수
- WHERE 절에는 집계함수 사용 불가
- COUNT(*)
- COUNT
- SUM
- AVG
- MAX
- MIN
- STDDEV (표준 편차)
- CARIANCE/VAR (재무 함수)
ORDER BY 절
- 기본적인 정렬 순서는 ASC
- 오라클에서 NULL은 최댓값, SQL에서는 최솟값
- SELECT 절에서 오직 한 개만 사용 가능
조인
- 두 개의 테이블을 서로 묶어서 하나의 결과를 리턴
- 일반적으로 조인은 PK와 FK의 연관성에 의해 성립됨 (특정 경우 논리적인 값들의 연관만으로도 가능)
- DBMS 옵티마이저는 FROM 절에 나열된 데이터 들을 항상 2개로 묶어서 처리함
- EQUI JOIN : 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치하는 행을 연결해서 결과를 리턴
- NON-EQUI JOIN : JOIN 조건을 ‘=’ 연산자 이외의 비교 연산자를 사용하는 것
- EQUI JOIN 은 조인에 관여하는 테이블 들의 값이 정확하게 일치할 때 ‘=’ 이 사용됨, 이외의 경우는 NON-EQUI JOIN임
표준 조인
- INNER JOIN : 디폴트, 쉼표 혹은 조건절로 수행, 두 테이블 모두 지정한 열의 데이터 리턴
- NATURAL JOIN : 오라클, 두 테이블의 동일한 컬럼명을 갖는 컬럼 조인
- USING 조건절 / ON 조건절 : 오라클, 자연 조인에서 동일한 컬럼명이 둘 이상인 경우 사용
- CROSS JOIN : 카타시안 조합, 두 테이블의 모든 행을 조인
- OUTER JOIN : 두 테이블 중 한 쪽만 있어도 리턴
출처 : 혼공
SQL 활용
서브 쿼리
- 다른 쿼리 내부에 포함된 SELECT 문
- 연관 서브쿼리 : 서브 쿼리가 메인 쿼리 컬럼을 가짐
- 비연관 서브쿼리 : 메인 쿼리에 값을 제공하기 위한 목적으로 사용
- 단일 행 서브쿼리 : 실행 결과가 항상 1건 이하, 단일 행 비교 연산자(=, <, <=, >, =>, <>)와 사용
- 다중 행 서브쿼리 : 실행 결과가 여러 건인 서브쿼리, 다중 행 비교 연산자와 함께 사용
- IN : 결과에 값이 포함되는 지 확인 (OR 조건)
- ANY : 결과 중 하나라도 조건을 만족하는 지 확인
- ALL : 모든 값이 조건을 만족하는 지 확인
- EXISTS : 결과가 존재하는 지 확인
- 다중 컬럼 서브쿼리 : 여러 컬럼 반환, 메인 쿼리 조건절에 따라 여러 컬럼 동시 비교 가능
- 스칼라 서브쿼리 : SELECT 절에서 사용, 한 행, 한 컬럼만 리턴하는 서브쿼리
- 인라인 뷰 (동적 뷰) : FROM 절에서 사용, 서브쿼리를 임시 테이블 처럼 사용
- 뷰 사용 장점
- 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램을 변경하지 않아도 됨
- 편리성 : 복잡한 질의를 단순하게 작성 가능
- 보안성 : 숨기고 싶은 정보를 제외하고 구성 가능
- 뷰 사용 장점
- 서브쿼리는 HAVING, ORDER BY 절 등에서도 사용 가능
집합 연산자
- UNION : 중복 제거
- UNION ALL : 결과 전부 합침
- INTERSECT : 중복 제거 교집합 리턴
- EXCEPT : 중복 제거 차집합 리턴
그룹 함수
- NULL 빼고 집계됨, 결과값 없는 행 출력 안함
- 표현식
- ROLL UP(1, 2) : 1과 2 별 소계, 1별 소계, 총 합계 리턴 (계층 구조, 순서 바뀌면 결과 값 바뀜)
- CUBE(1, 2) : 1과 2 별 소계, 1 별 소계, 2 별 소계, 총 합계 리턴 (순서 무관)
- GROUPING SETS(1, 2…) : 명시적으로 집계할 조합 지정, 1별 소계, 2 별 소계… (순서 무관)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 부서, 직급, SUM(급여)
FROM 직원
GROUP BY ROLLUP(부서, 직급);
-> 각 부서와 직급별 급여의 합계를 보여주고, 각 부서의 총 급여와 전체 급여의 합계도 포함
SELECT 부서, 직급, SUM(급여)
FROM 직원
GROUP BY CUBE(부서, 직급);
-> 각 부서와 직급별 급여의 합계를 보여주고, 각 부서, 각 직급별 총 급여 및 전체 총 급여도 포함
SELECT 부서, 직급, SUM(급여)
FROM 직원
GROUP BY GROUPING SETS (
(부서, 직급),
(부서),
()
);
-> 각 부서와 직급별 급여 합계, 각 부서의 총 급여, 전체 총 급여를 포함
윈도우 함수
- 행과 행 간의 관계를 정의
- 순위, 합계, 평균, 행 위치 등 조작
- 결과에 대한 처리로, 결과 건수에 영향을 미치지 않음
윈도우 함수 종류
- 순위
- ROW_NUMBER / RANK / DENSE_RANK
- 집계
- SUM / AVG / MAX / MIN / COUNT
- 행 순서
- FIRST_VALUE / LAST_VALUE / LAG / LEAD
- 비율
- PERCENT_RANK (행 순서별 백분율) / CUME_DIST (건수 누적 백분율) / NTILE (전체 건수를 주어진 인자로 N 등분)
윈도잉 절
- SELECT 윈도우함수 (A) OVER (PARTITION BY 컬럼 ORDER BY 컬럼 윈도잉절) FROM 테이블
- BETWEEN a AND b : 프레임 범위 지정
- UNBOUNDED PRECEDING/FOLLOWING : 프레임 시작/끝을 현재 윈도우 그룹의 처음/마지막 행으로 설정
- N PRECEDING/FOLLOWING : 현재 행을 기준으로 지정된 수 만큼 이전/이후의 행을 리턴
- CURRENT ROW : 현재 행을 기준으로 윈도우 프레임 설정
Top N 쿼리
- 조건에 맞는 최상위 데이터를 N개 혹은 최하위 데이터를 N개 조회하는 쿼리
- ORDER BY : 데이터 정렬
- LIMIT : 정렬된 결과에서 상위 N개 행 선택
- FETCH : 결과 집합에서 상위 N개 행 선택
- TOP(n) WITH TIES : 값이 동일한 경우 함께 출력
계층형 질의와 셀프 조인
계층형 질의
- SQL 에서 테이블 내에 계층 구조를 표현할 때 사용하는 기법
- 함수
- CONNECT BY : 트리 형태의 구조로 쿼리 수행
- START WITH : 계층 구조 전개의 시작 위치(최상위 행) 지정
- CONNECT_BY ROOT/ISLEAF : 최상위/하위 계층 값 으로 쿼리 수행
- SYS_CONNECT_BY_PATH : 계층 구조로 형성된 데이터 조회
- ORDER BY SIBLINGS BY : 형제 노드 사이에서 정렬
- SQL Server에서 계층형 질의문은 CTE(Common Table EXPRESSION)를 재귀호출 함으로써 계층 구조를 전개함
- CTE : 공통 테이블 식, SELECT 문을 미리 정의해 이름을 붙인 후, 이어지는 쿼리에서 테이블처럼 사용하는 기능
- 앵커 멤버를 실행하여 기본 결과의 집합을 만들고 이후 재귀 멤버를 지속적으로 실행함
- 앵커 멤버 : 재귀 CTE의 첫 번째 호출, 집합 연산자로 연결된 하나 이상 쿼리 정의로 구성, 다른 CTE를 참조하지 않는 경우 앵커 멤버로 간주
- 오라클의 계층형 질의문에서 WHERE 절은 모든 전개를 진행한 후 필터 조건으로서 조건을 만족하는 데이터만 추출하는 데 활용됨
- PRIOR 키워드는 CONNECT BY 절 뿐만 아니라 SELECT, WHERE 절에서도 사용 가능
셀프 조인
- 동일 테이블 사이의 조인
- 식별을 위해 반드시 테이블 ALIAS 사용
1
2
3
4
5
셀프 조인 예시
SELECT ALIAS명1.컬럼명, ALIAS명2.컬럼명 ...
FROM 테이블 ALIAS명1, 테이블 ALIAS명2
WHERE ALIAS명1.컬럼명2 = ALIAS명2.컬럼명1;
관리 구문
- 제약 조건 종류 : PRIMARY KEY / UNIQUE KEY (NULL 허용, 주식별자 중 하나) / NOT NULL / CHECK / FOREIGN KEY
1
2
3
4
기본키 할당
ALTER TABLE 테이블명 ADD CONSTRAINT
constraint_name PRIMARY KEY (컬럼명1, 컬럼명2)
DELETE(MODIFY) ACTION
- Cascade : 상위 삭제 시 자식 동시 삭제
- SET NULL / SET Default : NULL 값 처리 / 기본 값 처리
- Restrict : 자식 테이블에 PK 값 없는 경우에만 상위 삭제 가능
- No Action : 참조무결성 위반하는 삭제나 수정 액션 불가
INSERT ACTION
- Automatic : Master PK 자동 생성 후 Child 입력
- SET NULL / Default : PK 없으면 NULL 값 처리 / 기본값 처리
- Dependent : Master 테이블에 PK가 존재할 때만 Child 입력 허용
- No Action : 참조무결성 위반 액션 불가
DML
- SELECT / INSERT / DELETE / UPDATE / MERGE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[삽입]
INSERT INTO 테이블명 컬럼명 VALUES(리스트);
[수정]
UPDATE 테이블명 SET 컬럼명=데이터 WHERE 조건;
UPDATE 테이블명 SET (컬럼명=데이터, 컬럼명=데이터, 컬럼명=데이터) WHERE 조건;
[삭제]
DELETE FROM 테이블명 WHERE 조건;
[병합]
MERGE INTO 타겟테이블명
USING 비교테이블명
ON 조건;
-> 조건에 따라 타겟을 비교와 병합
DDL
- CREATE / ALTER / DROP / TRUNCATE / RENAME
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 {DEFAULT} {제약조건};
ALTER TABLE 테이블명 ADD CONSTRAINT 제약속성명 제약조건 {컬럼명};
[컬럼 수정 ORACLE = MODIFY]
ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입 {DEFAULT} {제약조건};
-> 동시 여러 개 불가
[컬럼 수정 SQL = ALTER COLUMN]
ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 데이터타입 {DEFAULT} {제약조건};
-> 동시 여러 개 불가
[테이블 삭제]
DROP TABLE 테이블명;
DROP TABLE 테이블명 CASCADE CONSTRAINT;
-> 해당 테이블에 FK가 존재해서 다른 엔티티를 참조 중이면 DROP 불가능
-> CASCADE CONSTRAINT = 참조 제약조건을 모두 삭제하면서 동시에 삭제
[컬럼 삭제]
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
[테이블 값 초기화]
TRUNCATE TABLE 테이블명;
[테이블 이름 변경]
RENAME TABLE 변경전이름 TO 변경후이름;
[컬럼 이름 변경]
ALTER TABLE 테이블명 RENAME COLUMN 기존컬럼명 TO 변경컬럼명;
DCL
- GRANT / REVOKE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[권한 추가]
GRANT CREATE TABLE TO 사용자명;
GRANT SELETE ON 테이블명 TO 사용자명;
GRANT INSERT ON 테이블명 TO 사용자명;
-> 모든 권한일 때 = ALL
[권한 취소]
REVOKE 권한명 FROM 사용자명;
[ROLE 권한 부여]
CREATE ROLE 역할명;
GRANT CREATE SESSION, CREATE USER, CREATE TABLE TO 역할명;
GRANT 역할명 TO 사용자명;
TCL
- COMMIT / ROLLBACK
- 트랜잭션 특성 ACID
- 원자성 : 모두 실행 OR 다 안됨
- 일관성 : 이전 이후 데이터 동일
- 고립성 : 연산 중 영향 X
- 지속성 : 성공 시 영구 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE SAMPLE1 (COL1 NUMBER, COL2 NUMBER);
INSERT INTO SAMPLE1 VALUES(10,10);
CREATE TABLE SAMPLE2 (COL1 NUMBER, COL2 NUMBER);
INSERT INTO SAMPLE2 VALUES(10,30);
ROLLBACK; --> 여기서 롤백 발동
INSERT INTO SAMPLE2 VALUES(20,40);
COMMIT;
-> 이 경우 CREATE 는 DDL, AUTO 커밋이 이루어져서 저장되고
별도의 ROLLBACK 포인트 없기 때문에 SAMPLE2 테이블 만든 뒤로 이동 후
SAMPLE2 테이블에 10, 30 삽입만 롤백됨
-> 결과
SAMPLE1 = (10, 10)
SAMPLE2 = (20, 40)
DB 키 종류
- 기본키 : 엔티티 대표 키 (NULL 불가)
- 후보키 : 유일성과 최소성 만족
- 슈퍼키 : 유일성 만족
- 대체키 : 기본키 제외 나머지
- 외래키 : 여러 테이블의 기본 키 필드, 참조 무결성 확인 위해 사용 (NULL 가능)
- 고유키 : 고유한 값 보장 (NULL 1개만 가능)
연산자 우선 순위
- 괄호 - NOT - 비교 연산자 및 SQL 연산자 - AND - OR
DELETE / DROP / TRUNCATE 차이
- DELETE
- 데이터 일부 또는 전체 삭제
- 롤백 가능
- UNDO 데이터 생성 -> 느림
- DROP - AUTO 커밋
- 데이터와 구조를 동시 삭제
- 즉시 반영
- 롤백 불가능
- TRUNCATE - AUTO 커밋
- 데이터만 초기화, 구조는 그대로
- 즉시 반영
- 롤백 불가능
- UNDO 데이터 생성 X -> 빠름
이 블로그는 저작권자의 CC BY 4.0 라이센스를 따릅니다.