DATA
: 업무상 필요한 정보 CF. INFORMATIONDATABASE
: 업무상 필요한 정보를 저장한 것, 계층형
, 네트워크형
, 관계형
, 객체 관계형
DBMS
: 요청에 따라 DATABASE 내의 DATA를 저장, 검색, 수정, 관리해주는 프로그램 관계형 데이터베이스의 정의:
관계형 데이터베이스는 관계 또는 2차원 테이블의 모음
오라클 데이터베이스는 데이터 보관 및 관리를 위한 여러 기능과 저장공간을 객체(OBJECT)
를 통해 제공한다.
관계형 데이터베이스 용어
SQL을 사용하여 데이터베이스 QUERY
과정에 사용되는 SQL 문
CDB Architecture
connection
Root -> xepdb1
으로 이동
🔽 sql developer 툴 활용 connection
테이블 생성 위치: xepdb1
🔽 conn ora1/oracle_4U@localhost:1521/xepdb1
이렇게 해서 db연결!
SELECT *
FROM departments;
SELECT department_id, location_id
FROM departments;
SQL 문 작성
기본 열 머리글(heading)
산술 표현식
세션(session): 로그인해서 로그아웃 하기까지의 기간
날짜 형식 변경하기 (DD-MON-RR)
- 도구 - 환경설정 - 데이터베이스(+) 클릭 -NLS (언어 환경) 선택 - AMERICAN 선택 - DD-MON-RR 입력
🔽
✨ NULL 값 정의(의미)
알 수 없거나
, 적용할 수 없는
값임. sql developer 툴 활용해 null 표시 변경 방법
🔽 cmd
🔽 sql developer
cmd 창에서 sql plus 활용해 쿼리문, 내장 기능 출력
🔽 list 의 l, show all
열 alias 정의
연결 연산자
SELECT LAST_NAME || JOB_ID AD "EMPLOYEES"
FROM EMPLOYEES;
🔽 세 컬럼을 연결문자열에 NULL 값을 결하봘 경우 결과는 문자열.
즉, LAST_NAME || NULL 의 결과는 LAST_NAME
의미있는 문자열 삽입 LITERAL
-- 의미있는 문자열 삽입 LITERAL :
COLUMN과 같이 간주
EX) 1이라는 값을 갖는 컬럼이다
-- 숫자 LITERAL
select
DEPARTMENT_ID,
LOCATION_ID,
1
from DEPARTMENTS;
-- 문자 LITERAL
select
DEPARTMENT_ID,
LOCATION_ID,
'AAA'
from DEPARTMENTS;
🔽 오류 발생 -> 대체 인용(q) 연산자 사용 필
🔽 오류 해결 (1) 일반 단일 부호로 인식_단일 따옴표 연달아 입력
🔽 오류 해결 (2) 대체 인용(q) 연산자 사용
- q + ' + [나타내고 싶은 문자열 표현] + '
DISTINCT
SELECT + DISTINCT
SELECT 키워드 바로 뒤에 DISTINCT 키워드 포함
🔽 예제
SELECT DISTINCT DEPARTMENT_ID, JOB_ID
FROM EMPLOYEES;
🔽
select last_name, salary
from employees
where salary BETWEEN 2500 and 3500;
cf. 2500 <= salary <= 3500
-> and 로 연산 수행하기 때문에 error 발생
where 절에는 select 절에서 기재한 as 사용 불가 (쿼리문 실행 순서 존재)
🔽
like 연산자 사용
🔽
-- 09년도에 입사한 사원 모두 출력
alter session set nls_date_format = 'DD-MON-RR' ;
select last_name, salary, hire_date
from employees
where hire_date like '%09';
-- 09일에 입사한 사원 모두 출력
alter session set nls_date_format = 'yyyy/mm/dd' ;
select last_name, salary, hire_date
from employees
where hire_date like '%09';
-- 9일 입사한 직원으로 의미 변경
-- 'yyyy/mm/dd' 날짜 포맷에서 2009년에 입사한 직원 모두 출력
alter session set nls_date_format = 'yyyy/mm/dd' ;
select last_name, salary, hire_date
from employees
where hire_date like '%2009%';
create table ltest ( col varchar2(20) );
insert into ltest values ( 'aX_Yb' ); -- 문자열이 x로 시작 y로 끝난다
insert into ltest values ( 'aXbYc' );
insert into ltest values ( 'X_Yb' );
insert into ltest values ( 'aXxY' );
select * from ltest;
select * from ltest where col like '%X_Y%';
-- 언더바가 와일드카드가 아님을 select 절로 지칭 필
-- '\' escape 문자로 와일드카드가 아닌 일반 문자로 언더바 인식
select * from ltest where col like '%X\_Y%' escape '\';
🔽
select last_name, ob_id, salary
from employees
where (job_id = 'SA_REP'
or job_id = 'AD_PRES')
and salary > 15000;
🔽
🔽 not BETWEEN
3장 실습 order by절 까지 자습 진행
select employee_id, department_id, salary, commission_pct
from employees
order by commission_pct desc;
select employee_id, department_id, salary, commission_pct
from employees
order by commission_pct nulls first;
select employee_id, department_id, salary, commission_pct
from employees
order by commission_pct nulls last;
select employee_id, department_id, salary, commission_pct
from employees
order by commission_pct asc;
+) order by 기입된 컬럼명이 select절에 존재하지 않아도 쿼리문 실행 가능~
특정 컬럼 기준으로 오름차순후, 속성 값이 동일 시 두 번째 컬럼 기준으로 오름차순 진행
🔽
select last_name, department_id, salary
from employees
order by department_id, salary;
2장 연습문제 풀이
2-1) DEPARTMENTS 테이블의 구조와 테이블의 전 내용을 출력하는 쿼리를 작성하시오
🔽
SELECT *
FROM DEPARTMENTS;
2-2) EMPLOYEES 테이블의 구조와 다음의 결과를 출력하는 쿼리를 작성하세요.
HIRE_DATE 열에 대한 ALIAS로 STARTDATE를 출력하시오.
🔽
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, HIRE_DATE AS STARTDATE
FROM EMPLOYEES;
2-3) EMPLOYEES 테이블의 모든 JOB_ID를 하나씩만 출력하는 쿼리를 작성하시오
🔽
SELECT DISTINCT JOB_ID
FROM EMPLOYEES;
2-4) EMPLOYEES 테이블에서 LAST_NAME과 JOB_ID를 이어서 출력하고(쉼표와 공백으로 구분) 열 이름을 EMPLOYEE AND TITLE 로 지정합니다.
🔽
SELECT LAST_NAME || ',' ||JOB_ID AS "EMPLOYEE AND TITLE"
FROM EMPLOYEES;
2-5) 성공적으로 실행되는 SELECT 문 두 개를 고르시오.
🔽 답: 2, 3번
2번:
SELECT first_name, last_name, job_id, salary*12 "yearly sal"
FROM employees;
3번:
SELECT first_name, last_name, job_id, salary AS "yearly sal"
FROM employees;
3-1) EMPLOYEES 테이블에서 SALARY를 12,000보다 많이 받는 사원을 출력하는 쿼리를 작성하세요.
🔽
SELECT LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY >= 12,000;
3-2) EMPLOYEES 테이블에서 EMPLOYEE_ID가 176인 사원을 출력하는 쿼리를 작성하시오.
🔽
SELECT LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 176;
3-3) EMPLOYEES 테이블에서 SALARY가 $5000~$12000의 범위에 속하지 않는 사원을 출력하는 쿼리를 작성하시오.
🔽
SELECT LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY NOT BETWEEN 5000 AND 12000;
3-4) LAST_NAME 이 MATOS 또는 TAYLOR 인 사원을 출력하는 쿼리를 작성하시오 (입사순으로 결과 정렬)
🔽
SELECT LAST_NAME, JOB_ID, HIRE_DATE
FROM EMPLOYEES
WHERE LAST_NAME = 'MATOS'
OR LAST_NAME = 'TAYLOR'
ORDER BY HIRE_DATE;
3-5) EMPLOYEES 테이블에서 DEPARTMENT_ID가 20 또는 50에 속하는 사원 정보를 LAST_NAME 의 알파벳 순서대로(오름차순) 정렬하여 출력하는 쿼리문을 작성하시오.
🔽
SELECT LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 20
OR DEPARTMENT_ID = 50
ORDER BY LAST_NAME;
3-6) EMPLOYEES 테이블에서 SALARY가 $5000~$12000 범위에 속하며 DEPARTMENT_ID가 20 또는 50인 사원의 LAST_NAME, SALARY를 다음과 같이 출력하는 쿼리를 작성하시오.
🔽
SELECT LAST_NAME "EMPLOYEE", SALARY "MONTHLY SALARY"
FROM EMPLOYEES
WHERE SALARY BETWEEN 5000 AND 12000
AND DEPARTMENT_ID IN (20, 50) ;
3-7) EMPLOYEES 테이블에서 2010년에 채용된 모든 사원을 출력하는 쿼리를 작성하시오.
🔽
SELECT LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE LIKE '%10'
;
3-8) EMPLOYEES 테이블에서 MANAGER가 없는 사원을 출력하시오
🔽
SELECT LAST_NAME, JOB_ID
FROM EMPLOYEES
WHERE MANAGER_ID IS NULL;
3-9) EMPLOYEES 테이블에서
커미션을 받는
사원을 출력하시오. SALARY, COMMISSION_PCT의 내림차순으로 데이터를 정렬합니다.
🔽
SELECT LAST_NAME, SALARY, COMMISSION_PCT
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL
ORDER BY SALARY DESC, COMMISSION_PCT DESC;
3-10) EMLOYEES 테이블에서 세 번째 문자가 "a"인 모든 사원을 출력하시오.
🔽
SELECT LAST_NAME
FROM EMPLOYEES
WHERE LASTNAME LIKE '__a%';
3-11) EMPLOYEES 테이블에서 LAST_NAME에 "a"와 "e"가 포함된 모든 사원의 성과 이름을 표시하시오.
🔽
SELECT LAST_NAME, FIRST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE "%a%"
AND LAST_NAME LIKE "%e%";
3-12) 급여를 많이 받는 사원 5명을 표시하는 쿼리를 행 제한 구문을 이용해 작성
🔽
SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC
FETCH NEXT 5 ROWS ONLY;