DML (SELECT)

김찬희·2023년 3월 17일
0

KH정보교육원

목록 보기
17/27

▶ 주요 용어

▶ SQL(Structured Query Language)

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

▶ 주요 데이터 타입

▶ SELECT

데이터를 조회한 결과를 Result Set이라고 하는데 SELECT구문에 의해 조회된 행들의 집합을 의미.
Result Set은 0개 이상의 행이 포함될 수 있고 Result Set은 특정한 기준에 의해 정렬 가능.
한 테이블의 특정 컬럼, 특정 행, 특정 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회 가능

√ 작성법

SELECT 컬럼 명 [, 컬럼명, ...]
FROM 테이블 명
WHERE 조건식;
  • SELECT : 조회하고자 하는 컬럼명 기술
    여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분하고, 마지막 컬럼 다음은 쉼표를 사용하지 않음
    모든 컬럼 조회 시 컬럼 명 대신 ‘*’ 기호 사용 가능하며 조회 결과는 기술한 컬럼 명 순으로 표시 됨
  • FROM : 조회 대상 컬럼이 포함된 테이블 명 기술
  • WHERE : 행을 선택하는 조건 기술
    여러 개의 제한 조건을 포함할 수 있으며, 각각의 제한 조건은 논리 연산자로 연결
    제한 조건을 만족시키는 행들만 Result Set에 포함

▶ SELECT 예시

√ 기본

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

  • 직원 전부의 모든 정보를 조회하는 구문
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;

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

SELECT EMP_NAME, SALARY * 12, (SALARY + (SALARY*BONUS)) * 12
FROM EMPLOYEE;

√ 컬럼 별칭
‘AS 별칭‘이나 “별칭”, 또는 ‘AS “별칭“’을 기술하여 컬럼 별칭을 지을 수 있음

SELECT EMP_NAME AS 이름, SALARY*12 “연봉(원)”, (SALARY + (SALARY*BONUS))*12 AS “총 소득(원)“
FROM EMPLOYEE;

* 숫자 혹은 특수문자가 포함되는 경우에 ""사용
* AS 생략 가능(공백으로 구분)

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

SELECT EMP_ID,
	   SALARY,
	   ‘원’ AS 단위
FROM EMPLOYEE;

* 문자나 날짜 리터럴은 ''기호 사용
* 리터럴은 Result Set의 모든 행에 반복 표시 됨

√ DISTINCT
컬럼에 포함된 데이터 중 중복 값을 제외하고 한 번씩만 표시하고자 할 때 사용

SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;

* SELECT절에 1회만 기술 가능

√ 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;

▶ 연결 연산자

‘||’를 사용하여 여러 컬럼을 하나의 컬럼인 것처럼 연결하거나 컬럼과 리터럴을 연결함
√ 컬럼과 컬럼을 연결한 경우

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;

또는

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
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 ‘이%’;

또는

SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
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’);

또는

SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
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;

* 연산자 우선 순위에 의해서 AND가 먼저 실행됨
J2직급의 급여 2000000 이상 받는 직원이거나 J7직급인 직원이라는 의미

SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE (JOB_CODE = ‘J7’
OR JOB_CODE = ‘J2’)
AND SALARY > 2000000;

* 우선순위를 고려하여 OR가 먼저 처리 되도록 ( )를 이용해 우선 순위 변경
J7 직급이거나 J2직급인 직원들 중 급여 2000000 이상 받는 직원이라는 의미

profile
김찬희입니다.

0개의 댓글