DQL이란?
DQL은 Data Query Language의 약자로 데이터 질의어이다. 데이터베이스에서 데이터를 조회하기 위해 사용되는 언어다.
SQL을 사용하여 데이터베이스에서 데이터를 검색하고 선택하는 쿼리를 작성할 수 있고, 이를 통해 데이터베이스에서 필요한 정보를 추출하고 분석할 수 있다.
DQL의 종류와 사용에 대해 알아보자
SELECT
SELECT는 데이터를 조회할 때 사용한다. SELECT를 통해 얻은 결과를 RESULT SET이라고 하며, 조회하려는 칼럼은 반드시 FROM 절에 기술한 테이블에 존재해야한다.
문법
[문법]
SELECT 컬럼, 컬럼, ...
FROM 테이블명;
예시
EMPLOYEE 테이블에서 EMP_ID, EMP_NAME 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE;
위에 코드를 통해 EMPLOYEE 테이블에서 EMP_ID, EMP_NAME만을 SELECT하여 조회되고 있다.
별칭
오라클에서는 칼럼명에 별칭을 지정해줄 수 있다. 별칭 지정 시 공백, 특수문자가 포함될 경우 반드시 큰 따옴표로 감싸야한다.
별칭은 산술 연산 등으로 인해 칼럼명이 지저분해질 경우, 깔끔하게 작성하기 위해서 사용한다.
문법
[문법]
칼럼명 AS 별칭
칼럼명 AS "별칭"
칼럼명 별칭
칼럼명 "별칭"
위에 4가지 경우 중 한 가지를 선택해서 사용할 수 있다. 하지만 주의사항은 별칭에 공백, 특수문자가 포함될 경우 반드시 큰 따옴표로 감싸야한다.
리터럴
리터럴(Literal)은 상수 값의 표현을 말하는데, 코드 상에 직접 나타나는 값을 의미한다. 정수 리터럴, 부동 소수점 리터럴, 문자 리터럴, 문자열 리터럴 등이 있다.
SELECT 절에 리터럴을 사용하면 테이블에 존재하는 데이터처럼 조회가 가능하다. 리터럴은 RESULT SET의 모든 행에 반복적으로 출력된다.
예시
별칭 미지정
SELECT
EMP_NAME
, SALARY
, '단위(원)'
FROM EMPLOYEE;
별칭 지정
SELECT
EMP_NAME
, SALARY AS 급여
, '단위(원)' AS "급여 단위"
FROM EMPLOYEE;
별칭을 지정하면 SELECT문에 작성한 별칭대로 조회된 것을 확인할 수 있고, 별칭을 미지정하면 SELECT문에 작성한 칼럼명이 조회된 것을 확인할 수 있다.
그리고 '단위(원)'처럼 문자열 리터럴을 SELECT를 통해 조회할 수 있고, 리터럴에도 별칭을 사용할 수 있음을 확인할 수 있다.
DISTINCT
칼럼에 포함된 중복값을 한 번씩만 표시하기 위해 사용한다. SELECT 절에 한 번만 사용 가능하며, 여러 개 칼럼을 대상으로 하면 모든 칼럼값이 중복되어야 제거한다.
예시
직급코드 조회 (중복 값 제거)
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;
23명이 포함되어 있는 EMPLOYEE 테이블에서 DISTINCT를 사용하지 않았다면 23개의 직급코드가 중복 값을 포함한 체로 출력되었을 것이다.
하지만 DISTINCT를 사용하여 J1 ~ J7까지의 7개의 값이 중복을 제외하고 출력되었다.
연결 연산자
여러 칼럼값을 하나의 칼럼인 것처럼 연결하거나, 칼럼과 리터럴을 연결할 수 있다.
예시
사번, 사원명, 급여 연결해서 조회
SELECT EMP_ID || EMP_NAME || '의 월급은 ' || SALARY || '원 입니다.' AS "사원 정보 및 급여"
FROM EMPLOYEE;
역슬래시 두개, '||' 를 이용하여 칼럼과 리터럴을 연결하여 조회할 수 있다.
WHERE절에 대해 알아보자
WHERE
조회하고자 하는 테이블에서 해당 조건에 만족하는 결과만을 조회하고자 할 때 사용한다. 조건식에는 다양한 연산자들을 사용할 수 있다.
문법
[문법]
SELECT 칼럼, 칼럼, ..., 칼럼
FROM 테이블명
WHERE 조건식;
비교 연산자
- 대소 비교
- >, <, >=, <=
- 동등 비교
- =
- 같지 않다
- !=, ^=, <>
논리 연산자
- AND
- OR
- NOT
BETWEEN
WHERE절에서 사용되는 구문으로 범위에 대한 조건을 제시할 때 사용한다. 비교 대상 칼럼값이 하한 값(A) 이상이고, 상한 값(B) 이하인 경우 TRUE를 리턴한다.
문법
[문법]
WHERE 비교대상칼럼 BETWEEN 하한 값(A) AND 상한값(B)
LIKE
- 비교하려는 칼럼 값이 지정된 특정 패턴에 만족할 경우 TRUE를 리턴한다.
- 특정 패턴에는 '%', '_'를 와일드카드로 사용할 수 있다.
- '%': 0글자 이상
- ex) 비교대상칼럼 LIKE '문자%' → 비교대상칼럼 값 중에 '문자'로 시작하는 모든 행을 조회한다.
비교대상칼럼 LIKE '%문자' → 비교대상 칼럼 값 중에 '문자'로 끝나는 모든 행을 조회한다.
비교대상칼럼 LIKE '%문자%' → 비교대상칼럼 값 중에 '문자'가 포함되어 있는 모든 행을 조회한다.
- ex) 비교대상칼럼 LIKE '문자%' → 비교대상칼럼 값 중에 '문자'로 시작하는 모든 행을 조회한다.
- '_': 1글자
- ex) 비교대상칼럼 LIKE '_문자' → 비교대상칼럼 값 중에 '문자' 앞에 무조건 한 글자가 오는 모든 행을 조회한다.
비교 대상 칼럼 LIKE '__문자' → 비교대상칼럼 값 중에 '문자' 앞에 무조건 두 글자가 오는 모든 행을 조회한다.
- ex) 비교대상칼럼 LIKE '_문자' → 비교대상칼럼 값 중에 '문자' 앞에 무조건 한 글자가 오는 모든 행을 조회한다.
- '%': 0글자 이상
문법
[문법]
WHERE 비교대상칼럼 LIKE '특정패턴';
IS NULL, IS NOT NULL
칼럼 값에 NULL이 있을 경우 NULL 값 비교에 사용된다.
- IS NULL
- 비교대상칼럼 값이 NULL인 경우 TRUE를 리턴한다.
- IS NOT NULL
- 비교대상칼럼 값이 NULL이 아닌 경우 TRUE 리턴한다.
문법
[문법]
WHERE 비교대상칼럼 IS [NOT] NULL;
IN
값 목록 중에 일치하는 값이 있을 때 TRUE 리턴한다.
문법
[문법]
WHERE 비교대상칼럼 IN('값', '값', '값', ..., '값');
연산자 우선순위
- 괄호(())
- 산술 연산자
- 연결 연산자
- 비교 연산자
- IS NULL, IS NOT NULL, LIKE, IN
- BETWEEN
- 논리 연산자 (NOT)
- 논리 연산자 (AND)
- 논리 연산자 (OR)
WHERE절 예시 (비교 연산자)
부서 코드가 D9와 일치하는 사원들의 모든 칼럼 정보 조회
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
위에 코드를 통해 DEPT_CODE가 D9인 인원들의 모든 칼럼 정보가 조회된 것을 확인할 수 있다.
WHERE절 예시 (논리 연산자)
급여가 400만원 이상이면서 직급 코드가 J2인 사원의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE SALARY >= 4000000
AND JOB_CODE = 'J2';
AND 연산자를 통해 SALARY >= 4000000와 JOB_CODE = 'J2' 두 가지 조건을 모두 만족하는 인원들의 모든 칼럼 정보가 조회된 것을 확인할 수 있다.
WHERE절 예시 (BETWEEN)
급여가 350만원 이상 600만원 이하가 아닌 직원의 이름, 부서 코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE NOT SALARY BETWEEN 3500000 AND 6000000;
WHERE절 예시 (LIKE)
이름 중 '하'가 포함된 사원의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';
'%하%'를 통해 이름(EMP_NAME) 중에 '하'가 포함된 인원의 모든 정보를 조회할 수 있다.
전화번호 4번째 자리가 9로 시작하는 사원의 사원명, 전화번호 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';
'___9%'를 통해 전화번호(PHONE) 4번째 자리가 9로 시작하는 인원의 정보를 조회할 수 있다. 참고로 '___9%'에서 언더바(_)는 3개이다.
WHERE절 예시 (IS NULL, IS NOT NULL)
보너스를 받지 않는 사원의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE BONUS IS NULL;
부서가 있고, 보너스를 받지 않는 사원의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL
AND BONUS IS NULL;
위와 같은 코드들로 NULL 값에 대한 조건을 걸어줄 수 있다.
WHERE절 예시 (IN)
직급 코드가 J2, J3, J4에 해당하는 사원의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE JOB_CODE IN ('J2', 'J3', 'J4');
조회 결과 직급코드(JOB_CODE)가 'J2', 'J3', 'J4'인 인원들만 조회되는 것을 확인할 수 있다.
이밖에도 WHERE에서는 비교 연산자와 논리 연산자등을 이용하여 원하는 조건의 정보만을 조회할 수 있다.
ORDER BY
SELECT 문에서 가장 마지막에 기입하는 구문으로 실행 또한 가장 마지막에 진행된다. 정렬 기준을 작성하지 않으면 기본 값으로 ASC 또는 DESC가 적용된다. (Oracle 21c 기준 기본 값 ASC)
- ASC: 오름차순으로 정렬한다.
- DESC: 내림차순으로 정렬한다.
- NULLS FIRST: 정렬하고자 하는 칼럼 값에 NULL이 있는 경우 해당 데이터 값을 맨 앞으로 정렬한다.
- NULLS LAST: 정렬하고자 하는 칼럼 값에 NULL이 있는 경우 해당 데이터 값을 맨 뒤로 정렬한다.
문법
[문법]
SELECT 칼럼, 칼럼, ..., 칼럼
FROM 테이블명
WHERE 조건식
ORDER BY 정렬시키고자 하는 칼럼명|별칭|칼럼 순번 [ASC|DESC] [NULLS FIRST | NULLS LAST];
예시
보너스 기준 정렬
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
ORDER BY BONUS DESC NULLS FIRST;
DESC NULLS FIRST로 정렬하였기 때문에, NULL 값을 먼저 정렬하고, 그 후부터 BONUS 값에 따라서 내림차순으로 정렬되는 것을 확인할 수 있다.
추가적으로 ORDER BY는 콤마(,)를 통해 여러 정렬 기준을 적용할 수 있다. 그 때의 정렬 순서는 ORDER BY 작성 순서이다.
'DB > Oracle' 카테고리의 다른 글
[DB/Oracle] PROCEDURE와 FUNCTION (1) | 2024.04.02 |
---|---|
[DB/Oracle] PL/SQL (1) | 2024.04.02 |
[DB/Oracle] VIEW (2) | 2024.03.28 |
[DB/Oracle] DDL이란? (2) | 2024.03.27 |
[DB/Oracle] SQL 종류 (3) | 2024.03.27 |