SQL 서브쿼리

snovvy·2024년 8월 6일

SQL-Injection

목록 보기
8/9

서브쿼리

  • 최초에 시작됐던 셀렉절을 메인커리, 메인커리안에 또 다른 셀렉절이 있는 것을 서브쿼리라고 합니다.
SELECT COLUMN1, COLUMN2 FROM TABLE --- 메인쿼리 ---
WHERE[COLUMN] = 
(SELECT COLUMN FROM TABLE WHERE COLUMN=[VALUE]) --- 서브쿼리 ---
SELECT (SubQuery) ---스칼라 서브쿼리---
FROM (SubQuery) ---인라인 뷰---
a WHERE[COLUMN] = (SubQuery) ---일반 서브쿼리---

서브쿼리 종류

  • 단일 행 서브쿼리
SELECT name, email FROM member WHERE id=(SELECT id FROM bbs where idx=192)

단일 행 반환

  • 다중 행 서브쿼리
SELECT name, email FROM member WHERE id in(SELECT id FROM)

다중 행 반환

스칼라 서브컬 예시

select name, (select 1,2) from member;

하나의 컬럼을 넣어야 에러가 나지 않습니다.

select name, (select 1 union select 2) from member;

두 개의 레코드가 반환되어야 하지만 에러가 발생합니다.

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

이 예제 같은 경우 먼저 from절이 실행이 되는데 이 from절에 a란 별칭이 있습니다. a란 별칭을 사용하지 않으면 시퀀스가 동일한 컬럼이기 때문에 충돌이 발생합니다. 이 테이블에 대한 별칭을 줌으로써 이 a.seq는 해당 컬럼이다라고 지시를 하는겁니다.

일라인 뷰 서브컬 예시

select * from (select * from member);

에러 발생

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

일반적인 서브컬 예시

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

from 절에서 멤버 값을 받아서 반환이 되고 그 다음 where 절이 실행됩니다. where 절에서 특정 시퀀스 값이 세팅되어 있고,(1이 아니면 2로, ... 맞는 값이 될때까지 적용됩니다) name이 게스트 인 것에 대한 시퀀스 값이 반환이 됩니다.

0개의 댓글