SELECT

데이터 조회의 기본이 되는 select

SELECT name, age FROM users;

users 테이블에서 name과 age 칼럼을 선택하여 조회

 

DISTINCT

SELECT DISTINCT country FROM customers;

 

정렬 및 제한

ORDER BY

SELECT name, age FROM users ORDER BY age DESC;

users 테이블의 사용자들을 나이가 많은 순으로 정렬

LIMIT

SELECT name FROM users ORDER BY signup_date DESC LIMIT 5;

최근에 가입한 5명의 사용자 이름을 조회

 

데이터 형식과 함수

Date_format

SELECT DATE_FORMAT(birthday, '%Y-%m-%d') AS formatted_date FROM users;

users 테이블의 birthday를 YYYY-MM-DD 형식으로 변환하여 조회

 

Format

숫자를  포맷팅하여 문자열로 반환. 예를 들어 소수점 아래 숫자를 제한하거나 천 단위 구분자를 추가할 수 있다.

SELECT FORMAT(total_price, 2) AS formatted_price
FROM sales;

sales 테이블의 total_price 칼럼을 소수점 둘째 자리까지 포맷팅 하고 천 단위 구분자를 추가하여 반환

 

Year

SELECT YEAR(birthday) AS birth_year
FROM users;

users 테이블의 birthday 칼럼에서 년도를 추출

 

 

CTE(Common Table Expressions)

WITH

with는 서브 쿼리를 지원한다. cte를 정의할 수 있다.

WITH customer_totals AS (
  SELECT customer_id, SUM(amount) AS total_spent
  FROM orders
  GROUP BY customer_id
)
SELECT *
FROM customer_totals
WHERE total_spent > 1000;

with를 통한 서브 테이블 예시. 각 고객의 총 지출 금액을 계산하고, 1000이상 지출한 고객을 찾는다.

 

WITH RECURSIVE number_sequence AS (
  SELECT 0 AS number
  UNION ALL
  SELECT number + 1 FROM number_sequence WHERE number < 24
)
SELECT * FROM number_sequence;

이렇게 재귀를 통해 0부터 24까지의 숫자를 생성할 수도 있다.

 

Group by, Having

GROUP BY는 데이터를 그룹화 한다.

그룹에 조건을 적용할 때는 HAVING을 사용한다

SELECT category, COUNT(*) AS total_products, AVG(price) AS average_price
FROM products
GROUP BY category
HAVING COUNT(*) > 10 AND AVG(price) > 500;

카테고리 별로 제품 수와 평균 가격을 계산한다. 제품 수가 10개를 초과하고, 평균 가격이 400을 넘는 카테고리만 결과로 나타낸다.

 

JOIN + ON

on의 조건을 기준으로 테이블을 결합한다. 그냥 join이라면 on 조건 기준으로 공통된 조건이 없는 행을 버리게 된다.

using(column)으로 사용할 수도 있다.

leftjoin, rightjoin으로 사용될 수 있는데, 각각 좌측과 우측을 기준으로 공통된 조건이 없는 행도 남겨둔다.

SELECT orders.order_id, customers.name
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

주문 테이블과 고객 테이블을 customer_id로 조인하여 주문 id와 고객 이름을 조회한다.

 

UNION, UNION ALL

쿼리 결과를 단순히 합친다. 결과가 단순히 행으로 추가되는 테이블이라고 이해할 수 있다.

때문에 쿼리의 결과 칼럼 수가 같아야 한다.

SELECT name FROM products
UNION ALL
SELECT name FROM services;

producs와 services 테이블에서 name을 조회하여 모든 결과를 합친다.

 

 

 

 

 

 

ORDERS 테이블

customer_id order_date product_id amount
1 2024-03-10 101 200
2 2024-03-11 103 150
1 2024-03-15 102 300

 

produus 테이블

product_id category price
101 Books 200
102 Electronics 300
103 Books 150

 

 

WITH recent_orders AS (
  SELECT customer_id, MAX(order_date) AS last_order_date
  FROM orders
  GROUP BY customer_id
)
SELECT o.customer_id, o.last_order_date, p.category, SUM(p.price) AS total_spent
FROM recent_orders o
JOIN orders od ON o.customer_id = od.customer_id AND o.last_order_date = od.order_date
JOIN products p ON od.product_id = p.product_id
GROUP BY o.customer_id, p.category
HAVING SUM(p.price) > 500;

각 고객의 최근 주문 날짜를 찾고, 해당 주문에서 특정 카테고리의 제품에 500이상 지출한 고객을 식별한다.

 

쿼리 실행 결과

customer_id last_order_date category total_spent
1 2024-03-15 Electronics 300

 

최근 주문에서 Electronics 카테고리에 300의 금액을 지출했다는 것을 보여준다. 고객 2의 최근 주문은 총 지출액이 500보다 낮은 150이기 때문에 HAVING절에 의해 결과에서 제외된다.

'데이터베이스' 카테고리의 다른 글

[블로그 프로젝트] ERD EDITOR  (0) 2024.01.11

vscode 확장프로그램으로 다운받을 수 있다.

데이터베이스 ERD를 GUI로 직관적으로 생성 및 관리할 수 있다.

vuerd.json 형식의 파일을 생성해준 뒤

ERD Editor를 통해 열어준다

 

마우스로 편하게 ERD를 그리고 key constraints도 추가할 수 있다.

 

그리고 가장 강력한 기능이라고 할 수 있는 DDL 생성. 상단바에 SQL DDL을 클릭한다.

 

내가 그린 ERD에 맞춰서 SQL을 작성해준다.

'데이터베이스' 카테고리의 다른 글

코테 대비 MySQL  (0) 2024.03.12