ORDER BY절, 서브쿼리
ㅇ ORDER BY절
특정 기준으로 데이터를 정렬하고 싶을 때, 행에 대한 정렬을 할 수있는 절
SELECT * FROM 테이블 WHERE 조건식 GROUP BY 기준 HAVING 조건식 ORDER BY 정렬기준 정렬방법(ASC, DESC)
정렬기준 : 칼럼명, 칼럼 조회 순서, 칼럼의 별칭명
정렬방법 : 오름차순(ASC), 내림차순(DESC)
학생 테이블이 있다 치자.
학생번호 | 성명 | 나이 |
a01 | 김태형 | 17 |
a02 | 김태순 | 18 |
a03 | 김태평 | 19 |
a04 | 김태횽 | 20 |
SELECT * FROM 학생 ORDER BY 나이 DESC
하면 아래와 같이 정렬되서 나온다.
학생번호 | 성명 | 나이 |
a04 | 김태횽 | 20 |
a03 | 김태평 | 19 |
a02 | 김태순 | 18 |
a01 | 김태형 | 17 |
나이순을 내림차순으로 정렬했다.
만약 정렬기준을 하나로 정했는데, 같은값이 나오면 뭘 더 위에 둬야할까 싶을땐, 정렬기준을 두개이상 적을 수도 있다.
예를 들어 급여 컬럼을 내림차순으로 정렬했는데, 급여가 같은 경우 입사일 기준으로 오름차순으로 정렬을 실행 할수도 있다.
ㅇ 서브쿼리
ㅁ 의미
쿼리문에 포함된 또 다른 쿼리문을 의미함. 이게 무슨말일까? 서브쿼리는 메인쿼리에서 특정 칼럼값을 가져오거나 필터링하는 값으로 메인쿼리를 도와주는 역할을함. 서브쿼리는 괄호로 묶어 사용하고 중복사용이 가능하다는 특징이 있다.
ㅁ 종류
- 위치
서브쿼리는 사용되는 위치에 따라 SELECT(스칼라), FROM(인라인), WHERE(일반) 절에 따라 명칭이 다름.
- 결과값
단일행 서브쿼리 : 하나의 열에 하나의 행을 반환
다중행 서브쿼리 : 하나의 열에 하나 이상의 행을 반환
다중열 서브쿼리 : 하나 이상의 열에 하나 이상의 행을 반환
ㅁ SELECT절 서브쿼리(스칼라 서브쿼리)
SELECT 칼럼1, 칼럼2, .... , (SELECT 칼럼1 FROM 테이블B WHERE 메인쿼리와 연결되는 조건) AS 별칭명 FROM 테이블A....
이렇게 여러개의 테이블이 있을때, 겹치는 칼럼이 있는경우에 사용하면 좋다.
- 회원 테이블
회원번호 | 회원권 종류 | 성명 | 등록일 |
m-012 | p-001 | 김태형 | 2020.01.20 |
m-120 | p-002 | 권태헌 | 2022.12.10 |
m-934 | p-001 | 김지원 | 2019.02.03 |
m-440 | p-002 | 김태푱 | 2021.12.12 |
- 회원권 테이블
회원권 종류 | 회원권 이름 |
p-001 | 한달권 |
p-002 | 일년권 |
이렇게 있을 때, 서브쿼리의 예시를 보자.
SELCET 회원번호, 성명, 등록일, (SELECT 회원권이름 FROM 회원권 WHERE 회원권 종류 = m.회원권 종류) AS 회원권 FROM 회원 m
회원번호 | 성명 | 등록일 | 회원권 |
m-012 | 김태형 | 2020.01.20 | 한달권 |
m-120 | 권태헌 | 2022.12.10 | 일년권 |
m-934 | 김지원 | 2019.02.03 | 한달권 |
m-440 | 김태푱 | 2021.12.12 | 일년권 |
이렇게 된다.
ㅁ FROM절 서브쿼리(인라인 서브쿼리)
서브쿼리의 결괏값이 하나의 테이릅ㄹ로 기능하기 때문에 서브쿼리의 결과는 FROM 절에 작성하게 될 하나의 테이블임.
FROM절 서브쿼리는 닫기 괄호 이후에 'AS 별칭'을 작성해야 오류가 나지않음.
SELECT * FROM (
SELECT category_id , COUNT(product_id) AS count_of_product FROM product_info GROUP BY category_id) P
WHERE count_of_product >=5
괄호안의 서브쿼리를 살펴보면, "product_info 테이블에서 category_id가 같은것끼리 그룹화해서 product_id 칼럼의 데이터 개수를 세어줘서 그걸 count_of_product라고 칭하고 category_id와 count_of_product를 뽑아줘" 가 된다.
ㅁ WHERE절 서브쿼리(일반 서브쿼리)
서브쿼리 결과값이 조건식의 특정 값 기능을 하기에 WHERE 절에 연산자에 따라 서브쿼리의 결과값이 단일행 or 다중행으로 출력됨.
SELCT *
FROM product_info
WHERE category_id = (SELECT category_id FROM category_info WHERE category_name = '가전제품')
"product_info 테이블에서 category_id가 (category_info 테이블에서 category_name이 가전제품인 category_id)와 같은것들을 모두 출력해줘." 가 된다.