SQL(Structured Query Language)이란
SQL은 구조화된 쿼리(query) 언어이며 데이터베이스에 데이터를 추출하고 조작하는 데 사용하는 데이터 처리 언어입니다
즉 'SQL'은 데이터베이스의 프로그래밍 언어입니다
SQL에서 사용되는 명령문은 아래 표와 같습니다
유형 | 명령문 |
DQL: Data Query Language | SELECT(데이터 검색 시 사용) |
DML: Data Manipulation Language 데이터 조작어 - 데이터 변경 시 사용 가능 |
INSERT(데이터 입력) UPDATE(데이터 수정) DELETE(데이터 삭제) |
DDL: Data Definition Language 데이터 정의어 - 객체를 생성하거나 변경할 때 사용 |
CREATE(데이터베이스 객체 생성) ALTER(데이터베이스 객체 변경) DROP(데이터베이스 객체 삭제) RENAME(데이터베이스 객체 이름 변경) TRUNCATE(데이터베이스 객체의 저장 공간 삭제) |
TCL: Transaction Control Language 트랜잭션 처리어 |
COMMIT(트랜잭션의 정상적인 종료 처리) ROLLBACK(트랜잭션 취소) SAVEPOINT(트랜잭션 내에 임시 저장소 설정) |
DCL: Data Control Language 데이터 제어 언어 |
GRANT(데이터베이스에 대한 일련의 권한 부여) REVOKE(데이터베이스에 대한 일련의 권한 취소) |
트랜잭션 : 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻함
추가로 SQL은 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어입니다
관계형 데이터베이스 (Relational DBMS) : SQL에 주로 사용되는 데이터베이스로 행(Column)과 열(Row)로 구성된 테이블 간의 관계를 나타날 때 사용됩니다 또한 테이블 형식으로 구성되어 있어 서로 다른 데이터 구조가 어떻게 관련되어 있는지 쉽게 파악이 가능합니다 (SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 함)
관계형 데이터베이스와 반대로 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 합니다 예를 들어 MongoDB와 같은 문서 지향 데이터베이스가 NoSQL입니다
즉 SQL을 알면 DBMS를 다룰 수 있고 DBMS 안에 데이터베이스를 조작할 수 있습니다
🎭 SQL 참거짓 구문
SQL은 보통 테이블 형식으로 데이터가 정리되어 원하는 조건에 맞게 추출하고 삽입할 수 있습니다 이 SQL 언어도 프로그래밍 언어와 동일하게 위 사진과 같이 각종 연산을 처리할 수 있습니다
대부분의 프로그래밍 언어에서는 TRUE = 1, FALSE = 0으로 치환된다는 사실을 알고 있을 겁니다 또한 느낌표(!) 표시는 부정을 의미합니다 마찬가지로 SQL에서의 참과 거짓, 부정도 프로그래밍 언어와 같은 의미로 사용됩니다
사실상 프로그래밍 언어를 접해봤다면 참과 거짓, 부정 개념은 쉽게 이해할 수 있습니다
참 거짓 조건 | 반환값 |
TRUE = 0 | 0 |
TRUE = 1 | 1 |
FALSE = 1 | 0 |
FALSE = 0 | 1 |
참 거짓 조건을 순서대로 해석하면 표에서 반환값이 왜 저렇게 나오는지 파악할 수 있습니다
표에 있는 TRUE = 0 조건문을 설명하자면 TRUE = 1인데 1 = 0 부등호에 맞지 않기 때문에 0을 반환하게 됩니다 나머지도 이와 같이 해석할 수 있습니다
1. TRUE IS TRUE (참은 참이다 ) : 맞는 말이니 1을 반환
2. TRUE IS NOT FALSE (참은 거짓이 아니다) : 조건을 만족하니 1을 반환
3. FALSE IS TRUE (거짓은 참이다) : 거짓은 참이 아니므로 0을 반환
4. FALSE IS FALSE (거짓은 거짓이다) : 맞는 말이니 1을 반환
이처럼 참과 거짓을 비교할 수 있습니다
👁🗨 이진 탐색
데이터베이스에서 테이블을 생성하면 인덱스라는 객체가 생성됩니다 이 객체는 색인이라고 부르며 검색 속도를 향상시키는 역할을 하는데 이 색인을 통해 대량의 데이터를 검색할 때 이진 탐색 개념을 이용합니다
또한 SQL Injection 작업을 통해 데이터베이스에 테이블 이름과 Column 이름을 찾을 때 이진 탐색 개념을 이용하여 더 빠르게 찾아낼 수 있습니다
이진 탐색 : 차례대로 나열된 집합에서 유효한 데이터를 찾을 때 집합에 처음 요소부터 차례대로 조사하는 것이 아닌 집합을 반으로 나누어 조사하는 과정을 말한다
먼저 이진 탐색이 어떤 식으로 작동되는지 알아봅시다 그림을 보면 5라는 데이터를 찾을 때 배열의 정 중앙에서 내가 찾고자 하는 5라는 데이터가 현재 중간 값(mid)보다 작으면 high 부분을 mid-1로 설정하여 1(low) ~ 7(high) 부분에서 5라는 데이터를 찾게 됩니다
또다시 중간값을 비교하여 (3<5 현재 중간 값보다 클 때) low 부분을 mid + 1로 설정하여 5(low) ~ 7(high) 부분에서 5를 찾게 됩니다 이런 방식으로 5를 탐색하게 됩니다
간단하게 정리하면 우리가 찾는 key 값과 mid(중간값)을 비교하여 key을 찾을 때 가지 중간값과 key 값을 비교합니다
1. key > mid : 우리가 찾는 값이 중간값보다 높다면 low = mid +1로 설정합니다
2. key < mid : 우리가 찾는 값이 중간값보다 작다면 high = mid - 1로 설정합니다
3. key == mid : 우리가 찾는 값이 중간값이면 반환합니다
이런 식으로 이진 탐색을 이용하여 우리가 원하는 데이터를 빠르게 찾아낼 수 있습니다
해당 개념은 컴퓨터공학과 자료구조 시간에 다룬 내용이기 때문에 자세히 설명했지만 SQL Injection에서 사용할 이진 탐색은 숫자 찾는 개념으로 생각하면 됩니다
예를 들어 1부터 16까지 숫자 중 원하는 숫자를 찾는다면 이진 탐색 방법으로 최대 4번 안에 원하는 값을 찾아낼 수 있습니다 16의 중간값인 8을 선택하여 원하는 숫자보다 크면 9~16 사이에서 찾으면 되고 작으면 1~7 사이에서 찾으면 됩니다
이런 방식으로 내가 원하는 값을 최대 4번 안에 찾아낼 수 있습니다 ( 2^n = 16 n=4번 )
📃 SQL Prepared Statement
Prepared Statement는 SQL의 템플릿(세부 문서)의 형태를 의미합니다 해당 템플릿 말고 Prepared이 없는 Statement도 있는데 이 두 가지의 차이점을 소개하기 전에 SQL에 SELECT문 실행 과정부터 살펴보겠습니다
클라이언트에서 입력된 쿼리는 DBMS 내부적으로 4가지 과정(parse, bind, execute, patch)을 걸쳐 데이터를 추출합니다 여기서 Statement는 SELECT 쿼리를 사용할 때 구문 분석부터 인출까지 모든 과정을 수행합니다 반면에 Prepared Statement에 구문 분석 과정은 최초 1번만 수행하고 이후에는 생략할 수 있어 효율을 높일 수 있습니다 이후 1번 수행한 쿼리문은 기계어로 컴파일 되기 때문에 쿼리문은 그대로 있습니다
이런 과정을 통해 Prepared Statement는 SELECT 쿼리에 대입된 값을 SQL로 인식하지 않아 SQL Injection을 예방할 수 있습니다 ( 이미 컴파일 되어 있기 때문에 대입된 값을 문자열로 처리함 )
정리 : Statement는 쿼리를 매번 분석부터 인출까지의 과정을 수행하기 때문에 속도가 느리며, SQL Injection 공격에 취약합니다 반면에 Prepared Statement는 이 과정을 최초 1번만 수행하기 때문에 검색 속도가 빠르며 SQL Injection을 예방할 수 있습니다
Statement : DDL (데이터 정의어) 구문을 사용할 때 적합하다
Prepared Statement : DML (데이터 조작어) 구문을 사용할 때 적합하다
[ 참고 자료 ]
[SQL] 추가, 삭제, 갱신
값을 지정할 때는 해당 열의 데이터 형식에 맞도록 지정해야 한다.INSERT 명령은 처리상태만 표시될 뿐 결과를 출력하지는 않는다.👉 SELECT 명령의 경우 실행하면 그 결과가 클라이언트에게 반환
velog.io
이진탐색 = 이분탐색 (Binary Search) - Java로 구현
이진 탐색 = 이분 탐색 (Binary Search) 정렬된 배열 또는 리스트에 적합한 고속 탐색 방법이다. 배열의 중앙에 있는 값을 조사하여 찾고자 하는 항목이 왼쪽 또는 오른쪽 부분 배열에 있는지를 알아
minhamina.tistory.com
[DataBase] Statement와 Prepared Statement 차이점
SQL문을 실행할 수 있는 객체가장 큰 차이점은 캐시 사용 여부1) 쿼리 문장 분석2) 컴파일3) 실행쿼리문을 수행할 때마다 SQL 실행단계 1~3 단계를 거침SQL 문을 수행하는 과정에서 매번 컴파일을 하
velog.io