목차
- SELECT
1-1. Result Set
1-2. SELECT 기본 문법
1-3. SELECT절 연산자 사용 예시
1-4. WHERE절 연산자 사용 예시
1-5. 연산자 우선순위
학습점검 Check
✅ Oracle DBMS에서 사용하는 자료형을 이해할 수 있다.
✅ Oracle DBMS에서 사용하는 자료형별 특징을 이해할 수 있다.
✅ SELECT에 대해 이해할 수 있다.
✅ SELECT 구문의 SELECT 절에 대해 이해할 수 있다.
✅ SELECT 구문의 FROM 절에 대해 이해할 수 있다.
✅ SELECT 구문의 WHERE 절에 대해 이해할 수 있다.
✅ 테이블에서 행의 조건에 따라 원하는 데이터를 조회할 수 있다.
✅ 데이터 조회 시 별칭을 이용하여 컬럼 헤더를 변경할 수 있다.
✅ 컬럼명 대신 리터럴을 이용하여 SELECT 할 수 있다.
✅ DISTINCT 키워드를 이용하여 중복된 행을 제거해서 조회할 수 있다.
✅ SELECT 구문의 동작 원리와 순서를 이해할 수 있다.
✅ 오라클에서 사용 가능한 연산자에 대해서 이해할 수 있다.
✅ SELECT 절에서 연산자를 이용하여 데이터를 조회할 수 있다.
✅ WHERE 절에서 연산자를 이용하여 데이터를 조회할 수 있다.
✅ 연산자 우선순위를 고려하여 쿼리문을 작성할 수 있다.
A. 주요 용어
① 행(row), 튜플
② 컬럼, 도메인
③ 기본키(primary key)
④ 외래키(foreign key)
⑤ null
⑥ 컬럼값, 속성값
B. SQL(Structured Query Language)
- 관계형 데이터베이스(RDBMS)에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어이다.
- 원하는 데이터를 찾는 방법이나 절차가 아닌 조건을 기술한다.
분류 | 용도 | 명령어 |
DQL (Data Query Language) |
데이터 검색 | SELECT |
DML (Data Manipulation Language) |
데이터 조작 | INSERT UPDATE DELETE |
DDL (Data Definition Language) |
데이터 정의 | CREATE ALTER DROP |
TCL (Transaction Control Language) |
트랜젝션 제어 | COMMIT ROLLBACK |
SELECT~INSERT, UPDATE, DELETE까지 묶어서 DML이라고 칭하기도 한다. 엄격하게 분리한다면 SELECT만 따로 DQL이다.
C. 주요 데이터 타입
데이터 타입 | 하위 데이터 타입 | 설명 |
NUMBER | - | 숫자 |
CHARACTER | CHAR | 고정길이 문자(최대 2000 byte) |
VARCHAR2 | 가변길이 문자(최대 4000 byte) | |
LONG | 가변길이 문자(최대 2GB) | |
DATE | - | 날짜 |
LOB | CLOB | 가변길이 문자(최대 4GB) |
BLOB | Binary Data |
- CHAR 타입은 고정형이다. 지정 크기보다 작은 값이 입력되었을 때는 남은 공간을 공백으로 채우는 특성이 있다.
- VARCHAR2 타입은 지정 크기보다 작은 문자가 입력되거든 남은 공간을 없앤다. 실제 데이터 크기만큼만 사용하고 버린다.
1. SELECT
1-1. Result Set
- 데이터를 조회한 결과를 Result Set이라고 칭한다.
- SELECT 구문에 의해 반환된 행들의 집합을 말한다.
- Result Set은 0개 이상의 행이 포함될 수 있다. 결과가 없다면 0일 수 있다는 뜻이다.
- Result Set은 특정한 기준에 의해 정렬될 수 있다.
1-2. SELECT 기본 문법
SELECT 컬럼명
SELECT
컬럼명
, 컬럼명
, 컬럼명
FROM 테이블명
WHERE 조건식;
- SELECT 표현식은 위와 같다.
- SELECT 구문은 조회하고자 하는 컬럼명을 기술하는 곳이다.
- 여러 칼럼을 조회하는 경우 쉼표(,)로 구분한다. 마지막 컬럼 다음은 쉼표를 사용하지 않는다.
- 조회 결과는 기술한 컬럼명 순서대로 표시된다.
❗ *(asterisk) : 모든 컬럼을 의미한다.
- 모든 컬럼 조회를 원할 때는 컬럼명을 일일이 작성하는 것도 방법이겠지만, 대신에 애스터리스크(*) 표시로 대신할 수 있다.
-- 모든 행 모든 컬럼 조회
-- EMPLOYEE 테이블에서 모든 정보 조회
SELECT * FROM EMPLOYEE; 이렇게 한 줄로 작성해도 되지만
SELECT
*
FROM EMPLOYEE;
많은 컬럼을 다룰 때를 대비해 줄맞춤 적용한다.
FROM 테이블명
- 조회 대상 컬럼이 포함된 테이블명을 기술한다.
-- 원하는 컬럼 조회
-- EMPLOYEE 테이블의 사번, 이름 조회
SELECT
EMP_ID
, EMP_NAME
FROM EMPLOYEE;
WHERE 조건식;
- 행 선택 조건에 따라, 즉 테이블에서 조건을 만족하는 값을 가진 행을 골라낸다.
- 여러 제한조건을 포함할 수 있으며, 이때 각각의 조건은 논리 연산자(AND, OR, NOT)로 연결한다.
- 제한조건을 만족시키는 행들만 Result Set에 포함한다.
-- 원하는 행 조회
-- EMPLOYEE 테이블에서 부서코드가 D9인 사원 조회
SELECT
*
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
-- 원하는 행과 컬럼 조회
-- EMPLOYEE 테이블에서 급여가 300만원 이상인 사원의 사번, 이름, 부서코드, 급여 조회
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;
-- 부서코드가 D6이고, 급여가 200만원을 초과하는 직원의 이름, 부서코드, 급여 조회
SELECT
EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEMPT_CODE = 'D6';
AND SALARY > 2000000;
1-3. SELECT절 연산자 사용 예시
AS 별칭
SELECT
EMP_NAME AS 이름
, SALARY * 12 "1년 급여(원)"
- AS 키워드와 함께 컬럼의 별칭을 지을 수 있다.
- "별칭"처럼 작성할 수 있다. 숫자, 공백, 특수문자와 함께 쓰려면 큰따옴표로 감싸주어야 한다. 이때 AS 키워드는 생략 가능하다.
, (SALARY + (SALARY * BONUS)) * 12
, (SALARY + (SALARY * NVL(BONUS, 0))) * 12 AS "총 소득(원)"
FROM EMPLOYEE;
- NVL은 소괄호 안에 컬럼과 값을 명시하여 NULL을 처리한다. 여기서는 BONUS 컬럼이 NULL인 경우는 0이라는 값으로 처리하라고 쓰였다: NVL(BONUS, 0)
- 따라서 NVL 적용하지 않은 상단의 코드와 하단의 코드는 결과가 다르게 나오게 마련이다.
임의 문자열 사용
'리터럴'
SELECT
EMP_ID
, EMP_NAME
, SALARY
, '원' AS 단위
FROM EMPLOYEE;
- 임의로 지정한 문자열을 테이블에 존재하는 데이터처럼 사용할 수도 있다.
- 이때 문자열 리터럴은 작은따옴표로 표현한다.
- 리터럴은 Result Set의 모든 행에 반복 표시된다. 결과적으로 단위라는 이름하에 '원'이라는 컬럼값을 일관되게 가진 열이 새롭게 생성되는 것이다.
-- 퇴사 여부가 N인 직원에 대해 근무여부를 별칭으로 하여
재직중이라는 문자열을 결과집합에 포함시키고 사번, 이름, 입사일, 근무여부 조회
SELECT
EMP_ID
, EMP_NAME
, HIRE_DATE, ENT_YN근무여부를 별칭으로 한다==근무여부가 컬럼명, 재직중==컬럼값!!!
, '재직중' 근무여부
FROM EMPLOYEE;
WHERE ENT_YN = 'N';
DISTINCT
SELECT
DISTINCT JOB_CODEDISTINCT DEPT_CODE키워드 중복 사용 불가
FROM EMPLOYEE;
- DISTINCT 키워드를 통해 중복된 컬럼값을 제거하고 조회할 수 있다.
- 즉 컬럼에 포함된 중복 값을 한 번씩만 표시하고자 할 때 사용된다.
총 직원 23명이 가지고 있는 소속 부서는 각기 다르겠지만, 거기서 중복을 없애면 부서 종류를 구해볼 수 있는 것이다. - 한편 DISTINCT 키워드는 SELECT절에서 단 한 번만 쓰일 수 있다.
||
연결 연산자
-- 컬럼과 컬럼간 연결
SELECT
EMP_ID || EMP_NAME || SALARY
FROM EMPLOYEE;
--컬럼과 리터럴간 연결
SELECT
EMP_NAME || '의 월급은 ' || SALARY || '원입니다.'
FROM EMPLOYEE;
- 연결 연산자 ||를 이용해 컬럼과 컬럼간 또는 컬럼과 리터럴간에 연결을 만들 수 있다.
- 하나의 값처럼, 하나의 문장처럼 조회된다.
1-4. WHERE절 연산자 사용 예시
IS NULL
/IS NOT NULL
비교 연산자
- 다음은 NULL 여부를 비교하는 비교 연산자 IS NULL과 IS NOT NULL의 예시이다.
-- 보너스를 지급 받지 않는 사원의 사번, 이름, 급여, 보너스 조회
SELECT
EMP_ID
, EMP_NAME
, SALARY
, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;
- NULL 값인 데 대해서는 위와 같이 WHERE의 조건식 자리에 IS NULL; 선언해 값을 가져올 수 있다.
-- 보너스 지급 받는 사원의 사번, 이름, 급여, 보너스 조회
SELECT
EMP_ID
, EMP_NAME
, SALARY
, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;
- 반대로 NULL이 아닌 값들은 IS NOT NULL;로 조회할 수 있다.
= 같다, > 크다, < 작다, >= 크거나 같다, <= 작거나 같다
!= ^= <> 같지 않다
비교 연산자
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9';
WHERE DEPT_CODE ^= 'D9';
WHERE DEPT_CODE <> 'D9';
- 같지 않다는 의미의 비교 연산자 종류가 !=, ^=, <>로 총 세 가지이다.
컬럼명 BETWEEN 하한값 AND 상한값
비교 연산자
WHERE SALARY >=3500000
AND SALARAY <= 5500000;
- 급여를 350만원 이상 550만원 이하로 받는 직원을 조회한다 가정한다면, 위처럼 WHERE~AND 조건식으로도 충분히 표현할 수 있을 것이다.
- 다만 이 기능을 직접 수행하는 것이 바로 BETWEEN AND 연산자이다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, JOB_CODE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 5500000;
- BETWEEN AND 연산자 통해 하한값 이상이자 상한값 이하인 값을 조회한다. 이때는 한 줄로 표기한다.
컬럼명 NOT BETWEEN 하한값 AND 상한값
NOT 컬럼명 BETWEEN 하한값 AND 상한값
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, JOB_CODE
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3500000 AND 5500000; 사용 가능!
WHERE NOT SALARY BETWEEN 3500000 AND 5500000; 사용 가능!
- 범위를 뒤집고자 한다면 NOT BETWEEN AND 연산자를 기술할 수 있다.
- 이때 NOT 키워드는 컬럼명 앞이든 BETWEEN 앞이든, 다시 말해 컬럼명 기준으로 앞이든 뒤든 올 수 있다.
LIKE
/NOT LIKE
비교 연산자
-- 성이 김씨인 직원의 사번, 이름, 입사일 조회
SELECT
EMP_ID
, EMP_NAME
, HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '김%';
- 문자 패턴이 일치하는 값을 조회한다. 즉 비교하려는 값이 지정한 패턴을 만족시키면 TRUE를 리턴하는 연산자이다.
- 이름에 '하'가 포함된 이를 검색하려면 WHERE 조건식을 다음과 같이 쓰면 된다: WHERE EMP_NAME LIKE '%하%';
-- 김씨가 아닌 직원의 사번, 이름, 입사일 조회
SELECT
EMP_ID
, EMP_NAME
, HIRE_DATE
FROM EMPLOYEE
WHERE NOT EMP_NAME LIKE '김%'; 사용 가능!
WHERE EMP_NAME NOT LIKE '김%'; 사용 가능!
- NOT LIKE에서 NOT 키워드는 컬럼명 기준 앞에도 뒤에도 쓰일 수 있다.
❗ 문자 패턴
'글자%' : 글자로 시작하는 값
'%글자%' : 글자가 포함된 값
'%글자' : 글자로 끝나는 값
와일드카드 _ %
- '%'와 '_'를 와일드카드로서 사용할 수 있다.
- _는 글자 한 자리, %는 0개 이상의 글자임을 의미한다.
-- 전화번호 국번이 9로 시작하는 직원의 사번, 이름, 전화번호 조회
SELECT
EMP_ID
, EMP_NAME
, PHONE
FROM EMPLOYEE;
WHERE PHONE LIKE '___9%';
- 이렇게 조회하게 되면 0109***, 0179** 모두 결과값으로 나온다.
- 여기서 네 자리 국번 9***을 사용하는 사원들만 추리고 싶다면 아래처럼 조건을 바꿔쓸 수 있다.
-- 전화번호 국번이 4자리이면서 9로 시작하는 직원의 사번, 이름, 전화번호 조회
SELECT
EMP_ID
, EMP_NAME
, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9_______';
- 즉 언더바(_)로 9 뒤에 세 자리 ___, 그 뒤로 네 자리 ____가 온다는 자릿수를 직접 지정한 것이다.
ESCAPE
-- 앞글자가 3자리인 이메일주소를 가진 사원의 사번, 이름, 이메일주소 조회
SELECT
EMP_ID
, EMP_NAME
FROM EMPLOYEE
WHERE EMAIL LIKE '___#_%' ESCAPE '#';
IN
/NOT IN
비교 연산자
- 비교하는 값 목록에 일치하는 데이터가 있으면 TRUE를 반환하는 연산자이다.
-- 부서코드가 'D6'이거나 'D8'인 직원의 이름, 부서, 급여 조회
SELECT
EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE IN('D6', 'D8);
-- 부서코드가 'D6', 'D8'이 아닌 직원의 이름, 부서, 급여 조회
SELECT
EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE NOT IN('D6', 'D8')
1-5. 연산자 우선순위
특히 주의할 점은 AND > OR 관계이다.
우선순위 | 연산자 |
1 | 산술연산자 + - * / |
2 | 연결연산자 || |
3 | 비교연산자 같다같지않다크다작다 |
4 | IS NULL/IS NOT NULL, LIKE/NOT LIKE, IN/NOT IN |
5 | BETWEEN AND/NOT BETWEEN AND |
6 | 논리연산자 NOT |
7 | AND |
8 | OR |
- 아래 예시들로 AND > OR 연산자간 우선순위를 알아볼 수 있다.
- 첫 번째 예시는 OR보다 AND가 먼저 처리되면서 J2에 해당 급여 이상을 받는 직원들과 그냥 J7 직급인 직원들이 조회된다.
-- J2 직급에 급여 200만원 이상 받은 직원이거나, J7 직급인 직원의 이름, 급여, 직급코드 조회
SELECT
EMP_NAME
, SALARY
, JOB_CODE
FROM EMPLOYEE;
WHERE JOB_CODE = 'J7'
OR JOB_CODE = 'J2'
AND SALARY >= 2000000;
- 두 번째 예시에서는 비로소 알맞은 답을 얻을 수 있다. 의도한 결과값을 얻으려면 소괄호 ()를 활용해 우선순위를 명시하는 것이 좋다.
-- J7 직급이거나 J2 직급인 직원들 중 급여가 200만원 이상인 직원의 이름, 급여, 직급코드 조회
SELECT
EMP_NAME
, SALARY
, JOB_CODE
FROM EMPLOYEE;
WHERE (JOB_CODE = 'J7'
OR JOB_CODE = 'J2')
AND SALARY >= 2000000;
'Database' 카테고리의 다른 글
[Oracle/SQL] 4. JOIN | OUTER JOIN | SELF JOIN | 다중 JOIN (0) | 2022.01.19 |
---|---|
[Oracle/SQL] 3. GROUP BY | HAVING | ROLLUP | CUBE | SET OPERATION (0) | 2022.01.19 |
[Oracle/수업 과제 practice] 함수 (0) | 2022.01.18 |
[Oracle/SQL] 2. 함수 | 그룹함수 | 단일행함수 | 형변환함수 | 선택함수 (0) | 2022.01.18 |
[Oracle/SQL] 0. 데이터베이스 개요 | DBMS (0) | 2022.01.15 |