Error Based나 Blind SQLi할 때 서브쿼리를 사용하곤 했는데 서브 쿼리가 알고 있던 것보다 다양하게 활용할 수 있어서 서브쿼리에 대해 정리해보겠다.
우선 서브 쿼리는 한 쿼리문 안에 다른 쿼리문을 포함시키는 방법을 말한다. 서브 쿼리는 괄호를 사용해 묶어주어야 하며, SELECT문만 사용할 수 있다.
이와 같은 식으로 한 select문 내에 다른 select문을 사용할 수 있으며 괄호를 사용하지 않을 시 문법 오류가 발생한다.
그리고 위의 서브쿼리의 결과가 하나가 아니라면 에러가 발생한다. 이는 위치에 따라 다르다.
컬럼 위치에서의 서브 쿼리
만약 위의 예시처럼 컬럼 절에서 서브 쿼리를 사용할 때는 결과가 하나가 반환되도록 해야 한다.
컬럼이 두 개 이상이거나 행(row)이 두 개 이상이면 에러가 발생한다.
FROM절 서브 쿼리(Inline view)
from절에서의 서브 쿼리는 column절과는 다르게 여러 행과 컬럼이 반환되도 괜찮다. 특히 이 from절에서 사용하는 서브 쿼리를 인라인 뷰라고 한다. 인라인 뷰는 뷰가 발생하되 서브 쿼리에서 일시적으로 사용되고 사라진다는 의미이다.
우선 이러한 테이블이 있다. 이 테이블을 이용해 인라인 뷰를 조금 익혀볼 것이다.
인라인 뷰를 사용한 형태이다. 인라인 뷰는 별칭(alias)을 사용해야 하니 뒤에 as 별칭 형태로 구문이 붙는다.
해석을 하자면 전체를 select 하되 서브쿼리의 select *,1234 from test의 결과를 select 하겠다! 라고 생각하면 된다.
그럼 위의 두 개도 해석이 가능할 것이다.
where절에서의 서브 쿼리
where 절에서의 서브 쿼리는 여러 행 결과를 반환할 수 있다. 대신 여러 컬럼은 안 된다.
여러 컬럼을 반환했더니 에러가 발생한다.
다시 test 테이블로 돌아와서 test 테이블에는 이런 식으로 구성이 되어있다.
where 절에서 서브 쿼리를 사용한 예시이다. 분명 union select로 Ber과 cat을 동시에 select 해주었지만 결과는 한 행만 나왔다. 어떻게 해석해야 할까?
Ber과 cat을 동시에 select 한 것은 맞으나 test 테이블에는 Ber이라는 id를 가진 행이 없기 때문에 cat 행만 출력된 것이다.
test 테이블에 있는 필드를 사용했더니 결과가 2개가 나왔다.
어느 절에 사용하느냐에 따라 반환되는 행이나 컬럼의 개수가 달라지기도 하고 쿼리 자체가 변경되는 부분도 있으니 주의해서 학습해야겠다.
'기본적인 웹 공부' 카테고리의 다른 글
NRDBMS(NoSQL) (0) | 2022.10.21 |
---|---|
쿠키와 세션 / 로그인 로직 (0) | 2022.10.21 |
DB / RDBMS ?? (0) | 2022.10.19 |
HTTP 상태 코드 (0) | 2022.10.17 |
3-Tier Client / Server (0) | 2022.10.15 |