본문 바로가기

DB

[SQLD] 2과목 - 1장 SQL 기본 및 활용 요약

한국데이터산업진흥원 게시자료에 기반한 요약 정리

 

2과목 SQL 기본 및 활용

1장 SQL 기본

 

 


 

1절 관계형 DB 개요

 
데이터베이스(DB)

특정 기업이나 조직 또는 개인이 필요에 의해 데이터를 일정한 형태로 저장해 놓은 것,
DBMS를 이용하여 효율적인 데이터 관리와 데이터 손상 복구 가능
 
🔍 DB 종류
1. 계층형 DB
트리 형태의 자료구조에 데이터 저장,
1:N 관계 표현
 
2. 네트워크형 DB
오너와 멤버 형태로 데이터 저장,
M:N 관계 표현
 
3. 관계형 DB
릴레이션에 데이터 저장,
집합 연산과 관계 연산 가능

 

릴레이션? 릴레이션이란 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이다. 결국, 릴레이션은 DB 테이블이다.

 

관계형 데이터베이스(RDB; Relational Database)

1) 정규화를 통해 이상현상 중복 데이터 제거
2) 동시성 관리와 병행 제어를 통해 데이터 동시 조작 가능
 
집합 연산
- 합집합(Union)
- 차집합(Difference)
- 교집합(Intersection)
- 곱집합(Cartesian Product) : 각 릴레이션에 존재하는 모든 데이터를 조합
 
관계 연산
- 선택 연산(Selection): 조건에 맞는 행(튜플) 조회
- 투영 연산(Projection): 조건에 맞는 칼럼(속성) 조회
- 결합 연산(Join): 공통 속성을 사용하여 새로운 릴레이션 생성
- 나누기 연산(Division): 공통요소를 추출하고 분모 릴레이션의 속성을 삭제한 후 중복된 행 제거
 
 

SQL(Structured Query Language)

RDB에서 사용하는 언어,
데이터 조회 및 신규 데이터 입력/수정/삭제 기능 제공
 


SQL 종류
- DML(Data Manipulation Language, 데이터 조작어) : ISUD
▶ SELECT: 데이터 조회 명령어
▶ INSERT, UPDATE, DELETE: 데이터 변형 명령어
 
- DDL(Data Definition Language, 데이터 정의어)

데이터 구조 관련 명령어 - CA_D
▶ CREATE, ALTER, DROP
 
- DCL(Data Control Language, 데이터 제어어)

DB 접근 권한 부여 및 회수 명령어
▶ GRANT, REVOKE
 
- TCL(Transaction Control Language, 트랜잭션 제어어)

DML로 조작한 결과를 논리적인 작업단위 별로 제어
▶ COMMIT, ROLLBACK
 
 

테이블(Table)

RDB의 기본 단위,
데이터를 저장하는 객체,
칼럼과 행의 2차원 구조

 

 

정규화? 테이블을 분할하여 데이터의 불필요한 중복을 줄여, 정합성 확보

 

 

2절 DDL

 
데이터 타입

- CHAR(L)

고정 길이 문자열, 할당된 변수 값의 길이가 L 이하일 때 차이는 공백으로 채워짐

- VARCHAR2(L), VARCHAR(L) 

가변 길이 문자열, 할당되는 변수 값의 길이의 최대값이 L임, 문자열은 가능한 최대 길이로 설정

- NUMBER(L,D) 

숫자형 (L은 전체 자리 수 D는 소수점 자리 수)
SQL Server은 NUMERIC DECIMAL FLOAT REAL 등

- DATE, DATETIME 

날짜형, 데이터 크기 지정이 필요하지 않음
 
 

✅ CREATE TABLE

테이블 생성
SQL>> CREATE TABLE 테이블명 (칼럼명 데이터타입 제약조건, …);

 
🔍 테이블 및 칼럼 명명 규칙
 1) 알파벳 2) 숫자 3) ‘_’(언더바) 4) ‘$’(달러) 5) ‘#’(샵) 사용
 대소문자 구분하지 않음
테이블명은 단수형 권고
 

🔍제약조건 (CONSTRAINT)
데이터 무결성 유지가 목적,
복제 테이블에는 기존 테이블 제약조건 중 NOT NULL만 적용

CONSTRAINT 이용하여 추가 가능

SQL>> CREATE TABLE 테이블명 (칼럼명 데이터타입 CONSTRAINT  제약조건, …);

SQL>>  ALTER TABLE 테이블명 ADD CONSTRAINT 칼럼명 FOREIGN KEY (칼럼명) REFERENCES 테이블명(칼럼명);
 
1) PRIMARY KEY (기본키)

행 데이터를 고유하게 식별하기 위한 기본키,
테이블 당 하나의 기본키만 정의 가능,
기본키 생성시 DBMS가 자동으로 UNIQUE 인덱스를 생성함,
NULL 입력 불가

* 기본키 제약 = 고유키 제약 & NOT NULL 제약
 
2) FOREIGN KEY (외래키)

관계형 DB에서 테이블간의 관계를 정의하기 위해 사용
다른 테이블의 기본키를 외래키로 지정,
참조 무결성 제약 옵션 선택 가능
 
3) UNIQUE KEY (고유키)

행 데이터를 고유하게 식별하기 위한 고유키,
NULL 가능
 
4) NOT NULL

NULL 입력 불가
NULL과의 1) 수치연산은 NULL 2) 비교연산은 FALSE 출력 


5) CHECK
입력할 수 있는 값의 범위 등 제한

 

- NULL 

아직 정의되지 않은 미지의 값

현재 데이터를 입력하지 못하는 경우

NULL != '' (공백)

NULL != 0 

0은 숫자이고,
공백은 하나의 문자이다.

 

- DEFAULT (기본 값)

데이터 입력 시, 칼럼의 값이 지정되어 있지 않을 경우 기본값(DEFAULT) 사전 설정 가능

 

 

🔍 생성된 테이블 구조 확인

테이블 생성 이후 테이블 구조가 제대로 만들어졌는지 확인 할 때 


DESCRIBE 테이블명 ; 

DESC 테이블명 ;

 

SQL Server => sp_help ‘dbo.테이블명’

 

// Oracle 예제
CREATE TABLE PLAYER (
PLAYER_ID CHAR(7) NOT NULL,
PLAYER_NAME VARCHAR2(20) NOT NULL,
TEAM_ID CHAR(3) NOT NULL,
E_PLAYER_NAME VARCHAR2(40),
NICKNAME VARCHAR2(30),
JOIN_YYYY CHAR(4),
POSITION VARCHAR2(10),
BACK_NO NUMBER(2),
NATION VARCHAR2(20),
BIRTH_DATE DATE,
SOLAR CHAR(1),
HEIGHT NUMBER(3),
WEIGHT NUMBER(3),
CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);


// SQL Server
CREATE TABLE PLAYER (
PLAYER_ID CHAR(7) NOT NULL,
PLAYER_NAME VARCHAR(20) NOT NULL,
TEAM_ID CHAR(3) NOT NULL,
E_PLAYER_NAME VARCHAR(40),
NICKNAME VARCHAR(30),
JOIN_YYYY CHAR(4),
POSITION VARCHAR(10),
BACK_NO TINYINT,
NATION VARCHAR(20),
BIRTH_DATE DATE,
SOLAR CHAR(1),
HEIGHT SMALLINT,
WEIGHT SMALLINT,
CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

 
 

✅  ALTER TABLE

테이블의 칼럼 관련 변경 명령어
 
- 칼럼 추가
마지막 칼럼으로 추가됨 (칼럼 위치 지정 불가)
SQL>> ALTER TABLE 테이블명 ADD (칼럼명 데이터타입);
 
- 칼럼 삭제
삭제 후 복구 불가
SQL>> ALTER TABLE 테이블명 DROP COLUMN 칼럼명;
 
- 칼럼 설정 변경
SQL>> ALTER TABLE 테이블명 MODIFY (칼럼명 데이터타입 제약조건);

 

* 컬럼 변경시 몇 가지 주의 사항 * 

- 칼럼의 크기는 늘릴 수는 있지만, 줄일 수는 없다. (데이터 훼손)

- 1) NULL만 있거나 2) 행이 없는 경우에만 칼럼의 크기 축소 가능
NULL만 있을 때는 데이터 유형도 변경 가능
NULL이 없으면 NOT NULL 제약조건 추가 가능


 기본값 변경 작업 이후 발생하는 데이터에 대해서만 기본값이 변경됨

- 칼럼명 변경
ANSI/ISO 표준에 명시된 기능 아니기 때문에 Oracle등 일부만 지원
SQL>> ALTER TABLE 테이블명 RENAME COLUMN 칼럼명 TO 새로운 칼럼명;
 
- 제약조건 추가
SQL>> ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건;
 
- 제약조건 제거
SQL>> ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건; 
 

✅   RENAME TABLE

테이블 이름 변경 


SQL>> RENAME 테이블명 TO 변경 할 테이블명; (ANSI/ISO 표준)
ALTER TABLE 테이블명 RENAME TO 테이블명’으로도 가능
 

 

✅   DROP TABLE

테이블 삭제 : 테이블의 데이터와 구조 삭제, 복구 불가


SQL>>  DROP TABLE 테이블명;


CASCADE CONSTRAINT 옵션 : 해당 테이블과 관계가 있엇던 참조되는 제약조건에 대해서도 삭제.

 

SQL Server는 CASCADE 옵션이 존재하지 않으면,

테이블 삭제 전 참조하는 FK 제약 조건 또는 참조하는 테이블을 먼저 삭제 해야한다. 
 

✅   TRUNCATE TABLE

테이블 자체가 삭제되는것이 아니고,

해당 테이블에 들어있던 모든 행들이 제거되고 저장공간을 재사용 가능하도록 해제

 

SQL>> TRUNCATE TABLE 테이블명;

 

테이블 전체 삭제할때는 DELETE 보다는 시스템 부하가 적은 TRUNCATE 사용 권고

로그를 기록하지 않기 때문에 ROLLBACK 불가 => 복구 불가

TRUNCATE는 DDL
 

 

3절 DML

입력/수정/삭제/조회


1. INSERT: 데이터 입력
SQL>> INSERT INTO 테이블명 (칼럼명, …) VALUES (필드값, …);
SQL>> INSERT INTO 테이블명 VALUES ( 전체 컬럼에 넣을 필드값, …);
 
2. UPDATE : 데이터 수정
SQL>> UPDATE 테이블명 SET 칼럼명 = 필드값;
 
3. DELETE : 데이터 삭제
SQL>> DELETE FROM 테이블명 WHERE 조건절;
SQL>> DELETE FROM 테이블명;

DELETE로 데이터를 삭제해도 테이블 용량은 초기화되지 않음 
 
4. SELECT : 조회
1) 칼럼 별 데이터 선택        
SQL>> SELECT 칼럼명 FROM 테이블명;
 
2) 데이터 중복 없이 선택
SQL>> SELECT DISTINCT 칼럼명 FROM 테이블명;
 
3) 전체 칼럼의 데이터 선택

WILDCARD(와일드카드)로 애스터리스크(*) 사용
 SQL>> SELECT * FROM 테이블명;
 
 앨리어스(Alias, 별칭) 부여 
- SELECT 칼럼명 AS “별명”  : 출력되는 칼럼명 설정 
- FROM 테이블명 별명 : 쿼리 내에서 사용할 테이블명 설정, 칼럼명이 중복될 경우 SELECT절에서 앨리어스 필수

 

 

- 산술 연산자

( ) , * , / , + , -

 

- 합성 연산자

문자와 문자를 연결하는 합성 연산자 (칼럼과 문자도 가능)

공통 : CONCAT 함수로도 2개 문자열 합성 가능

Oracle :  ‘||’(수직선 2개)

SQL Server :  +’(플러스)

- DUAL
Oracle의 기본 더미 테이블, 연산 수행을 위해 사용됨
 
 

4절 TCL ⭐

트랜잭션

하나의 트랜잭션에는 하나 이상의 SQL문장이 포함 함

분할할 수 없는 최소의 단위 => 전부 적용 or 전부 취소
DB의 논리적 연산 단위
 
특성 ACID
1. 원자성(Atomicity): 전부 실행되거나 전혀 실행되지 않음 (All or Nothing)
2. 일관성(Consistency): 트랜잭션으로 인한 DB 상태의 모순이 없음
3. 고립성(Isolation): 부분적인 실행 결과에 다른 트랜잭션이 접근할 수 없음, LOCKING으로 고립성 보장
4. 영속성(Durability): 트랜잭션의 결과는 영구적으로 저장됨
 
TCL
데이터 무결성 보장을 목적으로 함
1) 영구 변경 전 확인과 2) 연관 작업 동시처리 가능
 
- Oracle은 1) SQL 문장을 실행하면 트랜잭션이 시작되고 2) TCL을 실행하면 트랜잭션이 종료됨
- DDL을 실행하면 자동 커밋 (DML 이후 커밋 없이 DDL을 실행해도 자동 커밋)
- DB를 정상적으로 종료하면 자동 커밋, 애플리케이션 등의 이상으로 DB 접속이 단절되면 자동 롤백
 

COMMIT

데이터를 DB에 영구적으로 반영하는 명령어,
커밋 시 트랜잭션이 완료되어 LOCKING이 해제됨,
SQL Server은 기본적으로 자동 커밋

=> AUTO COMMIT, 암시적 트랜잭션, 명시적 트랜잭션
 
COMMIT
- 데이터 변경이 메모리 버퍼에만 영향을 받았기 때문에 복구 가능
(NOLOGGING 옵션 사용 시 버퍼 캐시의 기록을 생략하여 입력 성능이 향상됨)
- 사용자는 SELECT절로 결과를 확인할 수 있으나 다른 사용자는 현재 결과를 볼 수 없음
- 변경된 행에 LOCKING이 설정되어 다른 사용자가 변경할 수 없음
(LOCKING이 안 걸린 상태일 때 여러 사용자가 데이터를 변경하면 상관없음)
 
COMMIT
- 변경 사항이 DB에 반영되고 이전 데이터는 복구 불가
- 모든 사용자가 결과를 볼 수 있음
- LOCKING이 해제되어 다른 사용자가 행을 조작할 수 있음
 

 

ROLLBACK

트랜잭션 시작 이전의 상태로 되돌리는 명령어,
COMMIT 이전 상태로 돌려줌,

데이터에 대한 변경 사항 취소 & 이전 데이터는 다시 재저장 됨.
ROLLBACK 시 LOCKING이 해제되고 다른 사용자들이 데이터 변경 할 수 있게 됨.

 

 SAVEPOINT

저장점(SAVEPOINT) 을 정의하면 롤백할 때, 

트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 

현 시점에서 SAVEPOINT까지 트랜잭션의 일부만 롤백 할 수 있다.

 

SAVEPOINT SVPT1;

ROLLBACK TO SVPT1;

SAVE TRANSACTION SVTR1;

ROLLBACK TRANSACTION SVTR1;

 

‘ROLLBACK TO 저장점명’ 시 해당 저장점 상태로 돌려줌,
동일한 저장점명이 있으면 나중 저장점이 유효함
‘SAVEPOINT ~ ROLLBAC TO ~’


SQL Server에서는 'BEGIN TRAN~' 으로 명시해야 가능함 

BIGIN TRANSACTION
COMMIT TRANSACTION
TRANSACTION

 

// 오라클 예시
SAVEPOINT SVPT1;
// 저장점이 생성되었다.

INSERT INTO PLAYER
(PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1999035', 'K02', ' ', 'GK', 182, 82, 1); 이운재
// 1개의 행이 만들어졌다.

ROLLBACK TO SVPT1;
// 롤백이 완료되었다.

 


테이블 내 입력한 데이터나, 수정된 데이터, 삭제한 데이터에 대하여

COMMIT이전에는 변경사항을 취소 할 수 있는데

데이터베이스 ROLLBACK기능을 사용한다.

 

 

- CREATE, ALTER, DROP, RENAME, TRUNCATE TABLE 등 DDL 문장을 실행하면 그 전후 시점에 자동 커밋 됨

- DML 문장 이후 커밋 없이 DDL 문장이 실행되면, DDL 수행 전에 자동으로 커밋 됨

- DB 정상 접속 종료하면 자동으로 트랜잭션 커밋 됨

- 애플리케이션 이상 종료로 DB 접속이 단절 되었을 경우, 트랜잭션이 자동 롤백 됨

 

COMMIT & ROLLBACK 효과

- 데이터 무결성 보장

- 영구적인 변경을 하기 전에 데이터의 변경 사항 확인 가능

- 논리적으로 연관된 작업을 그룹핑하여 처리 가능
 

5절 WHERE절

WHERE
SQL>> SELECT 칼럼명 FROM 테이블명 WHERE 조건절;
 

 

연산자 종류

1.. 비교 연산자

=, >, >=, <, <=
비교 대상 데이터 타입에 따라 자동으로 형 변환되는 경우도 있음
 
2. 부정 비교 연산자

!=, ^=, <>, NOT
 
3. SQL 비교 연산자
- BETWEEN A AND B : A와 B 사잇값
- IN (리스트) : 리스트 내의 값
- LIKE ‘문자열’ : 문자열의 형태와 일치하는 값
※ 와일드카드 : 1) ‘%’(퍼센트)는 0개 이상의 문자 2) ‘_’(언더바)는 1개의 단일 문자
- IS NULL : NULL은 등호로 판단 불가

 

4. 부정 SQL 비교 연산자
- NOT BETWEEN A AND B
- NOT IN (리스트)
- IS NOT NULL

 
5. 논리 연산자

AND, OR, NOT

 

 

NULL의 연산

1. NULL값과의 연산은 NULL값을 리턴
2. NULL값과의 비교연산은 FALSE 리턴
3. 특정 값보다 크다, 적다라고 표현 불가
=> NULL값을 포함하는 연산의 경우, 결과 값도 NULL이다.
모르는 데이터에 숫자를 더하거나 빼도 결과를 모르는 개념이다.

 


연산자 우선순위
1. ‘()’(괄호) 로 묶은 연산자
2. NOT (부정)
3. 비교 연산자 와 SQL 비교 연산자

4. AND (논리)
5. OR (논리)

 
문자열 비교방법
- CHAR vs CHAR 
첫 서로 다른 문자열 값으로 비교 (뒤 순서가 더 큰 값),
길이가 다를 때 공백을 추가하여 길이 맞춤 (공백 수만 다르면 같은 값)
- CHAR vs VARCHAR 
첫 서로 다른 문자열 값으로 비교, 길이가 다르면 길이가 긴 값이 크다고 판단,
VARCHAR의 공백도 문자로 판단, TRIM 함수로 VARCHAR의 공백 제거하고 판단할 수 있음
- CHAR vs 상수
상수를 변수 타입으로 바꿔 비교

 

 

부분 범위 처리 (ROWNUM, TOP) 

- ROWNUM  (Oracle)

SQL 처리 결과 집합의 각 행에 임시로 부여되는 번호

조건절 내에서 행의 개수를 제한하는 목적으로 사용함
테이블이나 집합에서
원하는 만큼의 행만 가져오고 싶을 때 WHERE절에서 행의 개수를 제한하는 목적으로 사용

 

한 건의 행만 가져오고 싶을 때는
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <2; 

 

두 건 이상의 N행을 가져오고 싶을 때는 처럼 사용할 수 없으며 
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N+1; 

처럼 출력되는 행의 한계를 지정할 수 있다.

 

추가적인 ROWNUM의 용도로는 테이블 내의 고유한 키인덱스 값을 만들 수 있다

- UPDATE MY_TABLE SET COLUMN1 = ROWNUM;

 

 

- TOP  (SQL Server)

결과 집합으로 출력되는 행의 수를 제한할 수 있다.

출력 행의 수 제한 함수, ’TOP (N)’로 N개 행 출력, 개수 대신 비율로도 제한 가능

 

※ ORDER BY절이 없으면 ROWNUM과 TOP의 기능이 같다.

ORDER BY 절이 같이 사용되면 기능의 차이가 발생한다.

 

SQL>> TOP (Expression) [PERCENT] [WITH TIES]

 

Expression : 반환할 행의 수를 지정하는 숫자이다
- PERCENT : 쿼리 결과 집합에서 처음 Expression% 의 행만 반환됨을 나타낸다
- WITH TIES : ORDER BY절이 지정된 경우에만 사용할 수 있으며


TOP  N(PERCENT) 의 마지막 행과 같은 값이 있는 경우 추가 행이 출력되도록 지정할 수 있다.

 

한 건의 행만 가져오고 싶을 때는
- SELECT TOP(1) PLAYER_NAME FROM PLAYER; 


두 건 이상의 N행을 가져오고 싶을 때는 
- SELECT TOP(N) PLAYER_NAME FROM PLAYER; 

처럼 출력되는 행의 개수를 지정할 수 있다.

 

 

 

6절 함수

내장함수, 사용자 정의 함수
내장함수는 단일행 함수, 다중행 함수
다중행 함수는 집계, 그룹, 윈도우 함수로 구분

1. 단일행 함수
1) SELECT절 2) WHERE절 3) ORDER BY절에 사용 가능
각 행에 개별적으로 작용

여러 인자를 입력해도 단 하나의 결과만 출력

 

문자형함수, 숫자형함수, 날짜형함수, 변환형함수, NULL관련 함수
 
- 문자형 함수

문자열 입력 시 문자열이나 숫자 반환

LOWER : 문자열을 소문자로
UPPER : 문자열을 대문자로

ASCII : 문자나 숫자를 아스키 코드 번호 변환 (문자의 ASCII 값 반환)

CHR/CHAR : ASCII 값에 해당하는 문자나 숫자로 반환

CONCAT : 문자열 결합

SUBSTR/SUBSTRING : 문자열 중 m 위치에서 n개의 문자 반환

SUBSTR : 문자열 부분 추출

LENGTH/LEN : 문자열 길이를 숫자 값으로 반환
LTRIM, RTRIM, TRIM : 왼쪽 공백 제거, 오른쪽 공백 제거, 양쪽 공백 제거

 

- 숫자형 함수

ABS(n) : 숫자의 절대값 반환
SIGN(n) : 숫자가 양수면1 음수면-1 0이면 0 반환
MOD : 숫자1을 숫자2로 나누어 나머지 값 반환
CEIL/CEILING(n) : 크거나 같은 최소 정수 반환
FLOOR(n) : 작거나 같은 최대 정수 리턴

ROUND ( 숫자 ,  m ) : 숫자를 소수점 m자리에서 반올림 후 리턴

TRUNC ( 숫자 , m ) : 숫자를 소수 m자리에서 잘라서 버리고 리턴

 

- 날짜형 함수
SYSDATE/GETDATE() : 현재날짜와 시각 출력
EXTRACT/DATEPART : 날짜 데이터에서 데이터(년/월/일 시/분/초) 출력
TO_NUMBER(TO_CHAR(d,‘YYYY’)) / YEAR(d) : 날짜 데이터에서 년/월/일 출력

MONTH(d) , DAY(d)

 

 

- 변환형 함수

데이터 타입 변환, 명시적 형 변환 방식

TO_NUMBER, TO_CHAR, TO_DATE (Oracle): 문자열을 숫자로, 숫자나 날짜를 문자열로, 문자열을 날짜로

CAST, CONVERT (SQL Server)


 

- NULL 함수 종류
NVL 함수 : NVL(칼럼,값)
NULL이면 다른 값으로 바꾸는 함수이다.
"NVL(MGR, 0)"은 MGR칼럼이 NULL이면 0으로 바꾼다.


NVL2 함수 : NVL2(칼럼,값,값)
NVL함수와 DECODE를 하나로 만든 것이다.

NULL이면 앞의 값 아니면 뒤의 값 출력

"NVL2(MGR, 1, 0)"은 MGR칼럼이 NULL이 아니면 1, NULL이면 0을 반환한다.


NULL IF 함수 : NULLIF(값,값)
두 개의 값이 같으면 NULL을 같지 않으면 첫 번째 값을 반환한다.
"NULLIF(exp1, exp2)"은 exp1과 exp2가 같으면 NULL을, 같지 않으면 exp1을 반환한다.


COALESCE 함수 : COALESCE(값,값,…)

NULL이 아닌 첫 값 출력
"COALESCE(mgr, 1)"은 mgr이 NULL이 아니면 1을 반환한다.

 

ISNULL(칼럼,값) 

NULL이면 값으로 대치 아니면 칼럼 값 출력

 

 

 

7절 GROUP BY, HAVING 

다중행 함수

 

- 집계함수 (Aggregate Function)
여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수

그룹별 결과 출력

다중 행 함수 중 하나

GROUP BY절이 없으면 그룹핑 대상이 존재하지 않아 에러 발생

WHERE절에 사용 불가

공집합에서도 연산 수행
SELECT, HAVING, ORDER BY 절에 사용 가능

GROUP BY절은 행들을 소그룹화 함


ALL : Default 옵션이므로 생략 가능, 전체 출력

DISTINCT : 중복제거, 같은 값을 하나의 데이터로 간주 옵션


COUNT(*) : NULL 포함 행의 수 ⭐
COUNT(표현식) : NULL 제외 행의 수


SUM : NULL 제외한 합계

AVG : NULL 제외한 평균

MAX, MIN : 최대값, 최소값
STDDEV : 표준 편차
VARIAN : 분산

NULL 제외하고 연산 숫자연산은 NULL 출력 

 

 

 

- GROUP BY: 그룹핑 기준 설정, 앨리어스 사용 불가

 

- HAVING: GROUP BY절에 의한 집계 데이터에 출력 조건을 걺

(↔ WHERE절은 SELECT절에 조건을 걸기 때문에 제외된 데이터가 GROUP BY 대상이 아님),

일반적으로 GROUP BY 뒤에 위치함

 


GROUP BY, HAVING 절 특성
1. GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
2. 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행한다.
3. GROUP BY 절에서는 ALIAS 사용 불가
4. 집계 함수는 WHERE 절에 올 수 없다.
5. WHERE절은 전체 데이터를 GROUP로 나누기전에 행들을 미리 제거한다.
6. HAVING 절에는 집계함수를 이용하여 조건 표시 가능

7. HAVING 절은 일반적으로 GROUP BY 뒤에 위치한다.

 

 

8절 ORDER BY절

특정 칼럼을 기준으로 정렬, 기본 정렬기준은 오름차순

- 1) 칼럼명 2) 앨리어스 3) 칼럼의 SELECT절에서 순서로 칼럼 지정 가능, SELECT절에 없는 칼럼도 지정 가능, GROUP BY절이 있으면 GROUP BY 대상 칼럼만 지정 가능

- Oracle은 NULL을 최대값으로 판단함 회장님은 상사가 없음 (↔ SQL Server은 최소값으로 판단함)


ORDER BY 특징
1. 조회된 데이터들을 다양한 목적에 맞게 특정한 칼럼을 기준으로 정렬
2. ORDER BY 절에 칼럼명 대신 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능
3. DEFAULT 값으로 오름차순(ASC)이 적용되며 DESC 옵션을 통해 내림차순으로 정렬이 가능.
4. SQL 문장의 제일 마지막에 위치한다.
5. SELECT 절에서 정의하지 않은 칼럼 사용 가능


Oracle에서는 NULL을 가장 큰 값으로 취급하며
 SQL Server에서는 NULL을 가장 작은 값으로 취급한다.


SELECT 문장 실행 순서 ⭐
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

테이블에서 출력 대상이 아닌 것은 제거하고 그룹핑해서 그룹핑된 값이 조건에 맞는 데이터를 계산 및 출력하고 정렬함

 

SELECT 칼럼명 AS “별명” ⑤ 계산 및 출력하고
FROM 테이블명   ① 테이블에서
WHERE 조건식  ② 출력 대상이 아닌 것은 제거하고
GROUP BY 칼럼/표현식    ③ 그룹핑해서
HAVING 조건식     ④ 그룹핑된 값이 조건에 맞는 데이터를
ORDER BY 칼럼/표현식 ⑥ 정렬함



 
SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;
위는 급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원은 같이 출력한다.