일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Leedcode
- dfs
- SinglyLinkedList
- graph
- ArrayList vs LinkedList
- LinkedList
- String
- Hashtable
- sorting
- hash
- python3
- heap
- VCS
- array
- 광연자동차운전면허학원
- hash table
- 자료구조
- Medium
- BFS
- DailyLeetCoding
- Easy
- Bellman-Ford
- Union Find
- stack
- Java
- A* Algorithm
- leetcode
- Two Pointers
- 구현
- greedy
- Today
- Total
Min IT's Devlog
[SQLD] 2-1 SQL 기본 본문
제1절 관계형 데이터베이스 개요
DBMS
- 효율적인 데이터의 관리뿐만 아니라 예기치 못한 사건으로 인한 데이터의 손상을 피하고, 필요시 데이터를 복구하기 위한 강력한 기능의 소프트웨어
관계형 데이터베이스
- 정규화를 통한 합리적인 테이블 모델링을 통해 이상 현상을 제거하고 데이터 중복을 피할 수 있으며 동시성 관리, 병행 제어를 통해 많은 사용자들이 동시에 데이터를 공유 및 조작할 수 있는 기능 제공
- 메타 데이터를 총괄 관리가 가능하여 데이터의 성격, 속성 또는 표현 방법 등을 체계화할 수 있고 데이터 표준화를 통한 데이터 품질을 확보할 수 있는 장점을 지님
- 인증된 사용자만이 참조할 수 있도록 보안 기능 제공
- 제약조건을 이용하여 조건에 위배된 데이터 입력이나 관계를 연결하는 중요 데이터를 삭제하는 것을 방지
- 갑작스러운 장애로부터 commit과 rollback 기능을 제공
SQL
- RDB에서 데이터의 정의, 데이터의 조작, 데이터의 제어를 하기 위해 사용하는 언어
- SQL > 정확한 데이터를 출력하는 것이 목표 / SQL 튜닝 > 시스템에 큰 영향을 주는 SQL을 가장 효과적으로 작성 목표
- 데이터를 집합으로써 취급
테이블
- 어느 특정한 주체와 목적으로 만들어지는 일종의 집합
- 데이터를 저장하는 객체로 RDB의 기본 단위
카디널리티 - 튜플의 개수
차수 - 속성의 개수
정규화
- 테이블을 분할하여 데이터의 불필요한 중복을 줄이는 것
- 데이터의 정합성 확보와 데이터 입력/수정/삭제시 발생할 수 있는 이상현상 방지
ERD
- 엔티티, 관계, 속성으로 이루어짐
IE표기법
> 실선: 식별관계/ 점선: 비식별관계
Barker 표기법
> 수직바: 식별관계
제2절 DDL
- 테이블을 생성하고 생성된 테이블의 구조를 변경하는 명령어
- 직접 DB의 테이블에 영향을 미치기에 명령어를 입력하는 순간 명령어에 해당하는 작업이 즉시 완료(AUTO COMMIT)
숫자 타입
ANSI/ISO - NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION
- Oracle과 SQL Server 사이의 DATATYPE빼고는 CREATE TABLE에서의 구문 차이점은 없음
주의할 점
- 1) 테이블명은 객체를 의미할 수 있는 적절한 이름을 사용. 가능한 단수형 권고
- 2) 테이블명은 다른 테이블의 이름과 중복되지 않아야함
- 3) 한 테이블 내에 칼럼명이 중복되게 지정 불가
- 4) 테이블 이름을 지정하고 각 칼럼들은 괄호를 묶어 지정
- 5) 각 칼럼들은 콤마로 구분되고 테이블 생성문의 끝은 항상 세미콜론으로 끝남
- 6) 칼럼에 대해서는 다른 테이블까지 고려하여 데이터베이스 내에서는 일관성 있게 사용하는 것이 좋다
- 7) 칼럼 뒤에 데이터 유형은 꼭 지정되어야 함
- 8) 테이블명과 칼럼명은 문자로 시작해야 하며 벤더별로 길이에 대한 한계 존재
- 9) 벤더에서 사전에 정의한 예약어는 쓸 수 없음
- 10) A-Z a-z 0-9 _ $ # 문자만 허용
- 한 테이블 안에서 칼럼 명은 달라야 하지만 다른 테이블의 칼럼명과는 같을 수 있음
주의사항
- 테이블 생성시 대/소문자 구분 안하고 기본적으로 테이블이나 칼럼명은 대문자로 만들어짐
- DATETIME 데이터 유형에는 별도로 크기를 지정x
- 문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시해야함
- 칼럼과 칼럼의 구분은 콤마로 하되, 마지막 칼럼은 콤마를 찍지 않음
- 칼럼에 대한 제약조건이 있으면 CONSTRAINT를 이용하여 추가할 수 있음
-> 칼럼 level에서의 정의 방식 / 테이블 생성 마지막에 모든 제약조건을 기술하는 테이블 level 정의 방식
제약조건
- 데이터의 무결성을 유지하기 위한 데이터베이스의 보편적인 방법으로 테이블의 특정 칼럼에 설정하는 제약
NULL의 의미 - 아직 정의되지 않은 미지의 값 or 현재 데이터를 입력하지 못하는 경우
DEFAULT의 의미 - 데이터 입력시 명시된 값을 지정하지 않은 경우 NULL 값이 입력되고 DEFAULT값을 정의했다면 해당 칼럼에 NULL 값이 입력되지 않고 사전에 정의된 기본 값이 자동으로 입력
생성된 테이블 구조 확인
Oracle - DESCRIBE 테이블명/ DESC 테이블명
SQL Server - sp_help 'dbo.테이블명'
SELECT 문장을 통한 테이블 생성 사례
- CTAS( CREATE TABLE ~ AS SELECT ~) => 칼럼별로 데이터 유형을 다시 재정의하지 않아도 됨
=> 기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용이 되고 PK, Unique, FK, CHECK등 다른 제약조건이 없어짐 => ALTER TABLE기능 사용 필요
- SQL Server에서는 SELECT ~ INTO를 활용( IDENTITY를 칼럼 속성으로 사용하면 IDENTITY 속성까지 적용)
ALTER TABLE
- 중간에 테이블을 변경(칼럼의 추가/삭제, 제약조건의 추가/삭제)해야하는 경우 사용
ADD COLUMN
- 기존 테이블에 필요한 칼럼을 추가하는 명령
DROP COLUMN
- 테이블에서 필요없는 칼럼을 삭제할 수 있으며, 데이터가 있거나 없거나 모두 삭제 가능
- 한 번에 하나의 칼럼만 삭제하며 칼럼 삭제 후 최소 하나 이상의 칼럼이 테이블에 존재해야함
- 한 번 삭제된 칼럼은 복구 불가
- SQL Server도 동일하다
MODIFY COLUMN
- ALTER TABLE 명령을 이용해 칼럼의 데이터 유형, 디폴트 값, NOT NULL 제약조건에 대해 변경을 포함 가능
주의 사항
- 해당 칼럼의 크기를 늘릴 수 있으나 줄이지는 못함(기존 데이터 훼손)
- 해당 칼럼이 NULL값만 가지고 있거나 테이블에 아무 행도 없으면 칼럼 폭을 줄일 수 있다(해당 칼럼이 NULL값만 있는 경우도 가능)
- 해당 칼럼의 DEFAULT 값을 바꾸면 변경 작업 이후 발생하는 행 삽입에만 영향을 미침
- 해당 칼럼에 NULL값이 없을 경우만 NOT NULL 제약조건을 추가가능
RENAME COLUMN
- 테이블을 생성하면서 만들어진 칼럼명을 어떤 이유로 불가피하게 변경해야 하는 경우 쓰임
- 일부 DBMS에서만 지원하는 기능
DROP CONSTRAINT
- 테이블 생성 시 부여했던 제약조건을 삭제하는 명령어 형태
ADD CONSTRAINT
- 테이블 생성 이후에 필요에 의해 제약조건을 추가
RENAME TABLE
- 테이블의 이름을 변경
DROP TAABLE
- 테이블을 잘못 만들었거나 테이블이 더이상 필요 없을 경우 해당 테이블을 삭제
TRUNCATE TABLE
- 해당 테이블에 들어있던 모든 행들이 제거되고 저장 공간을 재사용 가능하도록 해제
- 테이블의 전체 데이터를 삭제하는 경우 DELETE TABLE보다 TRUNCATE TABLE을 권고
- 다만 TRUNCATE TABLE의 경우 정상적인 복구가 불가
> 삭제된 데이터의 로그가 없어 ROLLBACK이 불가하나 SQL Server의 경우 트랜잭션을 실행후 TRUNCATE TABLE을 이용하여 데이터를 삭제한 이후 오류가 발견되어 복구를 원할 때 ROLLBACK으로 되돌릴 수 있음.
제3절 DML
- 만들어진 테이블에 관리하기를 원하는 자료들을 입력, 수정, 삭제, 조회하는 기능
- 조작하려는 테이블을 메모리 버퍼에 올려놓고 작업을 하기 때문에 실시간으로 테이블에 영향을 미치지 않음
> 버퍼에서 처리한 DML 명령어가 실제 테이블에 반영되기 위해 COMMIT 명령어로 TRANSACTION을 종료해야함
> SQL Server의 경우 DML도 AUTO COMMIT으로 처리되기에 실제 테이블에 반영하기 위한 COMMIT명령어 필요x
INSERT
- 해당 칼럼명과 입력되어야 하는 값을 1:1로 매핑하여 입력
- 해당 칼럼의 유형이 CHAR나 VARCHAR2의 경우 ''로 입력해야 하나 숫자인 경우 그냥 입력
- 첫 번째 유형은 테이블의 칼럼 정의가 가능하며 칼럼 순서는 테이블의 칼럼 순서와 매치할 필요없음 NULL값이 입력
> PK나 NOT NULL로 지정된 칼럼은 NULL 허용x
- 두 번째 유형은 모든 칼럼에 데이터를 입력하는 경우로 칼럼의 순서대로 빠짐없이 데이터가 입력
UPDATE
- 입력한 정보 중 잘못 입력되거나 변경이 발생하여 정보를 수정해야 하는 경우 발생
DELETE
- 테이블의 정보가 필요없게 되었을 경우 데이터 삭제를 수정
- FROM의 경우 생략이 가능하며 WHERE절을 사용하지 않으면 전체 데이터 삭제
SELECT
WILDCARD > *를 통해 모든 칼럼정보를 확인가능
ALIAS 부여
- 칼럼명 바로 뒤에 온다
- 칼럼명과 ALIAS 사이에 AS 키워드를 사용할 수 있음
- 이중 인용부호는 ALLIAS가 공백, 특수문자를 포함할 경우와 대소문자 구분이 필요할 경우 사용
- 칼럼 별명 적용시 공백이 들어가는 경우 " "(ORACLE) " " ' ' [ ](SQL Server)
산술 연산자
- 산술 연산을 사용하거나 특정 함수 적용시 칼럼의 label이 길어져 alias 부여 필요
- () * / + -의 연산자 우선순위를 가짐
합성 연산자
- 문자와 문자를 연결하는 경우 2개의 수직 바에 의해 이루어짐(Oracle)
- 문자와 문자를 연결하는 경우 + 표시에 의해 이루어짐 (SQL Server)
- 두 벤더 공통적으로 CONCAT(STRING1, STRING2) 함수 사용 가능
- 칼럼과 문자 또는 다른 칼럼과 연결
- 문자 표현식의 결과에 의해 새로운 칼럼을 생성
제4절 TCL
트랜잭션
- 데이터베이스의 논리적 연산단위
- 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작 => 전부 다 적용되거나 전부 취소
- 하나 이상의 SQL 문장이 포함
- COMMIT - 올바르게 반영된 데이터를 db에 반영시키는 것
- ROLLBACK - 트랜잭션 시작 이전의 상태로 되돌리는 것
- SAVEPOINT - 저장점 기능
트랜잭션의 특성
잠금 - 트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법
COMMIT
- 입력한 자료나 수정한 자료에 대해 또는 삭제한 자료에 대해 문제가 없는 경우 COMMIT을 통하여 트랜잭션 완료
- INSERT, UPDATE, DELETE 후에 변경 작업이 완료되었음을 DB에 알림
이전 상태
- 단지 메모리 버퍼에만 영향을 받았기에 이전 상태로 복구 가능
- 현재 사용자는 SELECT 문으로 결과 확인 가능/ 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없음
- 변경된 행은 잠금이 설정되어 다른 사용자가 변경 불가
이후 상태
- 데이터에 대한 변경 사항이 DB에 반영
- 이전 데이터는 잃어버림
- 모든 사용자는 결과를 볼 수 있음
- 관련된 행에 대한 잠금이 풀리고 다른 사용자가 행을 조작 가능
SQL Server의 COMMIT
- ORACLE은 DML 실행시 DBMS가 트랜잭션을 내부적으로 실행하여 DML 수행후 COMMIT혹은 ROLLBACK을 수행해야 트랜잭션이 종료
- SQL Server는 기본적으로 AUTO COMMIT이기에 사용자가 COMMIT이나 ROLLBACK을 할 필요없음
> 성공이면 자동으로 COMMIT이 되고 오류 발생시 자동으로 ROLLBACK처리됨
SQL Server 트랜잭션 처리 방식
1)AUTO COMMIT
- SQL Server의 기본 방식
- DML DDL을 수행할 때마다 DBMS가 트랜잭션을 컨트롤( 성공시 자동 COMMIT, 오류시 자동 ROLLBACK)
2)암시적 트랜잭션
- Oracle과 같은 방식
- 트랜잭션의 시작은 DBMS가 처리하고 트랜잭션의 끝은 명시적으로 Commit 또는 Rollback으로 처리
- 인스턴스 단위 혹은 세션단위로 설정 가능
3) 명시적 트랜잭션
- 트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식
- BEGIN TRANSACTION으로 트랜잭션을 시작하고 COMMIT이나 ROLLBACK으로 트랜잭션을 종료
- ROLLBACK을 만나면 BEGIN 시점까지 모두 ROLLBACK이 수행
ROLLBACK
- 테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터에 대해 commit 이전에는 변경 사항을 취소할 때
- 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복구되며 관련된 행에 대한 잠금이 풀려 다른 사용자들이 데이터 변경 가능
SQL Server의 ROLLBACK
- 임의적으로 ROLLBACK을 수행하려면 명시적으로 트랜잭션을 선언
COMMIT과 ROLLBACK의 효과
- 데이터 무결성 보장
- 영구적 변경을 하기 전 데이터의 변경 사항 확인 가능
- 논리적으로 연관된 작업을 그룹핑하여 처리 가능
SAVEPOINT
- 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 SAVEPOINT까지 트랜잭션 일부만 롤백
- 복수의 저장점을 저장할 수 있고 동일 이름으로 저장점 저의시 나중에 정의한 저장점이 유효
- DDL 실행시 그 전후 시점에 자동으로 커밋
- DML 문장 이후 커밋 없이 DDL 문장 실행시 DDL 수행 전에 자동으로 커밋
- 데이터베이스를 정상적으로 접속을 종료하면 자동으로 트랜잭션이 커밋
- 애플리케이션의 이상 종료로 데이터베이스와의 접속이 단절되었을 때 트랜잭션이 자동으로 롤백
제5절 WHERE 절
- WHERE 절에는 두 개 이상의 테이블에 대한 조인 조건을 기술하거나 결과를 제한하기 위한 조건 기술
- WHERE 조건절을 사용하지 않는 경우 시스템 자원을 과다하게 사용
> WHERE 절에 조건이 없는 FTS(FULL TABLE SCAN)문장은 SQL 튜닝의 1차적인 검토 대상
-> FTS가 무조건 나쁜 것은 아니며 병렬 처리 등을 이용해 유용하게 사용하는 경우도 많음
ORACLE - 필수적으로 SELECT FROM절
SQL SERVER - SELECT 목록에 상수, 변수 및 산술식 만 포함되는 경우 FROM 절이 필요없지만 테이블의 칼럼의 사용되는 경우 FROM 절이 필요
- 칼럼명, 비교 연산자, (문자,숫자,표현식), 비교 칼럼명(JOIN 사용시)
연산자 종류
- CHAR 변수나 VARCHAR2와 같은 문자형 타입을 가진 칼럼을 특정 값과 비교하기 위해 인용부호로 묶어 비교처리
SQL 연산자
NULL 특성
- NULL 값과의 수치연산은 NULL 값을 리턴
- NULL 값과의 비교연산은 거짓을 리턴
- 어떤 값과 비교할 수 없으며, 특정 값보다 크다, 적다라고 표현할 수 없다.
논리 연산자
부정 연산자
ROWNUM(ORACLE)
- SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호
- 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용
- ROWNUM의 용도는 테이블 내의 고유한 키나 인덱스 값을 만들 수 있음.
TOP( SQL Server)
Expresstion: 반환할 행의 수를 지정하는 숫자/ PERCENT: 쿠러 집합에서 처음 EXPERSSION%의 행만 반환
WITH TIES: ORDER BY 절이 지정된 경우에만 사용할 수 있으며 TOP N(PERCENT)의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정 가능
제6절 함수
함수 - 내장 함수(벤더에서 제공하는 함수) / 사용자가 정의할 수 있는 함수
내장함수 - 단일행 함수(함수의 입력 값이 단일행 값이 입력) 다중행 함수(여러 행의 값이 입력)
다중행 함수 - 집계 함수, 그룹 함수, 윈도우 함수
- 입력되는 값이 아무리 많아도 출력은 하나만 된다는 M:1 관계라는 특성을 가짐
- 단일행 함수도 단일행 내에 있는 하나의 값 또는 여러 값이 입력 인수로 표현
- 다중행 함수도 여러 레코드의 값들을 입력 인수로 사용
단일행 함수 - 처리하는 데이터의 형식에 따라 문자형, 숫자형, 날짜형, 변환형, NULL관련 함수로 나눌 수 있음
- SELECT, WHERE, ORDER BY 절에서 사용 가능
- 각 행들에 대해 개별적으로 작용하여 데이터 값들을 조작하고 각각의 행에 대한 조작 결과를 리턴
- 여러 인자를 입력해도 단 하나의 결과만 리턴
- 함수의 인자로 상수, 변수, 표현식이 사용 가능하고, 하나의 인수를 가지는 경우도 있지만 여러 개의 인수를 가질 수 있음.
- 특별한 경우가 아니면 함수의 인자로 함수를 사용하는 함수의 중첩이 가능
문자형 함수
- 문자 데이터를 매개 변수로 받아들여서 문자나 숫자 값의 결과를 돌려주는 함수
- 몇몇은 문자형 함수의 경우 결과를 숫자로 리턴하는 함수도 있음.
숫자형 함수
- 숫자 데이터를 입력받아 처리하고 숫자를 리턴하는 함수
날짜형 함수
- DATE 타입의 값을 연산하는 함수
변환형 함수
- 특정 데이터 타입을 다양한 형식으로 출력하고 싶을 경우에 사용되는 함수
암시적 데이터 유형 변환 - 성능 저하가 발생할 수 있으며 자동적으로 db가 알아서 계산하지 않는 경우가 있어 에러를 발생할 수 있기에 명시적 데이터 유형 변환 방법을 사용하는 것이 바람직
명시적 데이터 유형 변환 함수
CASE 표현
- IF-THEN-ELSE 논리와 유사한 방식으로 표현식을 작성하여 SQL의 비교 연산 기능을 보완하는 특징
- 함수와 같은 성격을 가지고 있으며 ORACLE의 DECODE함수와 같은 기능을 함
NULL 관련 함수
- NULL 값은 아직 정의되지 않은 값으로 0이나 공백과는 다름
- 테이블 생성시 NOT NULL 또는 PK로 정의되지 않은 모든 데이터 유형은 널 값 포함가능
- 널 값을 포함하는 연산의 경우 결과 값도 널 값
- 결과값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL/ISNULL 함수를 사용
-> NULL값의 대상이 숫자 유형 데이터인 경우 주로 0, 문자 유형 데이터인 경우는 블랭크보다는 'X'같이 해당 시스템에 의미 없는 문자로 바꾸는 경우가 많음
NVL/ISNULL 함수
- 산술적인 계산에서 데이터 값이 NULL일 경우
- 칼럼간 계산을 수행하는 경우 해당 결과가 NULL이 되므로 원하는 결과를 얻을 수 없음
- NVL 함수를 사용하여 0으로 변환시킨 후 계산을 해서 원하는 데이터를 얻음
NVL(ORACLE)
ISNULL(SQL SERVER)
NULLIF
- EXPR1이 EXPR2와 같으면 NULL, 같이 않으면 EXPR1을 리턴
- 특정 값을 NULL로 대체하는 경우에 유용하게 사용
COALESCE
- 인수의 숫자가 한정되어 있지 않으면, 임의의 개수 EXPR1에서 NULL이 아닌 최초의 EXPR을 나타내며 모든 EXPR이 NULL이라면 NULL을 리턴
제7절 GROUP BY, HAVING 절
집계 함수
- 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 다중행 함수
- GROUP BY 절은 행들을 소그룹화 한다
- SELECT절, HAVING 절, ORDER BY 절에 사용가능
GROUP BY
- 데이터들을 작은 그룹으로 분류하여 소그룹에 대한 항목별로 통계정보를 얻을 때 추가로 사용
- GROUP BY 절을 통해 소그룹별로 기준을 정한 후 SELECT 절에 집계 함수를 사용
- 집계 함수의 통계정보는 NULL값을 가진 행을 제외하고 수행
- GROUP BY 절에서는 SELECT 절과 달리 ALIAS 명을 사용할 수 없음
- 집계 함수는 WHERE 절에는 올 수 없다.
- WHERE 절은 전체 데이터를 GROUP으로 나누기 전 행들을 미리 제거
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시가능
- GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치
- 원칙상 ORDER BY 절이 명시되어야 오름차순으로 정렬
CASE 표현 사용시 ELSE절을 생략하게 되면 Default 값이 null
- 집계함수의 특성을 이용하여 집계함수의 내부에 NVL/ISNULL을 사용하지 말 것
제8절 ORDER BY 절
ORDER BY절
- SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력
- 칼럼명 대신 SELECT 절에서 사용한 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능
- 기본적으로 오름차순이 적용되며 SQL 문장의 제일 마지막에 위치
- 기본적인 정렬 순서는 오름차순
- 숫자형 데이터 타입은 오름차순으로 정렬했을 경우 가장 작은 값부터 출력
- 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력
- Oracle에서는 NULL값을 가장 큰 값으로 간주하나 SQL Server에서는 가장 작은 값으로 간주
SELECT 문장 실행 순서
1. 발췌 대상의 테이블 참조(FROM)
2. 발췌 대상 데이터가 아닌 것은 제거(WHERE)
3. 행들을 소그룹화 한다.(GROUP BY)
4, 그룹핑된 값의 조건에 맞는 것만을 출력(HAVING)
5. 데이터 값을 출력/계산한다.( SELECT)
6. 데이터 정렬한다.(ORDER BY)
- FROM 절에 정의되지 않은 테이블의 칼럼은 다른 절에서 사용시 에러
- ORDER BY절에는 SELECT 목록에 나타나지 않은 문자형 항목 포함 가능
- SELECT DISTINCT나 GROUP BY절이나 SELECT문에 UNION이 있으면 열 정의가 SELECT 목록에 포함
- 관계형 DB가 데이터를 메모리에 올릴 때 행 단위로 모든 칼럼을 가져와 SELECT 절에서 일부 칼럼만 선택하더라도 ORDER BY 절에서 메모리에 올라와 있는 다른 칼럼의 데이터 사용 가능
- 서브쿼리의 SELECT 절에서 선택되지 않은 칼럼은 서브쿼리 범위를 넘어서면 더 이상 사용 불가
-GROUP BY 절에서 그룹핑 기준을 정의하면 GROUP BY 절의 그룹핑 기준에 사용된 칼럼과 집계 함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만든다
- GROUP BY절 사용시 개별 데이터는 저장하지 않기에 SELECT 절이나 ORDER BY절에서 개별 데이터 사용시 에러 발생
- SELECT 절에서는 그룹핑 기준과 숫자 형식 칼럼의 집계함수는 사용 가능하나 그룹핑 기준 외의 문자 형식 칼럼은 정할 수 없음
Top N 쿼리
ROWNUM
- 데이터의 일부가 먼저 추출된 후 데이터에 대한 정렬 작업이 일어남
TOP()
- 별도의 처리 없이 관련 ORDER BY 절의 데이터 정렬 후 원하는 일부 데이터만 쉽게 출력 가능
- WITH TIES > 마지막 행에 표시되는 추가 행의 데이터가 같을 경우 동일 정렬 순서 데이터 추가 반환
제9절 조인
- 두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
- 일반적으로 행들을 PK나 FK 값의 연관에 의해 JOIN이 성립/ 논리적인 값들의 연관만으로 JOIN 성립
- SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어남
- 테이블의 조인 순서는 옵티마이저에 의해 결정되고 이것이 주요 튜닝 포인트.
EQUI JOIN
- 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법
- 대부분 PK ↔ FK의 관계를 기반하며 WHERE절에 "=" 연산자를 사용해서 표현
ANSI/ISO SQL 표준 방식
- SELECT 구문에 단순히 칼럼명이 오지 않고 "테이블명.칼럼명"처럼 테이블명과 칼럼명이 같이 나타남
> JOIN하는 테이블에 같은 칼럼명이 존재하는 경우 파싱 단계에서 에러 발생
> 개발자나 사용자가 조회할 데이터가 어느 테이블에 있는 칼럼을 말하는 것인지 알 수 있게 함으로 SQL에 대한 가독성이나 유지보수성을 높이는 효과
- JOIN 조건은 대상 테이블의 개수에서 하나를 뺀 N-1개 이상이 필요
- FROM 절의 테이블에 대해서도 ALIAS를 사용 가능함.
- 테이블에 대한 ALIAS를 적용했을 경우 WHERE 절과 SELECT 절에서는 ALIAS를 사용해야함
NON EQUI JOIN
- 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우 사용
- BETWEEN > < >= <=등 연산자들을 사용하여 JOIN을 수행
- 데이터 모델에 따라 NON EQUI JOIN이 불가한 경우도 존재
JOIN의 이유
- 정규화 : 불필요한 데이터의 정합성을 확보하고 이상현상 발생을 피하기 위해 테이블을 분할하여 생성
- 하나의 테이블에 모든 데이터를 집중시켜 조회는 가능하나 추가/삭제/수정/데이터 정합성의 비용이 크다
- JOIN을 잘못 기술할 경우 시스템 자원 부족이나 과다한 응답시간 지연을 발생시킴
'자격증 > SQLD(완료)' 카테고리의 다른 글
[SQLD] extra1. 정규화 (0) | 2022.02.22 |
---|---|
[SQLD] 2-3 SQL 최적화 기본 원리 (0) | 2022.02.20 |
[SQLD] 2-2 SQL 활용 (0) | 2022.02.17 |
[SQLD] 1-2 데이터 모델링과 성능 (0) | 2022.02.14 |
[SQLD] 1-1 데이터 모델링의 이해 (0) | 2022.02.11 |