1. Select문
SELECT 쿼리문은 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 총 6단계를 거친다.
이때, 쿼리의 실행 순서를 아는 것은 중요하다. 실행순서를 모르면 쿼리를 제대로 작성하기 어렵다. 예를 들어 보자.
SELECT 번호, 이름, 제품명, (수량 * 가격) as 총액
FROM 고객 join 주문 on 고객.번호 = 주문. 고객 번호
WHERE 가격 >= 10000
ORDER BY 가격 DESC
그리고 테이블은 다음과 같다.
번호 | 이름 | 나이 | 성별 |
1 | kim | 20 | F |
2 | park | 30 | M |
3 | lee | 40 | M |
4 | jo | 18 | F |
주문 번호 | 제품명 | 수량 | 가격 | 고객번호 |
1 | aaa | 1 | 27000 | 1 |
2 | bbb | 2 | 3000 | 1 |
3 | ccc | 3 | 18000 | 2 |
4 | ddd | 2 | 5000 | 4 |
5 | eee | 10 | 7000 | 3 |
2. SELECT문 실행 순서
1. from 고객 join 주문
다음과 같이 고객 table과 주문 table을 join시 Cartesian Table(= Cross Table)이 만들어진다. 이 테이블은 유의미한 데이터를 의미하지 못하며 반드시 조건문을 통해 filtering 해야 유의미한 데이터 테이블이 만들어진다.
번호 | 이름 | 나이 | 성별 | 주문번호 | 제품명 | 수량 | 가격 | 고객번호 |
1 | kim | 20 | F | 1 | aaa | 1 | 27000 | 1 |
1 | kim | 20 | F | 2 | bbb | 2 | 3000 | 1 |
1 | kim | 20 | F | 3 | ccc | 3 | 1800 | 2 |
1 | kim | 20 | F | 4 | ddd | 2 | 5000 | 4 |
1 | kim | 20 | F | 5 | eee | 10 | 7000 | 5 |
2 | park | 30 | M | 1 | aaa | 1 | 27000 | 1 |
2 | park | 30 | M | 2 | bbb | 2 | 3000 | 1 |
2 | park | 30 | M | 3 | ccc | 3 | 1800 | 2 |
2 | park | 30 | M | 4 | ddd | 2 | 5000 | 4 |
2 | park | 30 | M | 5 | eee | 10 | 7000 | 5 |
3 | lee | 40 | M | 1 | aaa | 1 | 27000 | 1 |
3 | lee | 40 | M | 2 | bbb | 2 | 3000 | 1 |
3 | lee | 40 | M | 3 | ccc | 3 | 1800 | 2 |
3 | lee | 40 | M | 4 | ddd | 2 | 5000 | 4 |
3 | lee | 40 | M | 5 | eee | 10 | 7000 | 5 |
4 | jo | 18 | F | 1 | aaa | 1 | 27000 | 1 |
4 | jo | 18 | F | 2 | bbb | 2 | 3000 | 1 |
4 | jo | 18 | F | 3 | ccc | 3 | 1800 | 2 |
4 | jo | 18 | F | 4 | ddd | 2 | 5000 | 4 |
4 | jo | 18 | F | 5 | eee | 10 | 7000 | 5 |
2. on 고객.번호 = 주문. 고객 번호
다음과 같이 on절을 통해 고객 table의 번호와 주문 table의 고객번호가 일치하는 칼럼만 필터링한다면 해당 고객이 주문한 주문목록으로 유의미한 데이터를 얻을 수 있다.
이때 PK(Primary Key)와 FK(Foriegn Key)를 이용하여 테이블간에 참조 관계를 만들 수 있다.
즉, 주문 table의 고객번호(FK)는 고객 table의 번호(PK)를 참조한다.
참조 관계가 형성되면 데이터 삽입과 삭제에 제약이 걸린다.
번호 | 이름 | 나이 | 성별 | 주문번호 | 제품명 | 수량 | 가격 | 고객번호 |
1 | kim | 20 | F | 1 | aaa | 1 | 27000 | 1 |
1 | kim | 20 | F | 2 | bbb | 2 | 3000 | 1 |
2 | park | 30 | M | 3 | ccc | 3 | 1800 | 2 |
3 | lee | 40 | M | 5 | eee | 10 | 7000 | 3 |
4 | jo | 18 | F | 4 | ddd | 2 | 5000 | 4 |
3. where 가격 >= 10000
번호 | 이름 | 나이 | 성별 | 주문번호 | 제품명 | 수량 | 가격 | 고객번호 |
1 | kim | 20 | F | 1 | aaa | 1 | 27000 | 1 |
4. select 번호, 이름, 제품명 (수량 * 가격) as 총액
번호 | 이름 | 제품명 | 총액 |
1 | kim | aaa | 27000 |
5. order by 가격 desc
4번에서 보여지는 table에 가격이라는 칼럼명이 보여지지 않지만 사실은 3번의 테이블에서 번호, 이름, 제품명, 총액을 선택한 개념이므로
가격을 기준으로 정렬할 수 있다.
따라서 SQL이 실행되는 순서는 다음과 같다.
FROM - > ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY
'IT' 카테고리의 다른 글
WebBrowser의 실행 과정 (0) | 2023.11.15 |
---|---|
표준적인 FirebaseFirestore 데이터 저장 방식 정리 (0) | 2023.07.24 |
REST API (0) | 2023.05.02 |