본문 바로가기
SQL

oracle]DML 활용하기

by dreamer_dev 2023. 10. 19.

 

1. SQL(Structured Query Language)

- 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어로 원하는 데이터를 찾는 방법이나 절차를 기술하는게 아닌 조건을 기술하여 작성 

분류  용도 명령어
 DQL
(Data Query Language)
데이터 검색 SELECT
DML
(Data Manipulation Language)
데이터 조작 INSERT, UPDATE, DELETE
DDL
(Data Definition Language)
데이터 정의 CREATE, DROP, ALTER
TCL
(Transaction Control Language)
트랜잭션 제어 COMMIT,ROLLBACK

1) SELECT  : 데이터를 조회한 결과를 ResultSet이라고 하는데 SELECT 구문에 의해 반환된 행들의 집합을 의미한다.

  -Result Set은 0개 이상의 행이 포함될 수 있고, 특정 기준에 의해 정렬가능한 테이블의 특정 컬럼, 행, 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회가 가능하다.

 

 * 작성법

SELECT 컬럼 명 [, 컬럼명, …] FROM 테이블 명 [WHERE 조건식];

--직원 전부의 사번과 이름, 월급을 조회하는 구문
SELECT EMP_ID, EMP_NAME, SALARY 
FROM EMPLOYEE;

* SELECT

  조회하고자 하는 컬럼명 기술한다.

  여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분하고, 마지막 컬럼 다음은 쉼표를 사용하지 않음

  모든 컬럼 조회 시 컬럼 명 대신  '*' 기호 사용 가능하며 조회 결과는 기술한 컬럼 명 순으로 표시 됨

 

* FROM

  조회 대상 컬럼이 포함된 테이블 명 기술한다.

 

* WHERE

 행을 선택하는 조건 기술 여러 개의 제한 조건을 포함할 수 있으며,

 각각의 제한 조건은 논리 연산자로 연결 제한 조건을 만족시키는 행들만 Result Set에 포함.

 

* 예시

--직원 전부의 모든 정보를 조회하는 구문
SELECT EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE, DEPT_CODE, 
JOB_CODE, SAL_LEVEL, SALARY, BONUS, MANAGER_ID, HIRE_DATE, 
ENT_DATE, ENT_YN
FROM EMPLOYEE;
--또는 '*'으로 표시 
SELECT * FROM EMPLOYEE;
--‘AS 별칭‘이나 “별칭”, 또는 ‘AS “별칭“’을 사용해서 컬럼 별칭을 지을 수 있음
SELECT EMP_NAME AS 이름, SALARY*12 “연봉(원)”, (SALARY + (SALARY*BONUS))*12 AS "총 소득(원)"
FROM EMPLOYEE;
--DISTINCT: 컬럼에 포함된 데이터 중 중복 값을 제외하고 한 번씩만표시하고자 할 때 사용
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;
--WHERE절 : 검색할 컬럼의 조건을 설정하여 행 결정

-- 부서코드가 ‘D9’인 직원의 이름, 부서코드 조회
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = ‘D9’;

-- 급여가 4000000보다 많은 직원 이름과 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY > 4000000;

-- **여러 개 조건 작성 시 AND/OR 사용**
-- 부서코드가 ‘D6’이고 급여를 2000000보다 많이 받는 직원의 이름, 부서코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = ‘D6’ AND SALARY > 2000000

 * 연결 연산자 

 : '||'를 사용하여 여러 컬럼을 하나의 컬럼인 것 처럼 연결하거나 컬럼과 리터럴을 연결함.

--컬럼과 컬럼을 연결한 경우
SELECT EMP_ID || EMP_NAME || SALARY 
FROM EMPLOYEE;

--컬럼과 리터럴을 연결한 경우
SELECT EMP_NAME || ‘의 월급은 ‘ ||SALARY || ‘원 입니다.’ 
FROM EMPLOYEE;

 *논리 연산자 

  :여러 개의 제한 조건 결과를 하나의 논리 결과로 만들어줌.

*비교 연산자

 : 표현식 사이의 관계를 비교하기 위해 사용하고 비교 결과는 논리 결과(TRUE/FALSE/NULL) 중 하나가 됨.

  단 비교하는 두 컬럼 값/표현식은 서로 동일한 데이터 타입이어야 함

--BETWEEN AND : 비교하려는 값이 지정한 범위에 포함되면 TRUE를 리턴하는 연산자
--상한 값과 하한 값의 경계도 포함된다.
-- 급여를 3500000보다 많이 받고 6000000보다 적게 받는 직원이름과 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND SALARY <= 6000000;
-- 또는 WHERE SALARY BETWEEN 3500000 AND 6000000;
--LIKE : 비교하려는 값이 지정한 특정 패턴을 만족하면 TRUE를 리턴하는 연산자
--‘%’와 ‘_’를 와일드 카드로 사용
--‘전’씨 성을 가진 직원 이름과 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE ‘전%’;
-- 핸드폰의 앞 네 자리 중 첫 번호가 7인 직원 이름과 전화번호 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE ‘_ _ _7%’;

--와일드 카드 문자와 패턴의 특수문자가 동일한 경우 어떤 것을 패턴으로 결정하는지 구분하지 못하기 때문에 
--데이터로 처리할 와일드 카드 문자 패턴 기호 앞에 임의의 특수문자를 사용하고 ESCAPE OPTION으로 등록하여 처리
--EMAIL ID 중 ‘_’의 앞이 3자리인 직원 이름, 이메일 조회
SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE ‘_ _ _#_%’ ESCAPE ‘#’;

--NOT LIKE 
‘이’씨 성이 아닌 직원 사번, 이름, 이메일 조회
SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMP_NAME NOT LIKE ‘이%’
--IS NOT NULL / IS NULL
--NULL 여부를 비교하는 연산자
- 관리자도 없고 부서 배치도 받지 않은 직원 조회
SELECT EMP_NAME, MANAGER_ID, DEPT_CODE
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;

--부서 배치를 받지 않았지만 보너스를 지급받는 직원 조회
SELECT EMP_NAME, BONUS, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;
--IN : 비교하려는 값 목록에 일치하는 값이 있으면 TRUE를 반환하는 연산자
--D6 부서와 D8 부서원들의 이름, 부서코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE IN (‘D6’, ‘D8’);
--WHERE DEPT_CODE = ‘D6’ OR DEPT_CODE = ‘D8’;

--‘J2’ 또는 ‘J7’ 직급 코드 중 급여를 2000000보다 많이 받는 직원의 이름, 급여, 직급코드 조회
SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE (JOB_CODE = ‘J7’ OR JOB_CODE = ‘J2’) AND SALARY > 2000000;
--* 우선순위를 고려하여 OR가 먼저 처리 되도록 ( )를 이용해 우선 순위 변경해줌