SQL SELSET 문 예시
SELECT E.department_id, D.department_name, AVG(E.salary) AS avg_salary
FROM Employees E
JOIN Departments D
ON E.department_id = D.department_id
WHERE E.salary > 50000
GROUP BY E.department_id, D.department_name
HAVING AVG(E.salary) > 60000
ORDER BY avg_salary DESC
LIMIT 3;
SELECT 작성 순서
- SELECT
- FROM
- JOIN
- ON
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- LIMIT
SELECT 실행 순서
- FROM
- JOIN
- ON
- WHERE
- 2차 테이블 완성
- GROUP BY
- 그룹함수
- 3차 테이블 완성(그룹작업이 있을 경우에만)
- HAVING
- SELECT
- 4차 테이블 완성(HAVING작업이 있을 경우에만)
- ORDER BY
- LIMIT
- 고객(MySQL 클라이언트, 대표적으로 Sequel Pro, SQLYog, JDBC Driver 등)에게 전달
요약 (작성 순서 VS 논리적 순서)
| 작성 순서 | 실제 실행 순서 (논리적 순서) |
| SELECT | FROM |
| FROM | JOIN (필요 시) |
| JOIN (필요 시) | ON (필요 시) |
| ON (필요 시) | WHERE |
| WHERE | GROUP BY |
| GROUP BY | HAVING |
| HAVING | SELECT |
| ORDER BY | ORDER BY |
| LIMIT | LIMIT |
주의
1. 명확한 조건이 없는 집계함수의 열(Column)
SELECT *, MAX(Salary)
FROM employees;
- MAX(Salary)는 테이블에서 최대 Salary 값을 가져옵니다.
- 그러나 SELECT *는 테이블의 모든 열(Column)을 포함하므로, 나머지 열의 값은 랜덤하거나 예측할 수 없는 값으로 반환될 수 있습니다.
2. 올바른 쿼리
(1) 서브쿼리 활용
SELECT *
FROM employees
WHERE Salary = (SELECT MAX(Salary) FROM employees);
- 최대 Salary에 해당하는 모든 행 가져오기
- 서브쿼리 (SELECT MAX(Salary) FROM employees)는 최대 Salary 값을 계산합니다.
- WHERE 조건으로 최대 Salary 값에 해당하는 행만 선택합니다.
(2) GROUP BY
SELECT Name, MAX(Salary)
FROM employees
GROUP BY Name;
- GROUP BY는 열을 기준으로 데이터를 그룹화하여, 그룹별 집계 함수의 값을 계산합니다.
- 이 방식은 SELECT와 MAX 간의 명확한 관계를 설정합니다.
(3) ORDER BY, LIMIT
SELECT *
FROM employees
ORDER BY Salary DESC
LIMIT 1;
- ORDER BY Salary DESC: Salary 기준으로 내림차순 정렬
- LIMIT 1: 가장 높은 Salary를 가진 첫 번째 행만 반환
출처
OpenAI의 ChatGPT (https://openai.com)
2024 프로그래머스 백엔드 데브코스 3기 4회차 수업
'DB > MySQL' 카테고리의 다른 글
| GROUP BY (0) | 2025.01.02 |
|---|---|
| JOIN (2) | 2025.01.01 |
| AUTO_INCREMENT (0) | 2024.12.29 |
| DBMS를 사용하는 이유 feat. MySQL (1) | 2024.12.27 |
| SQL (0) | 2024.12.26 |