[Data Base] MySQL 서브쿼리

HOHO·2023년 3월 15일

#MYSQL

목록 보기
10/17

서브쿼리

  • SQL명령문 내부에 지정하는 하부QUERY문
  • ()소괄호로 묶어서 지정한다
delete from sample54 where a = (select min(a) from sample54);
#테이블에서 a열의 값이 최소값인 데이터를 찾아서 그 행을 삭제

처리순서는 ()우선이므로 서브쿼리부터 우선 처리한다

  • 위 쿼리문은 MYSQL에서는 에러코드 1093이 뜬다고한다
    (Oracle에서 된다는 뜻같다)
    책에서는 이유로 데이터를 추가/갱신할때 동일 테이블을 서브쿼리에서 사용할수없다 라고한다

변수만들기

사용자정의 변수를 사용해서는 가능하다고 한다
set @변수명으로 사용자정의변수 생성

set @var = (select min(a) from sample54);
#변수 설정
delete from sample54 where a = @var;
#변수를 대입해 준다
#최소값(a)가 DELETE되어 출력되었다

서브쿼리의 종류를 다시한번 보자

서브쿼리의 형태
#SELECT 절 - (스칼라 서브쿼리)
select (select from) from 테이블명
#select 옆

#FROM 절 - (인라인 뷰) 
select * from (select * from) AS 가상테이블명
#인라인뷰에서는 as로 별칭을 선언하고 사용해야함
#from 옆

#where절 - (중첩서브쿼리)
select * from 테이블명 where 테이블명 = 
(select * from) 테이블명
#where 옆
  • SELECT값이 하나의 값을 반환하는 경우를 '단일 값'/스칼라값이라고 불린다
select
(select count(*) from sample111) AS X,
(select count(*) from sample222) AS Y 
from dual;

각 select문은 하나의 값을 반환하여 스칼라값이고,
MYSQL에서는 상위 SELECT문의 FROM을 생략이 가능하다고 하지만 -> from dual
난 왠만하면 표준으로 공부하고싶다


뜬금없이 방금 찾은것
테이블 여러개 뒤죽박죽 섞여서 보기
select * from 테이블명 1, 테이블명 2 테이블명 3 ......
테이블들이 모조리 섞여서 혼종이 되어 튀어나온다
->....교차결합의 곱집합이라고 한다 세상에..


set @aa = (select max(a)from sample54);
update sample54 set a = @aa;
#테이블의 a column을 a의 최대값으로 갱신

#또다른 방법
update sample54 
set a = 
(select a from (select max(a) as a from sample54)as x);
#인라인뷰로 임시테이블을 만들어서 실행하는 방법이라고 한다

인라인 뷰

#인라인뷰
select * from (select * from sample123) subq;
#AS는 생략가능하고, Oracle은 As가 없다고 함

#뷰의 생성
create view subq as select * from sample123;

JOIN맛보기 및 ROWNUM

select @rownum := 0;
select * from sample54 order by no;
select @rownum := @rownum+1 rownum,no,a from sample54,
(select @rownum := 0) tmp; #join
  • rownum이라는 변수와 가상테이블 생성
  • sample54 테이블과 JOIN

INSERT 서브쿼리

#VALUES를 사용
insert into sample541 values(
(select count(*)from sample51), 
(select count(*)from sample54)
);
#테이블 51,54의 count값을 541테이블에 추가

이때 서브쿼리는 스칼라값이어야 하고 자료형도 일치해야한다


profile
기계 그잡채가 되고싶다

0개의 댓글