Topcit

SQL DQL 요약

Life Log 2024. 10. 27. 22:13
728x90
반응형

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;
  • empdept 테이블의 모든 행을 반환하며, 일치하지 않는 경우 NULL이 표시됩니다.

5. CROSS JOIN (교차 조인)

CROSS JOIN은 조인된 두 테이블의 모든 가능한 조합을 반환합니다. 각 행이 다른 테이블의 모든 행과 조합됩니다.

SELECT e.empno, e.ename, d.dname 
FROM emp e 
CROSS JOIN dept d;
  • emp 테이블의 각 행과 dept 테이블의 각 행을 조합하여 모든 가능한 조합을 생성합니다. 결과는 두 테이블의 행 수를 곱한 만큼 나옵니다.

이렇게 JOIN은 두 개 이상의 테이블을 조합할 때 사용할 수 있으며, 필요에 따라 조건을 설정하여 필요한 데이터만 효율적으로 조회할 수 있습니다.

UNIONUNION ALL의 차이를 데이터로 설명하기 위해, empemp_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인 BobCharlie는 두 테이블에 모두 포함되어 있습니다.


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은 두 테이블에서 중복된 BobCharlie 데이터를 한 번씩만 반환합니다.

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은 중복 데이터를 그대로 포함하여 반환하기 때문에 BobCharlie가 두 번씩 나타납니다.

요약

  • UNION: 중복된 행을 제거하고 반환.
  • UNION ALL: 중복된 행을 포함하여 모든 데이터를 반환.

UNION을 사용하면 중복을 제거한 결과를 얻을 수 있으며, UNION ALL은 모든 행을 빠짐없이 조회할 때 사용됩니다.

INTERSECTMINUS는 두 개의 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
  • empemp_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: 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과에 포함되지 않은 행을 반환합니다. (차집합)

이 두 명령어는 테이블 간의 데이터 비교에 매우 유용하며, 중복 제거가 자동으로 이루어지므로 결과 집합의 데이터가 유일하게 유지됩니다.

728x90
반응형

'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