DB/SQL
MySQL 문법 정리
뽀루피
2024. 8. 30. 19:29
AS (별칭 정의)
속성이나 테이블에 별칭을 설정하는 것
- SELECT 절에서의 AS:
- SELECT 절에서 정의된 별칭은 WHERE 절에서 사용할 수 없다.
- ORDER BY, GROUP BY, HAVING 절에서 사용할 수 있다.
- FROM 절에서의 AS (테이블 별칭):
- FROM 절에서 정의된 테이블 별칭은 쿼리의 모든 부분에서 사용할 수 있다.
- 서브쿼리에서의 AS:
- 외부 쿼리에서는 사용할 수 없다. 단, 해당 서브쿼리를 직접 포함하는 상위 쿼리에서는 사용할 수 있다.
WITH (반복 함수)
복잡한 쿼리를 쉽게 풀어쓸 수 있다.
- 임시 테이블 생성
- WITH절은 쿼리 내에서 임시로 사용할 수 있는 이름을 붙인 서브쿼리를 생성한다.
- 재사용성
- 동일한 서브쿼리를 여러번 써야할 때 WITH절을 통해 한번만 정의하고 여러번 참조할 수 있다.
ex)
WITH sales_data AS (
SELECT customer_id, SUM(amount) AS total_sales
FROM sales
GROUP BY customer_id
)
SELECT customer_id, total_sales
FROM sales_data
WHERE total_sales > 10000;
sales_data라는 임시 테이블을 WITH절로 정의하고 메인 쿼리에서 사용한다.(1)
WITH
avg_scores AS (
SELECT AVG(score) AS overall_avg
FROM exam_results
),
student_scores AS (
SELECT
student_id,
AVG(score) AS student_avg
FROM exam_results
GROUP BY student_id
)
SELECT
s.student_id,
s.student_name,
ss.student_avg,
CASE
WHEN ss.student_avg > a.overall_avg THEN 'Above Average'
WHEN ss.student_avg = a.overall_avg THEN 'Average'
ELSE 'Below Average'
END AS performance
FROM students s
JOIN student_scores ss ON s.student_id = ss.student_id
CROSS JOIN avg_scores a
ORDER BY ss.student_avg DESC;
avg_scores와 student_scores를 메인 쿼리에서 여러번 참조할 수 있다.(2)
RANK(순위 구하기)
데이터에 순위를 매기고 싶을 때 사용할 수 있는 기능
SELECT id, amount, RANK() OVER(ORDER BY amount DESC) AS ranking
FROM ex_card
RANK() OVER(ORDER BY 정렬 기준)으로 순위 컬럼을 생성할 수 있다.
RANK() 함수의 경우 같은 순위가 있을 경우 다음 순위는 건너뛴다.
결과는 1, 1, 1, 4, 4, 6, ... 이런식으로 나타난다.
만약 다음 순위를 이어가고 싶다면 DENSE_RANK()를 사용하자.
SELECT id, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS ranking
FROM ex_card
결과는 1, 2, 3, 4, ... 순서대로 나타난다.
TRUNCATE (절삭 함수)
TRUNCATE(number, decimals)
- number: 절삭할 숫자
- decimals: 유지할 소수점 자리수 (음수 값 사용 가능)
ex)
SELECT
TRUNCATE(PRICE, -4) AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
- PRICE를 10,000 단위로 그룹화한다 (TRUNCATE(PRICE, -4))
SET(변수 지정 함수)
변수 선언 및 초기화
SET @변수명 = 값;
SELECT 문에서 변수 선언
SELECT @변수명 := 값;
ex)
SET @start = 15, @finish = 20;
SELECT * FROM employee WHERE id BETWEEN @start AND @finish;