본문 바로가기

TIL

[231228] SQLD: 관계형데이터베이스, DDL, DML, TCL, DCL

* 수강 강의명: SQLD 자격증 대비반 - 7~10주차 

 [요약] 

1. 관계형 데이터베이스(Relational Database, RDB)

1)  개요

- 관계형 데이터베이스란?

: 표 형태로 저장되는 데이터베이스로  생성, 조회, 수정, 삭제(CRUD / Create, Read, Update, Delete)가 가능 

: 관계형 데이터베이스 관리 시스템(RDMS)을 통해 관리함

 

2) SQL

- 개념: Structured Query Language의 약자로 관계형 데이터베이스와 통신할 때 사용하는 구조화된 질문(query) 언어

 

- SQL 언어 분류 ★  

 · 데이터 정의 언어(DDL: Data Definition Language)
 : 관계형 데이터베이스(테이블)구조를 정의하는 데 사용하는 언어
데이터를 저장하는 테이블을 만들거나 수정할 때 사용

테이블을 생성(CREATE), 변경(ALTER, RENAME), 삭제(DROP) 가능


·  데이터 조작 언어(DML: Data Manipulation Language)
 : 테이블에 저장된 데이터를 조작하는 데 사용하는 언어
데이터 정의 언어로 생성된 구조를 실제 데이터로 채울 때 사용
데이터를 삽입(INSERT), 조회(SELECT), 수정(UPDATE), 삭제(DELETE) 할 수 있습니다.

·  데이터 제어 언어(DCL: Data Control Language)
 데이터베이스 접근 및 제어 권한을 관리하는 데 사용하는 언어
 특정한 사용자의 데이터베이스 접근 및 사용 권한을 부여하거나 박탈 가능

·  트랜잭션 제어어(TCL: Transaction Control Language)

논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 작업단위(트랜잭션)별로 제어하는 언어
COMMIT, ROLLBACK 등 명령어 수행

 

 * 트랜잭션(Transaction)

  └ 정의: 데이터베이스가 한 번에 처리하는 작업의 단위

  └ 특징 
   ① 원자성(Atomicity): 데이터베이스에 모두 적용되거나 아님 적용되지 않거나 둘 중 하나의 선택지만 있어야 함 
   ② 일관성(Consistency): 작업 처리 결과는 항상 일관되어야 함
   ③ 독립성(Isolation): 둘 이상 트랜잭션이 동시에 진행될 경우 하나의 결과가 다른 결과에 영향 주면 안됨
   ④ 지속성(Durability): 특정한 작업이 마무리된 경우 결과는 데이터베이스에 영구적으로 반영되어야 함

 

[SQL Syntax] 자체 표준은 있으나 RDB 제공 회사마다 특징이 달라 문법은 조금씩 달라짐 

- 모든 SQL 문(statement)는 SELECT, INSERT, UPDATE 등과 같은 키워드로 시작

└ SQL에 들어가는 키워드는 대소문자를 구분하지 않으나 대문자 작성을 권장

- 하나의 SQL 문은 세미콜론(;)으로 끝남 (각각의 SQL 문을 구분하는 표준 방법)

- SQL 문(Statement): 독립적으로 실행할 수 있는 완전한 SQL 코드 조각. 문은 절로 구성됨 

- SQL 절(Clause): 문(Statement)의 하위 단위

SELECT col_name FROM table_name;


> 하나의 문 (Statement)과 두 개의 절 (Clause)로 구성됨 

 

3) 테이블 

- 엑셀 내 시트에 해당하는 것으로, 관계형 데이터베이스에서 데이터를 저장하는 기본 단위

- 세로 방향을 칼럼(Column), 가로 방향을 행(Row), 이들이 교차하는 공간을 필드(Field)라고함. 

종류 설명
테이블(Table) 행과 열로 구성된 2차원의 데이터 저장 구조
column/열/속성 테이블에 저장되는 데이터의 특징
더 이상 나눌 수 없는 하나하나의 속성
row/행/레코드 테이블에 저장되는 실제 데이터 (인스턴스)

 

4) ERD(Entity-Relationship Diagram)

- 테이블 간 상관 관계를 이미지로 도식화한 것

- ERD는 Entity(개체), Relationship(관계), Attribute(속성)으로 구성

- 대표적으로 바커 표기법과 I/E 표기법으로 구분 

 

2. DDL(Data Definition Language)

1) 정의와 유형

- 정의: 데이터베이스의 골격인 테이블을 주로 다루는 SQL의 한 종류. 테이블 구성 시 가장 중요한 것은 칼럼을 정의하는 일.

 

- 주요 개념 

·  데이터 유형: 데이터베이스에 데이터를 저장할 때 어떠한 데이터를 받을지 결정하는 기준을 의미

·  데이터 크기: 데이터를 저장할 때는 데이터 크기(SIZE)도 지정 가능

·  숫자형 타입(NUMERIC Type): DB를 제공하는 회사별로 다른 기준 제공. 저장 숫자의 크기와 정밀도를 고려해 선택

 └ NUMERIC/DECIMAL: 고정 소수점 숫자를 나타내는 데 사용. 거의 동일한 의미
 └ SMALLINT: 2Byte로 표현되는 작은 범위 정수
 BIGINT: 4Byte로 표현되는 큰 범위 정수
 └ FLOAT: 부동 소수점 숫자를 나타내는 데 사용
 REAL: 4Byte 부동 소수점 숫자를 나타내는데 사용

 

(cf) 왜 숫자형 타입은 여러 가지로 나뉠까? 최적의 용량(공간)에 맞춰서 활용이 필요해서

 

- 대표적인 데이터 유형

CHARACTER(S) - CHAR로 표기

 : 고정 길이의 문자열 정보로, 입력 시 고정 길이보다 작은 경우 남은 부부은 공백으로 채워짐 
 : 기본 길이는 1 Byte로 설정되며, 최대 길이는 Oracle 2,000 Bytes, SQL Server 8,000 Bytes

·  VARCHAR(S) - VARCHAR, 오라클은 VARCHAR2 로 표기
 : 가변 길이의 문자열 정보로, 최대 길이만큼 크기를 가질 수 있지만 가변 조정이 가능해 입력 Byte만큼만 적용됨

 : 기본 길이는 1 Byte로 설정되며, 최대 길이는 Oracle 4,000 Bytes, SQL Server 8,000 Bytes

·  NUMERIC
 : 정수, 실수 등의 숫자 정보
 : SQL Server는 다양한 숫자 타입을 사용하지만, Oracle은 NUMBER 숫자 타입이 대표적

-- Oracle
-- NUMBER(p,s) precision(정밀도)/scale(소수 자리수)

NUMBER -- 입력 변형 없이 허용가능한 범위 내에서 가변 저장
NUMBER(5) -- 5자리 숫자를 표현할 수 있음 (유효숫자)
NUMBER(5, 3) -- 5자리 숫자중 소수점을 포함해 3자리까지 소수를 나타낼 수 있음

#예제 
123.56 -- NUMBER(5, 2) / 총 5자리수에 소수점 2자리
NUMBER(3) -- 124 / 소수점 없이 출력
NUMBER(3, 2) -- ERR / 유효숫자가 5자리인데 3자리까지 밖에 표현을 못하니까
NUMBER(5, 1) -- 123.6 / scale에 따라 소수점 둘째자리 반올림 되어 표시

· DATETIME
 : 날짜, 시각 등과 관련된 정보
 : SQL Server는 DATETIME으로 표현하고, Oracle은 DATE으로 표현 

 

- 문자열 비교 

① CHAR

- 남는 부분을 '공백(BLANK)'으로 채워서 문자열 비교

- 끝에 공백 추가 후 앞에서부터 비교하기 때문에, 끝 공백만 다르면 문자열이 같다고 판단

- 고정 길이 문자열이기 때문에 헤더에 레코드 길이 정보 포함


② VARCHAR (variable CHAR)

- 맨 처음부터 하나의 문자 단위로 문자열 비교

- 공백도 하나의 문자로 취급하기 때문에 끝의 공백이 다르면 다른 문자로 판단

- 가변 길이 문자열이기 때문에 헤더에 레코드 길이 정보 미포함

- (Oracle) VARCHAR2로 표현하며,
VARCHAR2(11 BYTE) = 11 Byte 크기 문자열 저장 / VARCHAR2(11 CHAR) = 11개 문자열 지정(크기는 제한 있음) 

  (cf)1개의 문자는 4Bytes 크기를 가짐 

 

2) 제약 조건 

: 테이블에 부적절한 값이 들어오지 않도록 하는 규칙. 사용자가 지정하지 않으면 DBMS가 자동 부여

·  NOT NULL

: 필수로 데이터가 입력되어야 하는 컬럼에 설정

·  UNIQUE

: 해당 컬럼에 들어가는 값이 전체 테이블에서 유일해야 하는 조건. 중복값 허용 불가

·  PRIMARY KEY

: 테이블의 기본키. NOT NULL + UNIQUE 제약조건을 함께 짐.

: 테이블당 기본키는 1개만 허용하며, 여러 칼럼을 묶어 하나의 기본키로 사용 가능함

CONSTRAINT PK_example PRIMARY KEY(col1, col2, col3)

·  FOREIGN KEY

: 테이블의 외래키. 참조 관계 설정이 필요하므로 먼저 생성된 참조 테이블이 있어야 함

: 외래키가 참조하는 칼럼은 참조 테이블의 기본키(PK)여야 함   

CONSTRAINT FK_example FOREIGN KEY(col4) REFERENCES table_example(col1)

·  DEFAULT

 : 값이 입력되지 않을 경우 부여될 기본 값 

...
column2 VARCHAR2(50) DEFAULT 'Default Text',
...

·  CHECK

: 데이터에 미리 조건을 지정할 때 사용. 주로 특정한 값이나 범위를 조건으로 지정

-- 컬럼 정의에 함께 사용할 경우
...
age NUMBER(2) CHECK(age > 14),

-- 제약 조건을 따로 명시할 경우
...
CONSTRAINT CK_age CHECK(age > 14)

 

3) CREATE TABLE 테이블 생성 

- 기본구조

-- Create a new table in the database
CREATE TABLE table_name (
column_1 data_type constraints,
column_2 data_type constraints,
column_3 data_type constraints
);
#실습01
CREATE TABLE pokemon (
    pokemon_id CHAR(10) NOT NULL,
    name CHAR(10) NOT NULL,
    attr VARCHAR(40) NOT NULL,
    age  NUMBER(3) NOT NULL,
    CONSTRAINT pokemon_pk PRIMARY KEY (pokemon_id)
);

#실습02
CREATE TABLE summer_olympic  (
    olympiad CHAR(10) NOT NULL,
    host_city VARCHAR(30),
    country VARCHAR(30),
    competitors NUMBER(5) ,
    CONSTRAINT olympiad_pk PRIMARY KEY (olympiad)
);

 

 4) ALTER TABLE 테이블 수정

- 기본 구조

#1. 칼럼/제약사항 추가 
-- ADD Column
ALTER TABLE 테이블_이름 ADD 칼럼명 데이터_유형;
-- ADD Constraint
ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약_조건_이름 제약조건 (컬럼_이름);

#2. 칼럼/제약사항 삭제  
-- Drop Column
ALTER TABLE 테이블_이름 DROP COLUMN 삭제_할_컬럼_이름;
-- Drop Constraint
ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약_조건_이름;

3. 칼럼 수정 
-- MODIFY Column
#Oracle
ALTER TABLE 테이블_이름 MODIFY (
	컬럼_이름_1 데이터_유형 [DEFAULT 식] [NOT NULL], 
	컬럼_이름_2 데이터_유형 [DEFAULT 식] [NOT NULL] 
	...);
#SQL Server 
ALTER TABLE 테이블_이름 ALTER COLUMN (
	컬럼_이름_1 데이터_유형 [DEFAULT 식] [NOT NULL], 
	컬럼_이름_2 데이터_유형 [DEFAULT 식] [NOT NULL] 
	...);
    
4. 칼럼/테이블 이름 수정 
-- RENAME Column
#Oracle
ALTER TABLE 테이블_이름 RENAME COLUMN 변경_할_컬럼_이름 TO 새로운_컬럼_이름;
#SQL Server
SP_RENAME 테이블_명.변경_할_컬럼_이름, 새로운_컬럼_이름, 'COLUMN';

-- RENAME Table
#Oracle
RENAME 기존_테이블_이름 TO 새로운_테이블_이름;
#SQL Server
SP_RENAME 기존_테이블_이름, 새로운_테이블_이름;
##예시 
--ADD Column : summer_olympic 테이블에 start_date 추가
ALTER TABLE summer_olympic ADD start_date DATE;

-- ADD Constraint : player 테이블에 외래키 제약조건 추가 
ALTER TABLE player ADD CONSTRAINT player_fk FOREIGN KEY team_id
REFERENCES TEAM(team_id);

-- DROP Column
ALTER TABLE summer_olympic DROP COLUMN start_date;

-- DROP Constraint
ALTER TABLE player DROP CONSTRAINT player_fk;

-- ALTER Column
#ORACLE
ALTER TABLE TEAM_TEMP 
MODIFY (ORIG_YYYY VARCHAR2(8) DEFAULT '20020129' NOT NULL);
#SQL Server
ALTER TABLE TEAM_TEMP 
ALTER COLUMN ORIG_YYYY VARCAHR(8) NOT NULL; 

-- RENAME Column 
#ORACLE
ALTER TABLE player
RENAME COLUMN player_name TO name;
#SQL Server
SP_RENAME player.player_name, name, 'COLUMN';

-- RENAME Table 
#ORACLE
RENAME player TO football_player;
#SQL Server
SP_RENAME player, football_player;

 

 - 칼럼 수정 시 크기를 늘릴 수는 있으나 줄일 수는 없음 

 

5) DROP TABLE, TRUNCATE TABLE 테이블 삭제 

(1) DROP TABLE

: 테이블 전체를 삭제할 때 사용하며 저장 데이터도 같이 삭제

#Oracle / SQL Server 공통
DROP TABLE 테이블_이름 [CASCADE CONSTRAINT];

#예시
DROP TABLE player;

 

: CASCADE CONSTRAINT / 삭제 테이블을 참조하고 있는 제약조건을 같이 삭제할지 여부를 결정하는 옵션  

 └ SQL Server에는 해당 옵션이 없어 제약조건 및 참조테이블 먼저 삭제해야 테이블 삭제도 가능

     (cf) 참조 무결성: 데이터베이스 상의 참조가 모두 유효함을 의미 

#수정
-- 참조하고 있는 모든 레코드도 함께 수정
ALTER TABLE ORDERS ADD FOREIGN KEY (product_id) REFERENCES Product(id) ON UPDATE CASCADE;

-- 참조하고 있는 모든 레코드도 함께 삭제
ALTER TABLE ORDERS ADD FOREIGN KEY (product_id) REFERENCES Product (id) ON DELETE CASCADE;

-- 참조하던 레코드가 사라지면 NULL 값으로 변경
ALTER TABLE ORDERS ADD FOREIGN KEY (product_id) REFERENCES Product (id) ON DELETE SET NULL;

#테이블 생성 시 조건 설정 
-- Orders 테이블 생성
CREATE TABLE Orders (
    order_id NUMBER PRIMARY KEY
   ...
);

-- OrderItems 테이블 생성
CREATE TABLE OrderItems (
    item_id NUMBER PRIMARY KEY,
    order_id NUMBER,
    item_name VARCHAR2(50),
    CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE CASCADE
);

 

(2) TRUNCATE TABLE 

 : 테이블 구조는 그대로 남기고 저장된 데이터만 지우고 싶을 때 사용

#Oracle / SQL Server 공통
TRUNCATE TABLE 테이블_이름;

#예시
TRUNCATE TABLE player;

 

 

3. DML (Data Manipulation Language)

1) 정의

: 테이블에 데이터를 삽입(INSERT), 삭제(DELETE), 수정(UPDATE), 조회(SELECT) 를 수행하는 SQL

: 삽입/삭제/수정 후, 데이터베이스에 반영하는 커밋(COMMIT)과 작업 취소를 위한 롤백(ROLLBACK)도 있음

 

2) INSERT
① 데이터 삽입 시 칼럼 리스트를 명시하는 법
: 어떤 칼럼에 값을 넣을지 명시하며 저장할 데이터도 칼럼의 순서에 맞게 작성
INSERT INTO 테이블_이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

#예시 
INSERT INTO player (name, height, weight) VALUES ('KIM', 184, 75);
 
데이터 삽입 시 칼럼 리스트를 명시하지 않는 법 : 칼럼 리스트를 명시하지 않으면 모든 칼럼에 값을 넣을 것이라는 의미: 정의된 칼럼의 개수에 맞추어 저장되는 값을 순서대로 입력
INSERT INTO 테이블_이름 VALUES (값1, 값2, ...);

#예시
INSERT INTO player VALUES ('LEE', 187, 74);

 

3) UPDATE

: 한 번 입력된 데이터를 수정해야 할 때, UPDATE 문으로 내용 수정

 : WHERE 문으로 조건 필터링 하여 수정 가능하며, 조건 안 걸면 전체 데이터가 수정됨!!

UPDATE 테이블_이름 SET 수정_할_컬럼_이름 = 수정_할_새로운_값, ...;

#예시 
UPDATE player SET back_no = 99;
UPDATE player SET position = 'MF';

 

4) DELETE

- 데이터를 삭제하기 위한 명령어 DELETE

- WHERE 문으로 조건을 만족하는 데이터만 선택하여 삭제 가

DELETE [FROM] 테이블_이름;
DELETE [FROM] 테이블_이름 WHERE 삭제할_조건;

#예시
DELETE FROM player;
DELETE FROM player WHERE back_no = 50;

 

[!] DELETE vs. TRUNCATE

- DELETE는 DML 명령어라 바로 삭제되지 않고, COMMIT 실행 후 최종 적용. 복원을 위해 log를 남겨 부하가 있음 

 └ 단, SQL Server는 DML도 AUTO COMMIT되어 바로 실행될 수도

 └ 잘못 삭제했다면 ROLLBACK 명령어로 다시 되돌릴 수 있긴 함

- TRUNCATE는 DDL 명령어라 삭제 후 복원 불가. 삭제 시 시스템 부하는 적음 

DELETE FROM player;          -- player 테이블에서 데이터 삭제
ROLLBACK;                    -- 되돌리기
SELECT COUNT(*) FROM player; -- player 테이블의 전체 데이터 개수 구하기
-- 480

TRUNCATE TABLE player;       -- player 테이블에서 데이터 삭제
ROLLBACK;                    -- 되돌리기
SELECT COUNT(*) player;      -- player 테이블의 전체 데이터 개수 구하기
-- 0

 

5) SELECT

: 테이블에 데이터를 조회할 때 사용하는 명령어

SELECT 칼럼명1, 칼럼명2 ... FROM 테이블명; -- 칼럼명 대신 * 넣으면 전체 칼럼 출력

- ALIAS: 칼럼명의 별칭을 지정하는 기능. 칼럼명과 별칭명 사이에 AS를 넣거나 생략, 테이블명에는 AS 표기 불가

- DISTINCT: 쿼리 결과에서 중복된 값을 제거하여 고유한 값만을 반환하도록 하는 역할

 

 - 산술 연산자

+ - * / %
더하기 빼기 곱하기 나누기 나머지
* 연산자 우선순위: () →  * → / → +  → -

 

 - 합성 연산자

: 서로 다른 두 문자를 하나의 문자열로 합칠 때 사용

-- Oracle
SELECT 문자형1 || 문자형2 FROM 테이블_이름;

-- SQL Server
SELECT 문자형1 + 문자형2 FROM 테이블_이름;

-- CONCAT 함수 사용 
SELECT CONCAT(문자형1, 문자형2) FROM 테이블_이름;

 

 

4. SELECT 절 함수

1) WHERE

: 내가 원하는 데이터를 필터링하는 기능. 조회, 수정, 삭제 시 함께 사용

SELECT [ALL|DISTINCT] 칼럼명 [AS 별명] FROM 테이블명 WHERE 조건식; -- 조회 
UPDATE 테이블명 SET 칼럼명=값 WHERE 조건식; -- 수정 
DELETE FROM 테이블명 WHERE 조건식; -- 삭제

#예시
SELECT * FROM PLAYER WHERE BACK_NO = 10;
UPDATE PLAYER SET TEAM = '서울FC' WHERE NAME = '메시';
DELETE FROM PLAYER WHERE NAME = '발로차';

 

- 비교 연산자 : 숫자 혹은 문자 값의 크기 및 동일 여부 등을 확인(=,  >, >=, <, <=)

- SQL 연산자

 └ BETWEEN 값1 AND 값2: 값1 ≤ 비교값 ≤ 값2  

 └ IN (값1, 값2 ... ) : 포함

 └ LIKE '비교문자열': 비교문자열과 형태 일치 조건. % = 어떤 문자든 포함한 모든 것, _ = 1개의 단일 문자(EX. _피, 커피)

 └ IS NULL / IS NOT NULL: NULL값 포함 여부  

- 논리 연산자

 └ AND: 앞의 조건과 뒤의 조건이 둘 다 만족
 └ OR: 앞의 조건이든 뒤의 조건이든 하나만 만족 
 └ NOT: 뒤에 오는 조건의 결과를 반대로 만족

- 부정 연산자

└  같지 않다. (!= , ^=, <>)

└  ~와 같지 않다. (NOT 칼럼명 = )
└  ~보다 크지 않다. (NOT 칼럼명 > )
└  a와 b의 값 사이에 있지 않다. (NOT BETWEEN a AND b)
└  list 값과 일치하지 않는다. (NOT IN (list))
└  NULL 값을 갖지 않는다. (IS NOT NULL)

- 연산자의 우선순위

(1 순위) 괄호( )
(2 순위) NOT 연산자
(3 순위) 비교 연산자, SQL 비교 연산자
(4 순위) AND
(5 순위) OR

 

2) 가상 칼럼(PSEUDO COLUMN): ROWNUM, ROWID

ROWNUM 

: 임시로 열 번호를 부여하는 함수. 주로 WHERE 문에서 행의 개수를 제한하는 목적으로 사용
: 비교 연산자를 사용해 행의 개수를 제한할 수 있으나, = 연산자는 사용 불가

: 오라클에서 제공하는 가상 칼럼(PSEUDO COLUMN) 중 하나 

 (cf) PSEUDO COLUMN: 처리 결과의 각 행에 임시로 번호를 부여함. 실제 데이터베이스에는 저장되지 않아, SELECT로 조회는 가능하지만 삽입, 수정, 삭제는 불가 

SELECT / UPDATE / DELETE 문
WHERE ROWNUM 비교연산자 행의갯수;

#예시
SELECT * FROM PLAYER 
WHERE ROWNUM <= 3;

 

(cf) TOP은 SQL Server 에서 활용하는 임시 칼럼. 

SELECT TOP(N) 칼럼명 FROM 테이블명;

 

#추가 조건 / SELECT TOP(N) [PERCENT] [WITH TIES]
> PERCENT: 쿼리 결과 집합에서 몇 %를 반환할지 정할 수 있음 
> WITH TIES: 정해진 개수만큼 출력시 마지막 행과 같은 값이 존재하면 추가로 출력되도록 지정  
             ORDER BY 지정된 경우만 사용 가능 

쿼리 결과 집합에서 몇 %를 반환할지 정할 수 있음

 

- ROWID

: 데이터를 구분할 수 있는 유일한 값을 지정 (오라클에서 임의로 지정하는 값)

:  SELECT, WHERE절에 사용될 수 있지만 INSERT, UPDATE, DELETE로 변경 불가

: 유일한 주소값이지만 테이블의 PK처럼 사용불가 

: ROWID데이터가 어떤 파일과 어떤 블록에 저장되어 있는지를 확인 가능

: 오라클에서 제공하는 가상 칼럼(PSEUDO COLUMN) 중 하나 

 

3) 함수 - 단일행 함수 

 
(1) 내장 함수 개요
- 개념: 각 DBMS 회사 별로 제공하는 함수. 하나의 행에 하나의 값이 입력되는 단일행 함수와 여러 행의 값이 입력되는 다중행 함수로 분류
 
- 단일행 함수의 종류
 
종류 내용 함수
문자형 함수 문자를 입력하면 문자나 숫자 값을 반환 LOWER, UPPER, ASCII, CHR, CONCAT, SUBSTR, LENGTH, LTRIM, RTRIM, TRIM, LPAD, RPAD
숫자형 함수 숫자를 입력하면 숫자 값을 반환 ABS, SIGN, MOD, CEIL, FLOOR, ROUND, TRUNC, POWER, SQRT, LOG, EXP, LN, SIN, COS, TAN
날짜형 함수 DATE 타입의 값을 연산 EXTRACT, SYSDATE
변환형 함수 문자, 숫자, 날짜형의 데이터형을 다른 데이터형으로 형변환 TO_CHAR, TO_NUMBER, TO_DATE
NULL 관련 함수  NULL 값을 처리 NVL, NULLIF, COALESCE
분기처리 함수 분기처리에 사용 DECODE
 
(2) 문자형 함수
- UPPER(문자열) : 모든 문자를 대문자로 변경하여 리턴
- LOWER(문자열) : 모든 문자를 소문자로 변경하여 리턴
- CONCAT(문자열, 문자열) : 문자열과 문자열을 연결하여 리턴
└ 합성 연산자 || (Oracle) 과 + (SQL Server) 와 동일한 결과 출력
 
- ASCII(문자열) : 문자나 숫자를 ASCII 코드 번호로 변환
- CHR(ASCII 번호) : ASCII 코드 번호를 문자나 숫자로 변환(SQL Server. CHAR(ASCII 번호))
 
- SUBSTR(문자열, m, n) : 문자열 중 m위치에서 n개의 문자 길이에 해당하는 문자 출력 (SQL Server. SUBSTRING (문자열, m, n))
- LENGTH(문자열) : 문자열의 개수를 숫자값으로 리턴 (SQL Server. LEN(문자열))
 
- LTRIM(문자열[, 지정문자]) : 첫 번째 문자부터 확인해 지정문자가 나타나면 문자열에서 제거. 지정문자 없으면 공백 제거
- RTRIM(문자열[, 지정문자]) : 마지막 문자부터 확인해서 지정문자가 나타나면 문자열에서 제거 . 지정문자 없으면 공백 제거
- TRIM([leading|trailing|both] 지정문자 FROM 문자열): 문자열에서 머리말, 꼬리말, 또는 양쪽에 있는 지정 문자를 제거
└ leading은 머리말, trailing은 꼬리말, both는 둘 다
 
- LPAD(문자열1,n[,문자열2]): 문자열1을 n자리만큼 늘리고, 왼쪽 빈 공간을 문자열2로 채워서 리턴
- RPAD(문자열1,n[,문자열2]): 문자열1을 n자리만큼 늘리고, 오른쪽 빈 공간을 문자열2로 채워서 리턴
 
* SQL Server에서는 LTRIM, RTRIM으로 공백만 제거 가능하며, TRIM에서 leading, trailing 사용 불가
 
(3) 숫자형 함수
- ABS(숫자): 숫자의 절댓값을 돌려주는 함수
- SIGN(숫자): 숫자의 부호를 판단하는 함수. 숫자가 양수이면 1을 리턴하고, 0이면 0을 리턴, 음수면 -1을 리턴
- MOD(숫자1, 숫자2): 숫자1을 숫자2로 나누어 나머지 값을 계산하는 함수. % 연산자로 대체 가능 
- CEIL(숫자): 숫자보다 크거나 같은 최소 정수를 리턴. 소수를 정수로 올림 연산할 때 사용 (SQL Server. CEILING(숫자))
- FLOOR(숫자): 숫자보다 작거나 같은 최대 정수를 리턴. 소수를 정수로 내림 연산할 때 사용
- ROUND(숫자 [, m]): 숫자를 소수점 m자리에서 반올림하여 리턴. m이 생략되면 default 값은 0 
- TRUNC(숫자 [, m]): 숫자를 소수 m자리에서 잘라서 버린 값을 리턴. m이 생략되면 default 값은 0. SQL Server 미지원
- SIN, COS, TAN(숫자): 숫자의 삼각함수 연산을 하여 결과를 리턴. 숫자는 라디안을 의미
 
 
(4) 날짜형 함수
- SYSDATE: 현재 날짜와 시간을 출력 (SQL Server. GETDATE() )
- EXTRACT(시간날짜단위 FROM 시간날짜)
:  날짜 데이터에서 년/월/일 데이터를 출력. 시간/분/초도 가능
(SQL Server. DATEPART(시간날짜단위, 시간날짜)  )
- TO_NUMBER(TO_CHAR(날짜정보, 데이트_포멧))
: 날짜 데이터에서 년/월/일 데이터를 출력(EXTRACT와 동일). TO_NUMBER 함수 제외 시 문자형으로 출력 (SQL Server. YEAR(날짜정보), MONTH(날짜정보), DAY(날짜정보)  )
 
(5) 변환형 함수 
(Oracle)
- TO_NUMBER(문자열): alphanumeric 문자열을 숫자로 변환   
- TO_CHAR(숫자|날짜 [, FORMAT]):숫자나 날짜를 주어진 FORMAT 형태의 문자열 형식으로 변환
- TO_DATE(문자열 [, FORMAT]):  문자열을 주어진 FORMAT 형태로 날짜 형식으로 변환

(SQL Server)
- CAST (expression AS data type [(length)]): expression을 목표 데이터 유형으로 변환
- CONVERT (data_type [(length)], expression [,style]): expression을 목표 데이터 유형으로 변환
 
(6) NULL 관련 함수
: NULL은 정의되지 않은 값을 의미. NULL과 연산하면 항상 NULL 값이 나옴
- NVL(칼럼명, 대체값): 해당 칼럼이 NULL이면 대체값을 출력해주는 함수 (SQL Server. ISNULL  )
- 공집합: 테이블에서 조건에 맞는 데이터가 한 건도 없는 경우. NULL은 값 자체가 없는 거고, 공집합은 조건에 맞는 데이터가 없는 것
- NULLIF(1값1): 특정 값을 NULL로 대체하는 경우 사용. 칼럼1이 NULL 이면 값1로 리턴,  NULL 아니면 칼럼1로 출력 
- COALESCE(값1, 값2): NULL 아닌 첫 번째 값을 추출하되, 모든 값이 NULL이면 NULL을 리턴하는 함수 
 
(7) CASE 표현(분기처리 함수) 
 - 조건절:  CASE WHEN 뒤에 조건이라면, THEN 이후 값을 출력 
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE result_else
END
 
 - DECODE: CAS 문과 유사하지만 보다 간단한 형식 
#기본 구조
DECODE(expression, value1, result1, value2, result2, ..., default_result)
-- 표현식(expression) 값이 기준값1(value1)과 같다면 값1(result1)을, 다르면 디폴트 값 출력
-- 여러 개의 기준값을 설정할 수 있으며, 기본값 미설정 시 NULL 값 반환

#기본 형태
SELECT DECODE(표현식, 기준값1, 값1 [, 기준값2, 값2, ..., default])
FROM 테이블명;​

4) GROUP BY와 HAVING

(1) 집계함수(Aggregate Function)

- 개념: 여러 데이터들을 연산을 해주는 함수. SELECT, HAVING, ORDER BY 절에 사용 가능

└ WHERE 절에 사용 불가! GROUP BY 절 보다 먼저 수행이 되기 때문에 그룹핑 전에 집계하면 제대로된 값이 안나옴

└ NULL은 NVL이나 ISNULL을 사용해 제외 가능하나, 집계함수 대부분이 NULL을 제외하므로 별도 함수 사용 불필요 

- 종류

항목 결과
COUNT(*) NULL 값을 포함한 행의 수
COUNT(칼럼) NULL 값을 제외한 행의 수
SUM(칼럼) NULL 값을 제외한 합계
AVG(칼럼) NULL 값을 제외한 평균
MAX(칼럼) NULL 값을 제외한 최대값
MIN(칼럼) NULL 값을 제외한 최소값
STDDEV(칼럼) NULL 값을 제외한 표준편차
VARIAN(칼럼) NULL 값을 제외한 분산

- NULL값은 

 

(2) GROUP BY 절

- 개념: 데이터들을 작은 그룹으로 분류하여 해당 그룹에 대한 항목별로 통계 정보를 얻고자 할 때 사용하는 절

- 특징

 └ SELECT 절에 집계함수 사용 시 GROUP BY 사용 해야 함 

 └ GROUP BY 절에 ALIAS 사용 불가 

 └ 그룹핑은 WHERE 절에 맞는 조건을 가져온 다음에 실행됨 

 └ GROUP BY 절보다 WHERE 절이 먼저 수행되기 때문에 집계 함수는 WHERE 절에 올 수 없음

 └ HAVING 절을 통해 GROUP BY로 묶은 그룹에 집계 함수를 이용한 조건 및 제한 표시 가능

SELECT [DISTINCT] 칼럼명 [ALIAS명] 
FROM 테이블명 
[WHERE 조건식] 
[GROUP BY 칼럼이나 표현식] 
[HAVING 그룹조건식] ;

 

(3) HAVING 절 

- 개념: WHERE절과 같이 특정 조건데이터만 표시 할 수 있으나, 집계 결과에 대해 사용하는 것이 특징

 

- 특징

 └ 집계된 결과를 기준으로 조건이 필요한 경우 HAVING 절 활용

 └ GROUP BY 절과 함께 사용하며, 그룹을 나타내는 결과 행에 조건 적용

 

5) ORDER BY

(1) 개념 및 특징 

- 특정 칼럼을 기준으로 정렬하여 출력하기 위해 사용

- 아무것도 적지 않으면 기본 오름차순(ASC)이고, 내림차순 시 DESC 추가 필요 

- ORDER BY 절에 ALIAS 사용 가능

- NULL의 경우, Oracle는 가장 큰 값으로, SQL Server는 가장 작은 값으로 간주

 

(2) SELECT 문장 실행 순서

: FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT/OFFSET

(3) TOP N 쿼리

: TOP N 쿼리는 상위 N개의 데이터를 보여주기 위한 쿼리를 지칭

- ROWNUM (Oracle) : WHERE 절에 작성된 ROWNUM으로 데이터를 랜덤 추출한 다음, 정렬 작업 진행  

- TOP (SQL Server) : ORDER BY로 데이터 정렬 후 원하는 데이터 일부 추출 가능

 

5. TCL(Transaction Control Language)

- 개념: 데이터를 삽입, 삭제, 수정하는 DML의 수행 이후 COMMIT이나 ROLLBACK을 하기 위해 사용하는 SQL

 

- 트랜잭션(Transaction): 데이터베이스에서 처리되는 논리적인 연산단위. 분할할 수 없는 최소 단위

연산을 전부 적용하거나 혹은 적용하지 않는 양자택일의 관계로 구성

└ 기본 특성(ACID): 원자성(Atomicity), 일관성(Consistency), 고립성/격리성(Isolation), 지속성(Durability)

 

(1) COMMIT 

: 최종 트랜잭션을 확정하는 TCL 명령어

: 데이터베이스 변경 후 COMMIT 하지 않으면, 최종 데이터베이스에 변경 내용 저장 안되며, 이전 상태 복구 가능

: SELECT 문으로 수정 내용 조회 자체는 가능하나 다른 사용자는 접근 안 됨

: COMMIT하면, 데이터베이스 변경이 반영되기까지 잠금되었다가, 풀린 이후 다른 사용자 사용 가 

 

(cf) LOCKING(잠금)

트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법

#예시
INSERT INTO PLAYER VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1);
COMMIT;

UPDATE PLAYER SET HEIGHT = 100;
COMMIT;

DELETE FROM PLAYER;
COMMIT;

 

(2) ROLLBACK

 : 트랙잭션 진행중 에러나 실수 발생 시 변경 전 가장 최신 상태로 되돌리는 명령어

SQL 쿼리문
ROLLBACK;

 (cf)  COMMIT과 ROLLBACK을 사용하지 않아도 트랜잭션이 종료되는 경우

① DDL 문장 실행 시 자동으로 COMMIT
② DML 문장 이후에 COMMIT 없이 DDL 문장이 실행될 때
③ 정상적으로 DB 접속을 종료하면 COMMIT
④ 장애로 인한 비정상 종료로 DB 접속이 단절되었을 경우에는 AUTO ROLLBACK

 

(3) SAVEPOINT

: 트랜잭션 중간에 SAVEPOINT 설정 시 처음이 아닌 SAVEPOINT 지점까지만 롤백해 시스템 부하를 줄일 수 있

-- Oracle
SAVEPOINT 저장점_이름;
ROLLBACK TO 저장점_이름;

-- SQL Server
SAVE TRANSACTION 저장점_이름;
ROLLBACK TRANSACTION 저장점_이름;

 

(+) 트랜잭션 병렬처리 시 문제점

> 현재 수행중인 트랜잭션의 데이터에 다른 트랜잭션이 접근 가능할 때 발생할 수 있는 문제점

① Dirty Read: 수정중인데 조회를 허용하면, 잘못된 정보를 읽게 됨 

② Non-Repeatable Read: 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션 값을 수정/삭제하면서 두 쿼리 결과가 다르게 나타나는 현상
③ Phantom Read: 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션 값이 추가 되면서 유령 데이터가 생기는 현상

 

6. DCL(Data Control Language) 

 - 개요: 특정 유저의 권한을 제어할 수 있는 명령어

 └ 사용자: 사용자 계정과 패스워드를 통해 DBMS에 접속 가

 └ 스키마(Schema): 사용자가 소유하고 있는 오브젝트의 모음

- 구문 정리 

종류 SQL문
사용자 계정 생성 CREATE USER user IDENTIFIED BY “password”;
사용자 비밀번호 변경 ALTER USER user IDENTIFIED BY “password”;
사용자 계정 잠금/해제 ALTER USER user ACCOUNT LOCK/UNLOCK;
사용자 계정 삭제 DROP USER user [CASCADE];
* CASCADE: DB의 값 수정/삭제 시 참조하고 있는 레코드도 종속적으로 수정/삭제 가능
사용자에 권한 부여 시스템 권한
GRANT privilege TO user [WITH ADMIN OPTION];
오브젝트 권한
GRANT privilege ON object TO [WITH GRANT OPTION];

*privilege : 부여할 권한
*object : 대상 오브젝트
*WITH ADMIN/GRANT OPTION : 부여 받은 권한을 다른 사용자에게 부여하거나 회수할 수 있음
사용자의 권한 회수 시스템 권한
REVOKE privilege FROM user;
오브젝트 권한
REVOKE privilege ON object FROM user;

 

 - 권한: 시스템 권한, 객체 권한, ROLE을 이용한 권한 크게 3가지로 분류

-- 기본 구조
GRANT [system_privilege|role] TO [user|role|PUBLIC]
[WITH ADMIN OPTION];

 

 └ 시스템 권한: 사용자가 데이터베이스에서 특정 작업을 수행 할 수 있도록 허용

 └ 객체 권한: 사용가 소유하고 있는 특정 객체를 다른 사용자들이 엑세스 하거나 조작할 수 있게 하기 위해 생성

 └ 롤(ROLE): 사용자에게 허가할 수 있는 권한들의 집합


[SQL 코드카타]

1. 85. Rising Temperature
https://leetcode.com/problems/rising-temperature/

1) 어떤 문제가 있었나

전날에 비해 온도가 오른 ID 추출해야 하는데, 날짜와 온도를 같은 행에서 비교 방법이 떠오르지 않음

 

2) 내가 시도해본 건 무엇인가

풀이 참조 결과, 셀프 JOIN과 DATEDIFF 함수 적용이 필요했음 

 

3) 어떻게 해결했나

셀프 JOIN 방법을 여러 가지로 조합으로 조회하여 추출되는 테이블 값을 확인 
- FROM 절에 WHERE 조건 없이 2개의 테이블명을 넣으면, 각 값이 개별로 조합되어 추출(2개 데이터면 4개 조합으로)
- LEFT/RIGHT JOIN 시 (본래 날짜 = 본래 날짜 +1 ) 조건 설정하여 추출 

 

SELECT w2.id
  FROM Weather w1
  LEFT JOIN Weather w2 ON w1.recordDate = (w2.recordDate - '1d')
  WHERE DATEDIFF(w2.recordDate, w1.recordDate)
        AND w2.temperature > w1.temperature 


>> join 절 없이 넣은 쿼리 
SELECT w2.id 
  FROM Weather w1, Weather w2
  WHERE w2.recordDate = (w1.recordDate+1) 
        AND w2.temperature > w1.temperature

 

4) 무엇을 새롭게 알았나

- 소유한 테이블을 활용해 분석이 필요한 사항은 셀프 조인이 필요함
- FROM 절에 2가지 테이블을 넣으면 조인이 됨. WHERE절을 통해 JOIN ON과 같이 조건 추가가 가능한 것 
 └ 예를 들면, FROM 테이블1, 테이블2  WHERE 테이블1.id = 테이블2.id

 

[+ 그 외 새롭게 알게 된 것] 

(파이썬) 타입을 변경해주는 함수
- int(): 값을 정수형(Integer)으로 변환해주는 함수 
- float(): 값을 실수(real number)로 변환해주는 함수 
- str(): 값을 문자열(string)로 변환해주는 함수 

 

(SQLD) 강의 

- 나머지 연산이 무엇인가?
: A % B 일 때, A = B*N + 나머지 가 됨. A에 가장 가까운 B의 곱 값을 구한뒤, A에서 빼면 나머지값이 나옴 
ex.  7%2 = 1 ( 7 = 2 * 3 + 1) , 13%5 = 3 (13 = 5 * 2 + 3)