SQL

SQL (Structured Query Language) 은 구조적인 질의 언어라는 것이다.

이 SQL 이라는 질의 언어를 통해서 데이터베이스를 제어, 관리한다.


SQL 은 다음 언어로 나눌 수 있다.


⒜ DDL : 데이터 정의 언어 

⒝ DML : 데이터 조작 언어

⒞ DCL : 데이터 제어 언어


DDL

DDL (Data Definition Language) 는 데이터 베이스 스키마를 정의 하거나 조작하기 위해 사용한다.

SCHEMA, DOMAIN, TABLE, VIEW, INDEX 를 다음 명령어로 정의, 변경, 삭제한다.


⒜ CREATE : 정의 

⒝ ALTER: 수정

⒞ DROP : 삭제

⒟ TRUNCATE : DROP 후 CREATE


* Oracle 11g 이전 버전과 MySQL은 DDL에 대해서 트랜잭션을 지원하지 않는다.

(Rollback 할 수 없고 Commit할 필요도 없다.)


DML

DML (Data Manipulation Language) 는 데이터를 조작 (조회, 추가, 변경, 삭제) 하기 위해 사용한다.

사용자가 응용 프로그램과 데이터 베이스 사이에 실질적인 데이터 처리를 위해서 주로 사용한다.


⒜ SELECT : 조회

⒝ INSERT : 추가

⒞ DELETE : 삭제

⒟ UPDATE : 변경


기본적인 위의 명령어 외에 LOCK, EXPLAIN, CALL 등도 DML에 포함 된다.


DQL

일부에서는 DML에서 SELECT 만을 따로 분리해서 DQL (Data Query Language) 나 

간단히 QUERY 로 표현하기도 한다.


DCL

DCL (Data Control Language) 는 데이터를 제어하는 언어이다.

데이터의 보안, 무결성, 회복, 병행 수행제어 등을 정의하는데 사용한다.


⒜ COMMIT : 트랜잭션의 작업 결과를 반영 

⒝ ROLLBACK : 트랜잭션의 작업을 취소 및 원래대로 복구

⒞ GRANT : 사용자에게 권한 부여

⒟ REVOKE : 사용자 권한 취소


TCL

일부에서는 DCL 에서 트랜잭션을 제어하는 명령인 COMMIT 과 ROLLBACK 만을 따로 분리해서 TCL (Transaction Control Language) 라고 표현하기도 한다.



출처: http://parkbosung.tistory.com/11 [IT 지식 쌓기]

#암호화
INSERT INTO 테이블명 (컬럼1) VALUES (HEX(AES_ENCRYPT('문자열', SHA2('My secret passphrase',512))));
 
#복호화
SELECT CAST(AES_DECRYPT(UNHEX(컬럼1), SHA2('My secret passphrase',512)) as char) FROM 테이블명;
OR
#복호화
SELECT CONVERT(AES_DECRYPT(UNHEX(컬럼1), SHA2('My secret passphrase',512)) USING utf8) FROM 테이블명;

 CAST나 CONVERT으로 형변환 하는 부분 때문에 한참 해맸다.
대부분의 블로그가 형변환을 안 써 놨다.(심지어 공식 사이트 에서도…)
암복호화 함수의 리턴값은 BINARY 이기 때문에 HEX를 사용하지 않으면 필드 타입을 BINARY 저장이 가능한 타입으로 지정해야 된다. 공식문서는 BLOB을 추천한다고…
문제는 BINARY타입으로 지정시 일반 문자열 저장이 안되는 문제가 있기 때문에 필드타입을 VARCAHR로 사용하고 HEX를 사용하여 저장이 가능 하도록 한다.
 
MySQL 5.6이상부터 변경 가능.
암호화 모드 확인
select @@block_encryption_mode
암호화 모드 변경
SET block_encryption_mode = ‘aes-256-cbc’;
#기본값 aes-128-ecb
암호화 모도는 처음부터 확인. 중간에 바뀌면 골치 아파진다.




MySQL의 DDL중에는 DML의 DELETE 명령어와 비슷한 기능을 하지만 사실은 전혀 다른 TRUNCATE 명령어가 존재한다.

그렇다면 이 두가지 명령어는 어떠한 공통점과 차이점을 가지는지 비교해 보도록 하자.

먼저 공통점에 대해서 살펴보자.

DELETE FROM TEST;

TRUNCATE TABLE TEST; 

이 두 SQL문을 실행하고 해당 테이블의 데이터를 조회할 경우 결과는 같게 나타날 것이다.


DELETE FROM TEST WHERE name='짜짜로니';

TRUNCATE TABLE TEST; 

다음은 이 두 SQL문을 실행해보자. 이번에도 결과가 같은지 살펴보자. 결과는 다르게 나타날 것이다.


DELETE 명령어와 TRUNCATE 명령어의 공통점은 해당 테이블의 데이터를 삭제한다는 것이다. 하지만 두번째 예시를 보면 알 수 있듯이

항상 똑같이 작동하는 것은 아니다. 예시에서와 같이 DELETE 명령어는 뒤에 WHERE절을 통해 조건을 부여할 수 있다.

TRUNCATE은 조건절의 부여없이 테이블의 데이터를 모두 삭제하는 명령어이며, DELETE는 모든 데이터를 삭제하거나 조건절 부여를

통한 일부 데이터를 삭제하는 명령어이다.


우리는 두가지 예시를 통해 두 명령어간의 차이점을 쉽게 확인할 수 있었다. 하지만 두 명령어간의 차이점은 이것만 존재할까.

사실 DELETE와 TRUNCATE의 가장 큰 차이점은 데이터를 삭제하는 방식이다. 

DELETE의 경우 데이터를 한줄씩 순차적으로 삭제하고 TRUNCATE은 테이블 DROP 후 CREATE를 수행한다.

이는 두 명령어 간의 목적차이로 발생하는 차이인데, DELETE는 해당 데이터를 삭제하고 삭제한 공간을 재사용하기 위한 명령어이고

TRUNCATE은 테이블 명세만을 남기고 데이터가 존재하던 공간마저 제거하기 위한 명령어이다.

두 명령어 중 속도는 TRUNCATE가 더 빠르지만 복구가 불가능하다는 제한사항 또한 존재한다.


또다른 TRUNCATE의 특징으로는 다음과 같은 것들이 존재한다.

기존에 AUTO_INCREMENT로 지정하여 값이 증가하던 컬럼이 초기화 된다.(5.0.13 버전부터)

[테이블명].frm 파일이 유효할 경우, 데이터나 인덱스가 손상된 경우라도 빈 테이블로 재생성이 가능하다. 


간단하게나마 DELETE와 TRUNCATE의 차이점을 살펴보았다.

위에서 서술한 내용들을 참고하여 DELETE와 TRUNCATE을 때에따라 적절하게 사용토록 하자.



+ Recent posts