MySQL

서브쿼리,집합연산

yougeun 2022. 11. 22. 14:53
728x90

서브쿼리

쿼리문 내에 또 다른 쿼리문이 있는 형태

서브쿼리는 메인쿼리에 포함되는 관계

()을 사용해 감싸는 형태

ORDER BY를 사용하지 못함

사용가능한 위치: SELECT,FROM,WHERE,HAVING,ORDERBY

종류:단일행서브쿼리,다중행 서브쿼리,다중컬럼 서브쿼리

 

(1)단일 행 서브쿼리

결과가 레코드 하나인 서브쿼리

일반 연산자(=,<,> 등) 사용

 

select * from city where CountryCode = (select Code from country where Name="South Korea");

국가명이 South Korea인 국가코드를 찾아 도시 출력

(2)다중 행 서브쿼리

결과가 레코드 여러 개인 서브쿼리

다중행 연산자(IN,ALL,ANY,EXISTS) 사용

ALL:여러개의 AND 효과(가장 큰 값과 비교)

ANY:여러개의 레코드의 OR 효과(가장 작은 값과 비교)

IN,EXISTS:결과값중에 있는 것 중에서의 의미

IN은 전체레코드를 스캔하고, EXISTS는 존재여부만 확인하고 스캔하지 않음(상대적으로 속도가 빠르다)

select Name,CountryCode,Population from city 
where Name in (select Name from city where Population>5000000);

인구수가 50만명 이상인 도시

 

select Name,CountryCode,Population from city 
where Population> ALL(select PoPulation from city where CountryCode ="KOR");

한국의 인구수가 가장 적은 도시보다 인구수가 적은 도시

 

select Name,CountryCode,Population from city  
where Population> ANY(select PoPulation from city where CountryCode ="KOR");

한국의 인구수가 가장 적은 도시보다 인구수가 많은 도시

 

(3)멀티컬럼  서브쿼리

결과가 컬럼 여러 개인 서브쿼리

select count(*) from city where exists(select * from city where CountryCode = "KOR");

국가코드가 KOR인 도시가 존재한다면 city의 개수를 출력

한국의 인구수가 가장 적은 도시보다 인구수가 많은 도시

 

집합연산

(1)UNION

두 쿼리의 결과값을 합쳐서 리턴한다.

두 쿼리의 결과 형식이 동일해야 한다(기본적으로 DISTINCT가 적용된다)

다른 테이블이라도 결과값의 형식만 일치하면 가능하다.

select * from city where CountryCode ="KOR" union select * from city where CountryCode ="KOR";

union을 하였지만 DISTINCT가 적용되어 중복된 데이터는 나오지 않는것을 볼 수 있다.

(2)UNION ALL

중복을 허용하는 UNION

select * from city where CountryCode ="KOR" union all select * from city where CountryCode ="KOR";

union all은 중복된 데이터를 허용한다.

728x90