SQL Select
SQL SELECT: 데이터 조회 및 필터링
SQL SELECT 문은 관계형 데이터베이스에서 데이터를 조회하기 위해 가장 많이 사용되는 명령어입니다. SELECT
문을 사용하면 특정 테이블에서 원하는
데이터를 선택하고 필터링할 수 있으며, 다양한 절을 사용하여 결과를 조작할 수 있습니다. 이 글에서는 SELECT
문법, 다양한 옵션, 그리고 실전 예제를 다루어 SQL 데이터를
효율적으로 조회하는 방법을 설명하겠습니다.
1. 기본 SELECT 문법
SQL에서 SELECT 문은 다음과 같은 기본 구조를 가집니다:
SELECT 열이름1, 열이름2, ...
FROM 테이블이름
WHERE 조건;
- 열이름: 조회할 열(Column)의 이름을 지정합니다. 모든 열을 조회하려면 ``를 사용할 수 있습니다.
- 테이블이름: 데이터를 조회할 테이블 이름을 지정합니다.
- WHERE 조건: 선택적으로 조건을 지정하여 원하는 데이터만 필터링합니다.
예제:
SELECT name, salary
FROM employees
WHERE department = 'Sales';
이 쿼리는 employees
테이블에서 부서가 Sales
인 직원의 이름과 급여를 조회합니다.
2. 모든 열 조회: SELECT *
모든 열을 조회하고 싶다면, *
를 사용하여 테이블의 모든 열을 선택할 수 있습니다.
SELECT *
FROM employees;
위 쿼리는 employees
테이블의 모든 열과 행을 반환합니다.
3. DISTINCT: 중복 제거
DISTINCT 키워드는 중복된 값을 제거하고 고유한 값만 반환합니다.
SELECT DISTINCT department
FROM employees;
위 쿼리는 employees
테이블에서 중복을 제거한 부서 목록을 반환합니다.
4. WHERE 절: 조건 필터링
WHERE 절은 특정 조건을 만족하는 행만 조회할 때 사용됩니다. 다양한 조건을 조합하여 데이터를 필터링할 수 있습니다.
4.1 기본 비교 연산자
=
: 같음!=
또는<>
: 같지 않음>
: 큼<
: 작음>=
: 크거나 같음<=
: 작거나 같음
예제:
SELECT *
FROM employees
WHERE salary > 5000;
이 쿼리는 급여가 5,000보다 큰 직원들을 조회합니다.
4.2 논리 연산자
- AND: 두 조건이 모두 참일 때.
- OR: 두 조건 중 하나가 참일 때.
- NOT: 조건을 반전할 때.
예제:
SELECT *
FROM employees
WHERE salary > 5000 AND department = 'Sales';
이 쿼리는 급여가 5,000 이상이면서 부서가 Sales
인 직원들을 조회합니다.
4.3 BETWEEN
BETWEEN
은 값이 두 범위 사이에 있는지 확인합니다.
SELECT *
FROM employees
WHERE salary BETWEEN 3000 AND 6000;
이 쿼리는 급여가 3,000에서 6,000 사이인 직원들을 조회합니다.
4.4 IN
IN
은 여러 값 중 하나가 일치하는지 확인합니다.
SELECT *
FROM employees
WHERE department IN ('Sales', 'HR');
이 쿼리는 부서가 Sales
또는 HR
인 직원들을 조회합니다.
4.5 LIKE
LIKE
는 문자열 패턴을 검색할 때 사용됩니다. %
는 와일드카드로, 0개 이상의 임의 문자를 의미합니다.
SELECT *
FROM employees
WHERE name LIKE 'J%';
이 쿼리는 이름이 'J'로 시작하는 직원들을 조회합니다.
5. ORDER BY: 데이터 정렬
ORDER BY 절을 사용하면 쿼리 결과를 특정 열을 기준으로 정렬할 수 있습니다. 기본값은 오름차순(ASC
)이며, 내림차순으로 정렬하려면
DESC
키워드를 사용합니다.
SELECT *
FROM employees
ORDER BY salary DESC;
이 쿼리는 급여를 기준으로 내림차순으로 직원 목록을 정렬합니다.
6. LIMIT: 결과 행 수 제한
LIMIT 절은 쿼리 결과에서 반환할 행의 개수를 제한할 때 사용합니다.
SELECT *
FROM employees
LIMIT 5;
이 쿼리는 employees
테이블에서 첫 5개의 행만 반환합니다.
7. GROUP BY: 그룹화
GROUP BY 절은 동일한 값을 가진 행을 그룹으로 묶어 집계 함수와 함께 사용할 수 있습니다. 집계 함수는 COUNT(), SUM(), AVG(), MAX(), MIN() 등이 있습니다.
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
이 쿼리는 각 부서별 평균 급여를 계산하여 반환합니다.
8. HAVING: 그룹 조건 필터링
HAVING 절은 GROUP BY
와 함께 사용하여 그룹화된 데이터에 조건을 적용합니다. WHERE
절은 행에 조건을 적용하지만,
HAVING
은 그룹화된 결과에 조건을 적용합니다.
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;
이 쿼리는 부서별 평균 급여가 5,000 이상인 부서만 반환합니다.
9. JOIN: 테이블 간 데이터 연결
JOIN은 여러 테이블의 데이터를 연결하여 조회할 때 사용됩니다. 가장 일반적인 조인 유형은 INNER JOIN과 LEFT JOIN입니다.
9.1 INNER JOIN
INNER JOIN
은 두 테이블 간 공통된 값을 가진 행만 반환합니다.
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
이 쿼리는 employees
테이블과 departments
테이블을 연결하여 직원의 이름과 부서 이름을 조회합니다.
9.2 LEFT JOIN
LEFT JOIN
은 왼쪽 테이블의 모든 행과, 일치하는 경우 오른쪽 테이블의 값을 반환합니다.
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
이 쿼리는 employees
테이블의 모든 행을 반환하며, 일치하는 경우 departments
테이블에서 부서 이름을 함께 반환합니다.
10. 서브쿼리: 쿼리 안의 쿼리
서브쿼리는 쿼리 내에 포함된 또 다른 쿼리로, 주로 데이터를 필터링하거나 특정 값을 추출할 때 사용됩니다.
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
이 쿼리는 직원 중에서 전체 평균 급여보다 높은 급여를 받는 직원들의 이름을 조회합니다.
실전 예제
예제 1: 특정 부서에서 급여가 높은 직원 조회
SELECT name, salary
FROM employees
WHERE department = 'HR'
ORDER BY salary DESC
LIMIT 3;
이 쿼리는 HR
부서에서 급여가 가장 높은 3명의 직원을 조회합니다.
예제 2: 부서별 직원 수 조회
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
이 쿼리는 각 부서의 직원 수를 반환합니다.
요약
SQL의 SELECT 문은 데이터베이스에서 데이터를 조회하는 데 사용되며, 다양한 절(WHERE, ORDER BY, GROUP BY 등)을 통해 데이터를 필터링, 정렬, 그룹화할
수 있습니다. 또한 JOIN
을 사용하여 여러 테이블의 데이터를 결합하고, LIMIT
와 DISTINCT
을 통해 결과의 양과 중복을 조절할 수
있습니다. SQL의 강력한 데이터 조회 기능을 잘 활용하면 복잡한 데이터 분석 작업도 효율적으로 수행할 수 있습니다.