251017 TIL
2025. 10. 17. 17:40ㆍCourses/아이티윌 오라클 DBA 과정
SELECT 문
사칙 연산자 우선 순위
- *, /
- +, -
SELECT a * b / c + d - e FROM dual;
((((a * b) / c) + d) - e)
- 여러 개의 연산자를 같이 사용할 때는 괄호를 표현하면 좋다.
- 또한 연산자 우선 순위를 제어할 경우에도 괄호를 이용한다.
Null
- null은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값, 결측값(치)
- null은 0이나 공백이 아니다.
SELECT
employee_id,
salary,
commission_pct,
salary * 12 + salary * 12 * commission_pct -- 표현식
FROM hr.employees;

NVL 함수 : Null 값을 실제 값으로 대체하는 함수(기능의 프로그램)
SELECT
employee_id,
salary,
nvl(commission_pct, 0),
salary * 12 + salary * 12 * nvl(commission_pct, 0)
FROM hr.employees;

Pl/SQL 문법 - NVL 구현
IF commission_pct is null then
return 0;
ELSE
return commission_pct;
END IF;
별칭
SELECT
employee_id 사번,
salary 급여,
nvl(commission_pct, 0) 보너스,
salary * 12 + salary * 12 * nvl(commission_pct, 0) as annual_salary
FROM hr.employees;

- 열 이름을 다른 이름으로 출력
- 열 이름 바로 뒤에 한 칸 띄어쓰기를 한 후 입력
- 열 이름과 별칭 사이에는 as 키워드를 사용(선택)
- 열 별칭에 공백, 특수 문자(_, #, $를 제외한), 대소문자를 구분하려면 큰 따옴표(””)를 묶어야 한다.
- 그렇지 않으면 오류 발생

- 열 별칭에 숫자, 문자가 먼저 나오면 끈 따옴표를 묶어야 한다.
연결 연산자
- 열이나 문자열을 다른 열에 연결
- 두 개의 세로 선(||)으로 표현
- 결과 열은 문자열로 생성
SELECT
employee_id,
last_name || first_name
FROM hr.employees;

SELECT
1000,
100||00
FROM dual;

- 숫자형는 오른쪽 정렬
- 문자형는 왼쪽 정렬
- 00 → 0
- 00을 그대로 사용하고 싶으면 ‘00’ 사용
리터럴 문자열
- SELECT문에 포함된 문자, 날짜, 숫자
- 리터럴 문자열을 표현하려면 작은 따옴표로 묶어야 한다.
SELECT
employee_id,
'My Name is ' || last_name || ' ' || first_name "Name"
FROM hr.employees;

SELECT
employee_id,
'My Name''s ' || last_name || ' ' || first_name "Name"
FROM hr.employees;

q(대체 인용) 연산자
SELECT
employee_id,
q'[My name's ]' || last_name || ' ' || first_name "Name"
FROM hr.employees;

- q’[리터럴문자열]’
- q’<리터럴문자열>’
- q’{리터럴문자열}’
- q’(리터럴문자열)’
- q’!리터럴문자열!’
중복행 제거
- 기본적으로 select 결과에는 중복 행을 포함한 모든 행이 출력된다
SELECT
department_id
FROM hr.employees;

- 중복 제거
SELECT
unique department_id
FROM hr.employees;
SELECT
distinct department_id
FROM hr.employees;

- distinct는 select 절에 컬럼 리스트 전에 한 번만 기술
- 중복을 제거하는 알고리즘이 내부적으로 변경되어 예전에는 distinct로 조회한 경우 정렬이 되었지만 현재는 안됨
- Sort Unique → 9i R2 버전부터 Hash Unique
문제
-- [문제1] employees 테이블에서 employee_id, last_name과 first_name은 연결해서 표시하고
-- (공백으로 구분) 열 별칭은 화면 예처럼 쿼리문을 작성해 주세요.
SELECT employee_id "Emp#", last_name || ' ' || first_name "Employee Name"
FROM hr.employees;
/*
<화면결과>
Emp# Employee Name
------- ------------------------------
100 King Steven
101 Kochhar Neena
*/
-- [문제2] employees 테이블에서 컬럼중에 last_name, job_id를 연결해서 표시하고
-- (쉼표와 공백으로 구분) 열 별칭은 화면 예처럼 쿼리문을 작성해 주세요.
SELECT last_name || ', ' || job_id "Employee and Title"
FROM hr.employees;
/*
<화면결과>
Employee and Title
-------------------------
Abel, SA_REP
Ande, SA_REP
*/
-- [문제3] departments 테이블에 있는 데이터에서 department_name , manager_id 칼럼을 가지고
-- 화면 결과처럼 출력하는 쿼리문을 작성해 주세요.
SELECT department_name || q'[ Department's Manager Id: ]' || manager_id "Department and Manager"
FROM hr.departments;
/*
<화면결과>
Department and Manager
--------------------------------------------------
Administration Department's Manager Id: 200
Marketing Department's Manager Id: 201
......
*/
WHERE 절
SELECT
FROM
WHERE 조건절;
- 행을 제한하는 절
- 조건절
- 기준 컬럼이 문자열, 날짜열이면 비교값은 작은 따옴표로 묶어야 한다.
- 영문자는 대소문자를 구분한다.
- 데이터를 저장할 때 규칙에 따라 일관성 있게 저장해야 함(ex: 대문자로 저장, 소문자로 저장, …)
- 그렇지 않으면 조회할 때마다 변환 작업 필요
- 날짜 형식은 보는 지역에 따라 기본 날짜형식이 다름
- 한국(RR/MM/DD)
- 미국(DD-Mon-RR)
- 국가별 포맷 확인 :
SELECT * FROM nls_session_parameters;

- 비교 연산자
- 같다(=)
- 같지 않다(!=, ^=, <>)
- 크다(>)
- 크거나 같다(>=)
- 작다(<)
- 작거나같다(<=)
- 논리 연산자
- AND: 두 조건이 모두 참일 경우 TRUE
- OR : 두 조건 중 하나라도 참일 경우 TRUE
- NOT: False일 경우 True, True일 경우 False
to_date()
- 문자형 날짜를 날짜형으로 변환하는 함수
SELECT *
FROM hr.employees
WHERE hire_date = to_date('2001-01-13', 'yyyy-mm-dd');
문제
-- [문제4] employees 테이블에서 급여가 2500 ~ 3500 인 사원들의 last_name, salary를 출력해주세요.
SELECT last_name, salary
FROM hr.employees
WHERE salary >= 2500
AND salary <= 3500;
SELECT last_name, salary
FROM hr.employees
WHERE salary BETWEEN 2500 AND 3500;
-- [문제5] employees 테이블에서 급여가 2500 ~ 3500 이 아닌 사원들의 last_name, salary를 출력해주세요.
SELECT last_name, salary
FROM hr.employees
WHERE salary < 2500
OR salary > 3500;
SELECT last_name, salary
FROM hr.employees
WHERE NOT (salary >= 2500
AND salary <= 3500);
SELECT last_name, salary
FROM hr.employees
WHERE salary NOT BETWEEN 2500 AND 3500;
BETWEEN 하한값 AND 상한값
- 범위 조건에 사용하여 값의 범위에 따라 행을 추출
문자열 비교 연산
SELECT *
FROM hr.employees
WHERE last_name >= 'Abel'
AND last_name <= 'Austin';
SELECT *
FROM hr.employees
WHERE last_name BETWEEN 'Abel' AND 'Austin';
문제 - 날짜 비교
-- [문제6] employees 테이블에서 hire_date(입사일) 2001(01) ~ 2002(02)년도에 입사한 사원 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE hire_date >= TO_DATE('20010101', 'yyyymmdd')
AND hire_date < TO_DATE('20031231 23:59:59', 'yyyymmdd hh24:mi:ss');
SELECT *
FROM hr.employees
WHERE hire_date BETWEEN TO_DATE('20010101', 'yyyymmdd') AND TO_DATE('20031231 23:59:59', 'yyyymmdd hh24:mi:ss');
SELECT *
FROM hr.employees
WHERE hire_date >= TO_DATE('20010101', 'yyyymmdd')
AND hire_date < TO_DATE('20030101', 'yyyymmdd');
SELECT *
FROM hr.employees
WHERE hire_date BETWEEN TO_DATE('20010101', 'yyyymmdd') AND TO_DATE('20030101', 'yyyymmdd') - 1/24/60/60;
- 날짜형은 시간 정보도 포함
- 날짜만 쓰면 시간은 00:00:00으로 읽음
- 범위 검색할 때 주의
IN 연산자
SELECT *
FROM hr.employees
WHERE employee_id = 100
OR employee_id = 105
OR employee_id = 200;
-- 위 쿼리와 같이 동작함
-- () 안의 값을 포함하는 경우 조회
SELECT *
FROM hr.employees
WHERE employee_id IN(100, 105, 200);
-- () 안의 값을 포함하지 않는 경우 조회
SELECT *
FROM hr.employees
WHERE employee_id NOT IN(100, 105, 200);
SELECT *
FROM hr.employees
WHERE employee_id <> 100
AND employee_id <> 105
AND employee_id <> 200;
논리 연산자 우선 순위
NOT > AND > OR
SELECT *
FROM hr.employees
WHERE department_id = 30
OR department_id = 50
OR department_id = 60
AND salary > 5000;
-- 이렇게 동작
SELECT *
FROM hr.employees
WHERE department_id = 30
OR department_id = 50
OR (department_id = 60
AND salary > 5000);
-- 괄호를 명시적으로 처리해주는 것이 좋음
SELECT *
FROM hr.employees
WHERE (department_id = 30
OR department_id = 50
OR department_id = 60)
AND salary > 5000;
-- 또는 IN 연산자 사용
SELECT *
FROM hr.employees
WHERE department_id IN (30, 50, 60)
AND salary > 5000;
NULL 값을 체크하는 연산자
- IS NULL, IS NOT NULL
SELECT *
FROM hr.employees
WHERE commission_pct IS NULL;
SELECT *
FROM hr.employees
WHERE commission_pct IS NOT NULL;
LIKE 연산자
- 문자 패턴을 찾는 연산자
- % : 0개 이상의 문자를 찾을 때 사용
- _ : 1개 문자를 찾을 때 사용
-- last_name이 K로 시작하는 employee 조회
SELECT *
FROM hr.employees
WHERE last_name LIKE 'K%';
-- last_name 2번째 글자가 i인 employee 조회
SELECT *
FROM hr.employees
WHERE last_name LIKE '_i%';
-- last_name 3번째 글자가 e인 employee 조회
SELECT *
FROM hr.employees
WHERE last_name LIKE '__e%';
-- hire_date가 2002년도인 employee 조회
-- LIKE는 문자 연산자이기 때문에 hire_date를 문자열로 자동 형 변환이 일어남
-- 이로 인해 인덱스 스캔이 불가능해져 성능이 안 좋음
SELECT *
FROM hr.employees
WHERE hire_date LIKE '02%';
-- JOB_ID 값 중에 HR%로 시작되는 패턴을 추출해야한다면?
-- %를 순수한 문자로 검색해야 할 경우
SELECT *
FROM hr.employees
WHERE job_id LIKE 'HR^%%' ESCAPE '^';
문제
-- [문제7] employees 테이블에 있는 데이터 중에 job_id가 SA로 시작되고 salary 값은 10000이상 받는 사원들의 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE job_id LIKE 'SA%'
AND salary >= 10000;
-- [문제8] last_name의 세번째 문자가 'a' 또는 'e' 글자가 포함된 사원들의 정보를 출력해주세요.
SELECT *
FROM hr.employees
WHERE last_name LIKE '__a%'
OR last_name LIKE '__e%';'Courses > 아이티윌 오라클 DBA 과정' 카테고리의 다른 글
| 251021 TIL (0) | 2025.10.21 |
|---|---|
| 251020 TIL (0) | 2025.10.20 |
| 251016 TIL (0) | 2025.10.16 |
| 251015 TIL (0) | 2025.10.15 |
| 251014 TIL (0) | 2025.10.14 |