CS공부/SQL

ORDER BY절, 서브쿼리

티코딩 2024. 1. 22. 16:02

ㅇ 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)와 같은것들을 모두 출력해줘." 가 된다.