DQL(Data Query Language)은 데이터베이스에서 데이터를 조회하는 데 사용되는 SQL 언어의 한 부분입니다. DQL의 핵심은 데이터베이스에서 원하는 데이터를 검색하고 조회할 수 있도록 하는 SELECT
명령어입니다. DQL은 데이터를 삽입, 삭제, 수정하는 대신 기존 데이터에서 특정 조건에 맞는 데이터를 찾거나 가공해 보여주는 데 중점을 둡니다.
DQL의 주요 명령어
- SELECT: 데이터베이스에서 데이터를 조회하는 기본 명령어입니다.
WHERE
,GROUP BY
,ORDER BY
,JOIN
등 다양한 조건과 결합하여 복잡한 질의(Query)를 수행할 수 있습니다.
DQL의 예시 쿼리
다양한 예제 쿼리를 통해 DQL을 사용하는 방법을 살펴보겠습니다.
1. 기본 SELECT 쿼리
SELECT * FROM emp;
emp
테이블의 모든 컬럼과 모든 행을 조회합니다.
2. 특정 컬럼 선택
SELECT empno, ename, sal FROM emp;
emp
테이블에서empno
,ename
,sal
컬럼만 조회합니다.
3. WHERE 절을 사용한 조건 조회
SELECT * FROM emp WHERE job = 'MANAGER';
emp
테이블에서job
이'MANAGER'
인 직원만 조회합니다.
4. ORDER BY를 사용한 정렬
SELECT * FROM emp ORDER BY sal DESC;
emp
테이블에서 모든 행을sal
컬럼의 내림차순으로 정렬하여 조회합니다.
5. GROUP BY와 집계 함수 사용
SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno;
emp
테이블에서deptno
별로sal
의 평균값(avg_sal
)을 구해 표시합니다.
6. HAVING을 사용한 조건 필터링
SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno HAVING AVG(sal) > 3000;
deptno
별로sal
의 평균을 구한 뒤, 그 평균이 3000을 초과하는 부서만 조회합니다.
7. JOIN을 사용한 테이블 결합
SELECT e.empno, e.ename, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno;
emp
테이블과dept
테이블을deptno
를 기준으로 결합하여empno
,ename
,dname
컬럼을 조회합니다.
8. 서브쿼리 사용
SELECT ename, sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);
emp
테이블에서 급여(sal
)가emp
테이블의 평균 급여보다 높은 사원을 조회합니다.
9. LIMIT 절을 사용한 결과 제한 (MySQL)
SELECT * FROM emp LIMIT 5;
emp
테이블에서 처음 5개의 행만 조회합니다. (Oracle에서는ROWNUM
, SQL Server에서는TOP
을 사용)
10. DISTINCT를 사용한 중복 제거
SELECT DISTINCT job FROM emp;
emp
테이블에서 중복된 직급(job
)을 제거하고 고유한 직급 목록만 조회합니다.
JOIN
은 여러 테이블의 관련 데이터를 결합하는 데 사용됩니다. 주요 JOIN
유형에는 INNER JOIN
, LEFT JOIN
, RIGHT JOIN
, FULL OUTER JOIN
, CROSS JOIN
이 있으며, 각 유형은 결합하는 방식에 따라 결과가 다릅니다.
1. INNER JOIN (내부 조인)
INNER JOIN
은 두 테이블에서 조인 조건을 만족하는 행만 반환합니다.
SELECT e.empno, e.ename, d.dname
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno;
emp
테이블과dept
테이블을deptno
로 결합하여, 두 테이블 모두에 일치하는deptno
값을 가진 행만 반환합니다.
2. LEFT JOIN (왼쪽 외부 조인)
LEFT JOIN
은 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블에서 일치하는 항목이 없는 경우 NULL
값을 반환합니다.
SELECT e.empno, e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;
emp
테이블의 모든 행을 반환하며,dept
테이블과 일치하지 않는 경우NULL
이 표시됩니다.
3. RIGHT JOIN (오른쪽 외부 조인)
RIGHT JOIN
은 오른쪽 테이블의 모든 행을 반환하며, 왼쪽 테이블에서 일치하는 항목이 없는 경우 NULL
값을 반환합니다.
SELECT e.empno, e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;
dept
테이블의 모든 행을 반환하며,emp
테이블과 일치하지 않는 경우NULL
이 표시됩니다.
4. FULL OUTER JOIN (전체 외부 조인)
FULL OUTER JOIN
은 두 테이블의 모든 행을 반환하며, 일치하는 행이 없는 경우 NULL
값을 반환합니다. 일부 데이터베이스에서는 지원되지 않을 수 있습니다.
SELECT e.empno, e.ename, d.dname
FROM emp e
FULL OUTER JOIN dept d ON e.deptno = d.deptno;
emp
와dept
테이블의 모든 행을 반환하며, 일치하지 않는 경우NULL
이 표시됩니다.
5. CROSS JOIN (교차 조인)
CROSS JOIN
은 조인된 두 테이블의 모든 가능한 조합을 반환합니다. 각 행이 다른 테이블의 모든 행과 조합됩니다.
SELECT e.empno, e.ename, d.dname
FROM emp e
CROSS JOIN dept d;
emp
테이블의 각 행과dept
테이블의 각 행을 조합하여 모든 가능한 조합을 생성합니다. 결과는 두 테이블의 행 수를 곱한 만큼 나옵니다.
이렇게 JOIN
은 두 개 이상의 테이블을 조합할 때 사용할 수 있으며, 필요에 따라 조건을 설정하여 필요한 데이터만 효율적으로 조회할 수 있습니다.
UNION
과 UNION ALL
의 차이를 데이터로 설명하기 위해, emp
와 emp_backup
이라는 두 테이블에 예시 데이터를 넣어 보겠습니다.
예시 데이터
emp 테이블
| empno | ename | job |
|-------|---------|-----------|
| 1 | Alice | MANAGER |
| 2 | Bob | CLERK |
| 3 | Charlie | SALESMAN |
emp_backup 테이블
| empno | ename | job |
|-------|---------|-----------|
| 2 | Bob | CLERK |
| 3 | Charlie | SALESMAN |
| 4 | David | MANAGER |
위의 예에서 emp
테이블과 emp_backup
테이블에는 일부 데이터가 중복되어 있습니다. 예를 들어, empno
2와 3인 Bob
과 Charlie
는 두 테이블에 모두 포함되어 있습니다.
1. UNION 예시
UNION
은 두 테이블의 중복 데이터를 제거하고 하나의 결과로 반환합니다.
SELECT empno, ename, job FROM emp
UNION
SELECT empno, ename, job FROM emp_backup;
결과 (중복 제거된 데이터)
empno | ename | job |
---|---|---|
1 | Alice | MANAGER |
2 | Bob | CLERK |
3 | Charlie | SALESMAN |
4 | David | MANAGER |
UNION
은 두 테이블에서 중복된Bob
과Charlie
데이터를 한 번씩만 반환합니다.
2. UNION ALL 예시
UNION ALL
은 중복된 행도 그대로 포함하여 모든 데이터를 반환합니다.
SELECT empno, ename, job FROM emp
UNION ALL
SELECT empno, ename, job FROM emp_backup;
결과 (중복 포함된 데이터)
empno | ename | job |
---|---|---|
1 | Alice | MANAGER |
2 | Bob | CLERK |
3 | Charlie | SALESMAN |
2 | Bob | CLERK |
3 | Charlie | SALESMAN |
4 | David | MANAGER |
UNION ALL
은 중복 데이터를 그대로 포함하여 반환하기 때문에Bob
과Charlie
가 두 번씩 나타납니다.
요약
- UNION: 중복된 행을 제거하고 반환.
- UNION ALL: 중복된 행을 포함하여 모든 데이터를 반환.
UNION
을 사용하면 중복을 제거한 결과를 얻을 수 있으며, UNION ALL
은 모든 행을 빠짐없이 조회할 때 사용됩니다.
INTERSECT
와 MINUS
는 두 개의 SELECT
쿼리 결과를 비교하고 특정 조건에 따라 결과를 반환하는 집합 연산자입니다. 이들은 중복 제거와 특정 조건에 맞는 데이터만 선택할 때 유용합니다. 이 명령어들은 주로 SQL에서 집합 연산을 통해 두 결과 집합 간의 교집합이나 차집합을 찾는 데 사용됩니다.
1. INTERSECT
INTERSECT
는 두 SELECT
쿼리의 교집합을 반환합니다. 즉, 두 쿼리에서 공통으로 존재하는 행만 반환됩니다. INTERSECT
는 중복을 제거하므로, 동일한 데이터가 여러 번 나타나더라도 한 번만 반환됩니다.
예제
테이블 예시
- emp 테이블
empno ename job 1 Alice MANAGER 2 Bob CLERK 3 Charlie SALESMAN - emp_backup 테이블
empno ename job 2 Bob CLERK 3 Charlie SALESMAN 4 David MANAGER
SELECT empno, ename, job FROM emp
INTERSECT
SELECT empno, ename, job FROM emp_backup;
결과 (교집합)
empno | ename | job |
---|---|---|
2 | Bob | CLERK |
3 | Charlie | SALESMAN |
emp
와emp_backup
테이블에서 공통으로 존재하는 행(empno
가 2와 3인 행)만 반환됩니다.
2. MINUS
MINUS
는 첫 번째 SELECT
쿼리에서 두 번째 쿼리에 없는 행들(차집합) 을 반환합니다. 즉, 첫 번째 쿼리 결과 중에서 두 번째 쿼리 결과에 포함되지 않는 행만 반환됩니다. MINUS
도 중복된 행을 제거하고 반환합니다.
예제
SELECT empno, ename, job FROM emp
MINUS
SELECT empno, ename, job FROM emp_backup;
결과 (차집합)
empno | ename | job |
---|---|---|
1 | Alice | MANAGER |
emp
테이블에는 있지만emp_backup
테이블에는 없는 행만 반환됩니다. 즉,empno
가 1인Alice
의 데이터만 반환됩니다.
요약
- INTERSECT: 두 쿼리에서 공통으로 존재하는 행을 반환합니다. (교집합)
- MINUS: 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과에 포함되지 않은 행을 반환합니다. (차집합)
이 두 명령어는 테이블 간의 데이터 비교에 매우 유용하며, 중복 제거가 자동으로 이루어지므로 결과 집합의 데이터가 유일하게 유지됩니다.
'Topcit' 카테고리의 다른 글
Java PreparedStatement (0) | 2024.10.28 |
---|---|
Java 객체지향 프로그래밍 특징 (0) | 2024.10.28 |
SQL DCL 요약 (0) | 2024.10.28 |
SQL DML 요약 (1) | 2024.10.27 |
SQL DDL 요약 (0) | 2024.10.27 |