본문 바로가기

WEB/SQL

[SQL INJECTION] SQL 기본 문법 정리 Ⅳ (함수, 조건문)

이 포스트는 인프런의 성공적인 SQL 인젝션 공격을 위한, SQL 기본 문법 강의를 보고 작성하였습니다!

 

1. 함수

(1) 문자열 함수

- SubString

① 사용법

DBMS 함수 사용법
ORACLE SUBSTR
SUBSTRB
함수 (문자열, 시작위치, 길이)
MSSQL SUBSTRING
MYSQL SUBSTRING
SUBSTR
MID

② 사용예시

③ 특징

 1) 0부터 시작하지 않고 1부터 시작한다.

(2) 문자 아스키코드 변환 함수

① 사용법

DBMS CHAR → ASCII ASCII → CHAR
ORACLE ASCII CHR
MSSQL ASCII CHAR
MYSQL ASCII, ORD CHAR

 

② 사용 예시

∨bin함수: 출력결과를 이진수로 보여준다.

 

 

 

(3) count 함수

① 사용법

select count(column) from table명;

② 사용 예시

 

 

 

(3) 길이 함수

 

① 사용법

DBMS 함수
ORACLE LENGTH
MSSQL LEN
MYSQL LENGTH

 

② 사용 예시

select name, length(email) from member;

∨ 예상 출력 결과:  name 을 출력하고 이메일의 길이를 출력

 

 

사용하는 이유: 임계값 둘다 존재해야 for문을 돌릴때 자동화 도구를 제작하기 쉬움

 

2. 조건문

(1) 사용법

DBMS 구문
ORACLE DECODE 함수, CASE WHEN 구문
MSSQL CHASE WHEN 구문
MYSQL IF 함수, CASE WHEN 구문

 

(2) 형식

case when [CONDITION] then [TRUE] else [FALSE] end

 

TRUE: 참일 경우 실행되는 부분

FALSE : 거짓일 경우 실행되는 부분

 

 

3. 서브쿼리

최초의 select절을 메인쿼리라고 하고 그다음에 오는 것이 서브쿼리라고 칭한다.

SELECT COLUMN1, COLUMN2 FROM TABLE WHERE [COLUMN]=(SELECT COLUMN FROM TABLE WHERE COLUMN =[VALUE])

(1) 종류

SELECT (SubQuery) FROM (SubQuery) a WHERE [COLUMN]=(SubQuery)

① 인라인 뷰: from에 있는 서브쿼리

 다수의 레코드와 다수의 칼럼

여러개를 물리적으로 저장한다.

위 예시에서는 a가 인라인뷰 (반환되는 테이블) , from 절이 실행되 a가 테이블로 실행

∨ 인라인 뷰는 가상테이블이다.

사용예시

select * from (select * from member)a;

★ 별칭(a)을 줘야함

select * from (select * from member)a;
select * form (select * from member)a where a.seq=1;

 

② 스칼라 서브쿼리: select에 있는 서브쿼리

 

∨ 1개의 레코드와 1개의 칼럼

→ 두개부터는 에러가 발생

★union 은 두개의 레코드 가능.

 

▶사용예시

1)

select name, (select version()) from member;

*select version(): mysql의 버전을 확인하는 명령어

2)

select name, (select email from member where seq=a.seq) from member a;

← name 값 하나가 a라고 지칭함. a의 seq를 받아서 그것의 email을 반환하는 코드

③ 일반적인 서브쿼리: where 절에서 사용하는 서브쿼리

★=단일만 가능한데 in이 있으면 다중행을 비교가능

 

단행 (하나의 레코드)

▶형식

select * from member where seq=( );

사용예시

select * from member where seq=(select seq from member where name='guest');

 다행(여러개의 레코드)

 -사용예시

select * from member where seq in(select seq from member);

3. ORDERBY

: 정렬함수

 

(1) 형식

SELECT COLUMN1, COLUMN2 FROM TABLE ORDER BY COLUMN [ASC/DESC]

 ASC: 오름차순

 DESC: 내림차순

기본설정은 오름차순이다.

(2) 특징

 해당 COLUMN을 기준으로 정렬

 기준이 되는 값만 비교→ 동일한 조건에 대해서는 정렬이 되어지지 않음

 

 

 칼럼 명을 굳이 안 적어도 되고 숫자로 해도 된다.

예를 들어)

1 → 첫번째 컬럼

2 → 두번째 컬럼

 

▶예시

정렬 비교를 위해 맨끝에 칼럼을 추가했다.

 

 

seq를 기준으로 비교하는 경우 같은 seq를 가진 crehacktive와 guest칼럼은 정렬을 실행하지 않는다.

 

(3) 여러개를 사용하는 방법

: 동일한 조건에서도 다른 방법으로 또 정렬하기 위해 사용

 

▶컬럼을 여러개 사용하는 방법:

select * from member order by seq,name;

 

(4) 에러 발생 경우

select 절에서 선택한 칼럼 보다 큰 숫자 선택한 경우

 

▶예시

select seq, name from member order by 3;

 

member의 칼럼 갯수는 3개지만 select 절에서 2개만 골랐으므로 2까지만 입력가능하다.

4. 레코드 출력 개수 제한

(1) 사용법

DBMS 키워드
ORACLE ROWNUM
MSSQL TOP
MYSQL LIMIT

(2) 형식

SELECT COLUMN1, COLUMN2 FROM TABLE LIMIT [OFFSET], [ROW_COUNT]

∨ 시작 위치 조절시 → OFFSET: 위치값 (c언어 배열의 인덱스값 같은것)

그렇지 않은 경우, 0부터 시작한다.

SELECT COLUMN1, COLUMN2 FROM TABLE LIMIT [ROW_COUNT]

 ROW_COUNT: 레코드 갯수

(3) 사용예시

select * from member limit 1,1;
select * from member limit 1,4;