• 카테고리

    질문 & 답변
  • 세부 분야

    보안

  • 해결 여부

    미해결

마지막 서브쿼리문

22.08.29 20:53 작성 조회수 129

1

서브쿼리문

select from (select from ex_member where 1=1) where id = ? 를 쓰면 placeholder 개수를 신경 안써도 된다는건 서브쿼리의 실행여부로 조건구문을 테스트 할 수 있다는 뜻인거죠? 즉, 서브쿼리가 성공적으로 수행되면 placeholder의 개수로 인한 에러가 뜰 것이고, 서브쿼리가 실패하면 테이블 없다는 에러가 뜨는 걸로 테스트 한다고 이해하면 될까요?

그리고 sql 쿼리문 실행과정이 웹 기초 강의에서 구문분석,정규화->컴파일->쿼리 최적화->캐시->실행이라고 하셨는데 서브쿼리문을 쓰게 되면 서브쿼리에서 위의 과정을 한번 거치고, 전체 쿼리에서 위의 과정을 또 거쳐서 총 2번 거치는건가요?

답변 2

·

답변을 작성해보세요.

1

안녕하세요.

서브쿼리 조건 (참) 성공 시 기존 ex_member 테이블에 대한 결과 반환으로 select * from ex_member where id=? 동일한 쿼리라 보심됩니다.

서비쿼리 실패 (거짓) 시 기존 ex_member 테이블 결과 미반환으로 결과는 거짓으로 되어 결과 반환이 되지 않습니다.

그리고 에러는 발생하지 않습니다. 또한 서브쿼리 작성 시 Alias 별칭은 꼭 사용해주셔야 합니다.

select * from (select from ex_member where 1=1)a where id = ?

서브쿼리를 사용하게 된다고 해도 실행과정이 2번이 아닌 1번으로 전부 진행된다고 보면 될 것 같습니다.

gdh님의 프로필

gdh

질문자

2022.08.30

답변 감사합니다.

그렇다면 select * from (select from ex_member where 1=1)a where id = ?(서브쿼리o) 이 경우도 결국 placeholder의 개수와 파라미터명에 얽매이는건 마찬가지 아닌가요?

select * from ex_member where 1=1 and id=? -- where id =? (서브쿼리x) 이 쿼리문은 placeholder에 신경써야되는데 서브쿼리문 쓰면 placeholder를 무시해도 된다고 하셔서 질문드립니다.

select from (select * from ex_member where 1=1)a where id = ? 의 경우는 placeholder 개수에 영향을 받지 않습니다.

이유는 코딩상으로 PlaceHolder가 1개 그리고 값을 세팅하는 셋터 1개는 동일하기 때문입니다. 여기서 유동적으로 변한다고해도 서브쿼리만 건드리고 조건절은 건드리지 않기 때문에(정확히는 PlaceHolder를 건드리지 않기 때문에) 정상적으로 동작이 됩니다.

직접 코딩을 해보시면서 실습을 해보면 보다 쉽게 이해를 하실수 있으실겁니다 ㅎ

0

제노비아님의 프로필

제노비아

2024.05.04

13분 25초에 보면 ? 가 여러개일때 문제가 발생한다며 이 방법을 추천 안하다고 하셨습니다. 그러면서 ?를 무시하고 사용하는게 서브쿼리라고 하셨는데 from안에 서브쿼리를 넣으면 ? 가 여러개일때 문제를 생각안해도 된다는건가요? 만약 select * from ? where id = ? and name=? and count=? 이렇게 여러개의 ?가 있어도 서브쿼리가 있으면 ? 부분을 무시하고 사용 가능하다는 건지 질문드립니다.

 

채널톡 아이콘