MySQL 문법 - 3 (SubQuery / ANY / SOME / ALL / ORDER BY / DISTINCT / LIMIT )
SubQuery
쿼리문 속에 쿼리문이 또 존재하는 것.
"A를 만족하는 데이터의 B값과 일치하는 C값들을 찾기" 라는 느낌이다.
B값은 2개 이상이 되면 에러가 발생한다.
작성은 다음과 같다.
SELECT [가져올 것] FROM [가져올 위치] WHERE [비교할 값] [조건] (서브쿼리)
서브쿼리는 다음과 같다.
SELECT [보내줄 값] FROM [가져올 위치] WHERE [비교할 값] [비교 대상]
일반적인 쿼리문과 같다. 이 쿼리문을 만족하는 데이터들을 찾아준다.
(서브쿼리)가 곧 비교할 대상들을 뜻한다고 봐도 무방할 것 같다.
아래는 작성 예시이다.
SELECT * FROM city WHERE District = (SELECT District FROM city WHERE NAME='suwon');
도시들 중 이름이 수원인 도시의 (A를 만족하는 데이터의) 행정구의 이름 (B값) 과 같은 행정구의 이름을 갖는 도시들을 선택 (C값들을 찾기)하는 것이다.
District가 경기도면 경기도이지 경기도인데 강원도일 수 는 없으니 2개 이상이 될 수 없다는 뜻이다.
ANY / SOME
ANY는 서브쿼리의 여러 결과들 중 하나라도 만족하는 것들을 찾아주는 것이다.
형태는
SELECT [가져올 것] FROM [가져올 위치] WHERE [비교할 값] [조건] ANY ( 서브쿼리 );
이렇게 작성 가능하며 서브쿼리에 해당하는 값들 중 비교할 값에 대해 비교하며 하나 이상 만족하는 값들을 찾아준다.
SELECT * FROM city WHERE Population > ANY (SELECT Population FROM city WHERE District='Kyonggi');
위의 경우 경기도라는 행정구역을 갖는 여러 도시의 인구수를 넘겨받아(비교대상) 들과 비교하여 한 곳이라도 그보다 인구수가 많은 도시들을 찾아서 출력해주는 것이다.
현재 부등호대로라면 비교대상의 최솟값보다 큰 모든 도시들을 찾아줄 것이고, 부등호 방향이 반대라면 최댓값보다 작은 경우를 만족하는 도시들을 찾아줄 것이다.
SOME 도 같은 역할을 한다고 한다.
= ANY 이렇게 작성한다면 IN과 같은 역할이 된다.
ALL
ALL은 서브쿼리의 여러 결과들 중 모두 만족하는 값들을 찾아주는 것이다.
형태는
SELECT [가져올 것] FROM [가져올 위치] WHERE [비교할 값] [조건] ALL ( 서브쿼리 );
서브쿼리에 해당하는 값들 중 비교할 값에 대해 비교하며 모두 만족하는 값들을 찾아준다.
대소비교를 한다면 >의 경우 최댓값보다 큰 값들, <의 경우 최솟값보다 작은 값들을 뜻할 것이다.
SELECT * FROM city WHERE Population > ALL (SELECT Population FROM city WHERE District='Kyonggi');
이렇게 작성한다면 경기도에서 인구수가 가장 많은 도시보다 인구수가 많은 도시들을 찾아 줄 것이다.
ORDER BY (ASC/DESC)
정렬해서 출력해주는 것이다. 아무것도 적지 않으면 default는 오름차순(ASC)이므로 오름차순을 하고 싶다면 생략해도 된다.
기본적으로 ORDER BY 이전에 데이터들이 존재한다 생각하면 된다. WHERE ~ ORDER BY ~
형태는
SELECT [가져올 것] FROM [가져올 위치] ORDER BY [기준] [ASC/DESC]
ASC의 경우 생략 가능하다. 따라서 오름차순 정렬이라면
SELECT [가져올 것] FROM [가져올 위치] ORDER BY [기준]
이렇게만 적어도 무방하다.
SELECT * FROM city WHERE District = 'Kyonggi' ORDER BY Population ASC;
경기도의 도시들을 인구수 순으로 오름차순 정렬해주는 코드이다.
ORDER BY 앞의 WHERE을 만족하는 데이터값들을 오름차순으로 정렬해서 반환해준다.
문자의 경우 사전순정렬이다.
DISTINCT
중복된 값들은 하나씩만 보여주면서 출력해준다.
중복되는 값들이 많을 때 유용하다. 전 세계 도시의 정보로부터 전 세계 국가의 개수를 알고 싶다거나 ( 도시는 많지만 국가는 도시의 개수보다 적으니까! )
형태는
SELECT DISTINCT [가져올 값] FROM [가져올 곳]
이다.
가져올 값이 2개 이상인 경우 둘 중 하나라도 다르면 다른 것으로 취급한다.
LIMIT N
출력 개수를 제한하여 상위 N개의 자료만을 출력해준다.
게임이나 어디 랭킹을 볼 때 1위부터 전체 끝까지 보여주는 경우는 적다.
수십만의 유저만 있어도 매번 수십만 전체의 랭킹을 출력한다면 서버에 부담이 커지니 말이다.
형태는
SELECT [가져올 값] FROM [가져올 곳] LIMIT [제한(정수)]
이다.
SELECT Name FROM city ORDER BY population DESC LIMIT 15;
이와 같이 작성 시 전 세계 도시를 인구수별로 정렬한 뒤 상위 15개의 이름을 출력해주는 코드가 된다.