Study

[Oracle/오라클] DML(SELECT)

_유니 2022. 12. 12. 17:42

 

SQL (Structured Query Language)

관계형 데이터 베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어로

원하는 데이터를 찾는 방법이나 절차를 기술하는 게 아닌 조건을 기술하여 작성

 

 

 

 

[표현법]

SELECT 컬럼명

FROM 테이블명

WHERE 조건식;

* 순서 변경 불가

 

* SELECT : 조회하고자 하는 컬럼명 기술

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

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

반드시 존재하는 컬럼으로 기술할 것!

 

* FROM : 조회 대상 컬럼이 포함된 테이블명 기술

 

* WHERE : 행을 선택하는 조건 기술

여러 개의 제한 조건을 포함할 수 있으며, 각각의 제한 조건은 논리 연산자로 연결

제한 조건을 만족시키는 행들만 Result Set에 포함

 

 

- SELECT : 데이터 조회할 때 사용되는 구문

데이터를 조회한 결과를 Result Set이라고 하는데 SELECT 구문에 의해 반환된 행들의 집합을 의미함

Result Set은 0개 이상의 행이 포함될 수 있고 특정 기준에 의해 정렬 가능

한 테이블의 특정 컬럼, 행, 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회 가능

 

* SELECT 예시

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

// 직원 전부의 모든 정보를 조회하는 구문
SELECT *
FROM EMPLOYEE;

 

* 컬럼 값에 대해 산술 연산한 결과 조회 가능

산술 연산 과정 중 NULL 값이 존재할 경우 산술 연산한 결과값 무조건 NULL로 나옴

// 직원 전부의 이름과 연봉, 보너스를 포함한 연봉 조회
SELECT EMP_NAME, SLALRY * 12, (SALARY + (SALARY * BONUS)) * 12
FROM EMPLOYEE;

 

* 'AS 별칭'이나 "별칭", 또는 'AS "별칭"을 기술하여 컬럼 별칭을 지을 수 있음

[표현법]

컬럼명 별칭 / 컬럼명 AS 별칭 / 컬럼명 "별칭" / 컬럼명 AS "별칭"

// 직원 전부의 이름과 연봉, 보너스를 포함한 연봉 조회
// AS 생략 가능 (공백으로 구분)
// 숫자 혹은 특수문자가 포함되는 경우에 "" 사용 필수
SELECT EMP_NAME AS 이름, SALARY * 12 "연봉(원)", (SALARY + (SALARY * BONUS)) * 12 AS "총 소득(원)"
FROM EMPLOYEE;

 

* 리터럴 : 임의로 지정한 문자열을 SELECT절에 사용하면 테이블에 존재하는 데이터처럼 활용 가능

// 직원 전부의 사번과 월급 조회
// 문자나 날짜 리터럴은 '' 기호 사용
// 리터럴은 Result Set의 모든 행에 반복 표시 됨
SELECT EMP_ID, SALARY, '원' AS 단위
FROM EMPLOYEE;

 

* DISTINCT : 컬럼에 포함된 데이터 중 중복 값을 제외하고 한 번식만 표시하고자 할 때 사용 (즉 중복제거)

// 모든 직원의 직급 코드 조회
// SELECT절에 1회만 기술 가능
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;

 

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

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

// 컬럼과 리터럴을 연결한 경우
SELECT EMP_NAME || '의 월급은 ' || SALARY || '원입니다.'
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;

// 부서코드가 'D6'이거나 급여를 2000000보다 많이 받는 직원의 이름, 부서코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' OR SALARY > 2000000;

 

- 비교 연산자 : 표현식 사이의 관계를 비교하기 위해 사용하고 비교 결과는 논리 결과 중 하나가 됨

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

 

* BETWEEN AND : 비교하려는 값이 지정한 범위에 포함되면 TRUE를 리턴하는 연산자

[표현법]
비교대상컬럼 BETWEEN A(값1) AND B(값2)
-> 해당 컬럼값이 A이상이고 B이하인 경우

// 급여를 3500000보다 많이 받고 6000000보다 적게 받는 직원 이름과 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 6000000

 

* LIKE : 비교하려는 값이 지정한 특정 패턴을 만족하면 TRUE를 리턴하는 연산자로 '%'와 '_'를 와일드카드로 사용

와일드 카드 문자와 패턴의 특수문자가 동일한 경우 어떤 것을 패턴으로 결정하는지 구분하지 못하기 때문에 
데이터로 처리할 와일드 카드 문자 패턴 기호 앞에 임의의 특수문자를 사용하고 ESCAPE OPTION으로 등록하여 처리

 

[표현법]
비교대상컬럼 LIKE '특정패턴';
    
- 특정 패턴 제시 시 '%', '_'를 와일드 카드로 사용할 수 있음
>> '%' : 0글자 이상
EX) 비교대상컬럼 LIKE '문자%'   => 비교대상의 컬럼값이 문자로 "시작"되는걸 조회
        비교대상컬럼 LIKE '%문자'   => 비교대상의 컬럼값이 문자로 "끝"나는걸 조회
        비교대상컬럼 LIKE '%문자%'  => 비교대상의 컬럼값에 문자가 "포함"되는 걸 조회 (키워드 검색)
   
>> '_' : 1글자
EX) 비교대상컬럼 LIKE '_문자'   => 비교대상의 컬럼값에 문자 앞에 무조건 한글자가 올 경우 조회
        비교대상컬럼 LIKE '문자_'   => 비교대상의 컬럼값에 문자 뒤에 무조건 한글자가 올 경우 조회
        비교대상컬럼 LIKE '_문자_'  => 비교대상의 컬럼값에 문자 앞뒤에 무조건 한글자가 올 경우 조회

// '전'씨 성을 가진 직원의 이름과 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

// 핸드폰의 앞 네 자리 중 첫 번호가 7인 직원 이름과 전화번호 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___7%'

// 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 '이%';

SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPOYEE
WHERE NOT EMP_NAME LIKE '이%';

 

* IS NULL / IS NOT 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');

 

- 연산자 우선순위

0. ()
1. 산술 연산자
2. 연결 연산자
3. 비교 연산자
4. IS NULL / LIKE / IN
5. BTWEEN A AND B
6. NOT(논리 연산자)
7. AND(논리 연산자)
8. OR(논리 연산자)

// 'J2' 또는 'J7' 직급 코드 중 급여를 2000000보다 많이 받는 직원의 이름, 급여, 직급코드 조회
SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE JOB_CODE = 'J7' OR JOB_CODE = 'J2' AND SALARY > 2000000;
// 연산자 우선 순위에 의해서 AND가 먼저 실행됨
// J2 직급의 급여 2000000 이상 받는 직원이거나 JJ7 직급인 직원이라는 의미

SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE (JOB_CODE = 'J7' OR JOB_CODE = 'J2') AND SALARY > 2000000;
// 우선 순위를 고려하여 OR가 먼저 처리 되도록 ()를 이용해 우선 순위 변경
// J7 직급이거나 J2 직급인 직원들 중 급여 2000000 이상 받는 직원이라는 의미

 

 

- ORDER BY 절

 

 [표현법]
SELECT 조회할컬럼1, 컬럼2, 컬럼3, 산술연산식 AS "별칭", ....
FROM 조회하고자 하는 테이블명
WHERE 조건식
ORDER BY 정렬하고싶은 컬럼 | 별칭 | 컬럼순번 [ASC | DESC] [NULLS FIRST | NULLS LAST]
    
- ASC : 오름차순 정렬 (생략시 기본값)
- DESC : 내림차순 정렬
    
- NULLS FIRST : 정렬하고자 하는 컬럼값에 NULL이 있을 경우 해당 데이터를 맨 앞 배치(생략시 DESC일때의 기본값)
- NULLS LAST : 정렬하고자 하는 컬럼값에 NULL이 있을 경우 해당 데이터를 맨 뒤에 배치(생챡시 ASC일때의 기본값)