-
SQL 서브쿼리_1Database 2021. 4. 9. 16:17728x90
서브쿼리
명령에 의한 데이터 질의로, 상부가 아닌 하부의 부수적인 질의를 의미한다.
간단하게 부수적인 질의 정도로 이해하자.
SQL 명령을 기술할때 서브쿼리를 사용하면 여러번 입력하여 알아 낼수 있는 정보를 한 줄로 명령 할 수 있다.
서브쿼리는 SQL 명령문 안에 하부 SELECT 명령으로 괄호로 묶어 지정한다.SELECT, WHERE, FROM, 등 다양한 문법에서 기술할 수 있다.
특히나, 서브쿼리는 WHERR 구에서 주로 사용되며 WHERE 구는 SELECT, DELETE, UPDATE 구에서 사용할 수 있는데 이들 중 어떤 명령에서든지 서브쿼리를 사용할 수 있다.
DELETE의 WHERE 구에서 서브쿼리 사용하기
아래의 예제에서 A열에서 가장 작은 값을 가지고 있는 행을 삭제해보도록 하자.
해당 테이블은 값이 몇개 없기에 A=100이 가장 작은 값임을 알 수 있지만, 테이블의 크기가 굉장히 클 경우 최소값을 찾은 후 삭제를 해야할 것이다.
서브쿼리를 모르는 상태였다면
총 2번의 명령으로 가장 작은 값을 찾아 삭제하였다면,
1. select min(A) from ttt_set; 2. delete from ttt_set where A = 100;
서브쿼리를 사용한다면
총 1번의 명령으로 가장 작은 값을 찾아 삭제할 수 있다.
delete from ttt_set where A = (select min(A) from ttt_set);
MySQL에서는 위의 명령어로 삭제를 할 수 없다.
데이터를 갱신 할 경우 동일한 테이블을 서브쿼리에서 사용할 수 없도록 설정되어 있기 때문이라 한다.
표준 SQL의 문법은 위와 같고 MySQL에서는 아래와 같은 명령으로 변경해야 한다고 한다.
delete from ttt_set where A = (select A from (select min(A) As a from ttt_set) As a);
스칼라 값
서브쿼리를 사용할때는 SELECT 명령이 어떤 값을 반환하지는 주의해야 한다!!
아래와 같이 네가지의 일반적인 서브쿼리의 패턴이 있다.
1. 하나의 행, 하나의 열을 반환하는 경우
2. 복수의 행, 하나의 열을 반환하는 경우
3. 하나의 행, 복수의 열을 반환하는 경우
4. 복수의 행, 복수의 열을 반환하는 경우
이 중 1번만 다른 경우와 달리 하나의 값을 반환하는 점을 눈여겨 봐야한다.
이처럼 "단일 값"으로 통용되며, 데이터베이스 업계에서는 이를 "스칼라 값"이라고 부른다.
SELECT 명령이 하나의 값만 반환하는 것을 스칼라 값을 반환한다고 표현한다!!
스칼라 값이 특별한 이유
스칼라 값을 반환하는 SELECT 명령을 특별 취급하는 이유는 서브 쿼리로 사용하기 쉬운 명령이라는 뜻이다.
통상적으로 특정 두 가지가 서로 동일한지를 비교할때는 서로 단일한 값으로 비교하기 때문이다. 이는 WHERE 구에서 스칼라 값을 반환하는 서브쿼리는 = 연산자로 비교가 가능하다는 점에서 중요하다.
delete from ttt_set where A = (select min(A) from ttt_set);
위에서 살펴봤던 명령어로 = 연산자 사용이 가능한 이유는 서브쿼리가 스칼라 값을 반환하기 때문이다.
그렇기에 = 연산자로 열 A의 값과 비교할 수 있었던 것이다.
서브쿼리 부분을 스칼라 값을 반환하지 않도록 할 수도 있으며, 이때 SELECT 구에서 다른 열을 지정하거나 GROUP BY를 지정하면 에러가 난다고 한다.
이처럼 스칼라값을 반환하는 서브쿼리를 " 스칼라 서브쿼리" 라 부르기도 한다.
이전 집계함수를 조건식으로 이용하기 위해 HAVING 구에서 알아보았듯 WHERE 구에서는 집계함수를 조건으로 지정하여 사용 할 수 없었지만, 스칼라 서브쿼리를 사용한다면 집계함수를 사용해 WHERE 구에서도 집계 결과를 이용한 조건식을 사용할 수 있다고 한다.
출처 :
SQL 첫걸음/ 아사이 아츠시 지음/ 한빛미디어
728x90'Database' 카테고리의 다른 글
SQL 상관 서브쿼리 (0) 2021.04.19 SQL 서브쿼리_2 (0) 2021.04.14 SQL GROUP BY (0) 2021.04.09 SQL COUNT 집계함수 (0) 2021.03.29 물리삭제와 논리삭제 (0) 2021.03.29