서브쿼리,집합연산
서브쿼리
쿼리문 내에 또 다른 쿼리문이 있는 형태
서브쿼리는 메인쿼리에 포함되는 관계
()을 사용해 감싸는 형태
ORDER BY를 사용하지 못함
사용가능한 위치: SELECT,FROM,WHERE,HAVING,ORDERBY
종류:단일행서브쿼리,다중행 서브쿼리,다중컬럼 서브쿼리
(1)단일 행 서브쿼리
결과가 레코드 하나인 서브쿼리
일반 연산자(=,<,> 등) 사용
select * from city where CountryCode = (select Code from country where Name="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);
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은 중복된 데이터를 허용한다.