본문 바로가기

데이터베이스/ORACLE

[Oracle] 20-05-06 수업

마크다운 형태는 왤케 글씨가 작게보이지

2020-05-06-Database(2차).md
0.01MB

[수업 정리]

4. 실습 SELECT

1. SQL 분류 와 SELECT(시험 문제)

★★★SQL 분류와 SELECT 문제(3 또는 4번 문제) ![image](https://user-images.githubusercontent.com/63223355/81156253-b74d2300-8fc0-11ea-9ad5-e04d2ad5fbbe.png)

  • 질문) QUERY에 SELECT만 따로 빼놓은 이유는?
    • 학자에 따라 5개의 카테고리, 4개의 카테고리로 분류하기도 한다.
    • QUERY는 조작이 아니라 단순히 보기만 하기 때문에, DML보다 QUERY라는 별도의 카테고리에 넣는 것이 맞다는 의견도 있다.

2. SELECT 실습


2-1. 실습 환경


2-2 SELECT LIST

조인

  • 관계형 연산의 꽃이라고 불림

Alias

  • 한글이 가능하다.

★★★SQL 시험

  • 데이터 구조 보는 명령어: DESC TABLE;
  • 데이터 내용 보기: SELECT * FROM TABLE;

SELECT LIST

  • 의미: SELECT 와 FROM사이를 SELECT LIST
  • 역할: 원하는 COLUMN(즉 속성)만 조회(Projection)

데이터 타입

  • 사용하게 될 데이터 타입은 대부분 NUMBER, VARCHAR2, DATE 세 가지다.
  • NUMBER 라는 데이터타입으로, 정수와 실수를 모두 나타낸다.
  • VARCHAR2 : Variable length / character / version 2 => 가변길이 문자 타입
    • CHAR : 고정길이 문자 타입
  • DATE: 날짜와 시간정보를 나타내는 타입이다.

데이터의 종류

  • 범주형
    • 순서형
    • 명목형
  • 숫자형
    • 이산형
    • 연속형

데이터 타입 변환(Data type conversion)

  • Explicit(명시적, 수동으로)
    • 웬만하면 명시적 형변환을 하라. 묵시적 형변환보다 좋다. 왜?
    • 명료성(코드의 의미) => 개발은 짧고 운영은 길다. 다른 사람이 그 코드를 담당하게 됐을 때, 잘 이해할 수 있어야 함.
    • 안정성 => 코드가 해외에서 돌아갈 수도 있다.
  • Implicit(암시적, 묵시적, 자동으로)
    • 자동으로 돌아가는 것은, 운영할 때 의미를 알아차리기 어렵고 안전하지 않다.
  • 타입변환 함수
    • to_char
    • to_number
    • to_date
    • **★숫자와 날짜타입사이에는 데이터 변환이 되지 않는다.**
      • 숫자에서 to_date (불가능), 날짜에서 to_number(불가능)
      • 숫자와 날짜 타입은 같은 방식으로 저장이된다. 따라서 비교연산이 된다.

합성 연산자 ![image](https://user-images.githubusercontent.com/63223355/81156800-48bc9500-8fc1-11ea-8295-b37fcecba0d3.png)


DUAL

  • 정의: Dummy Table.
    • sys user 소유(즉, 내가 연결한 서버의 소유), 1개의 row, 1개의 column을 가진 작고 가벼운 테이블,
    • Dummy(트릭으롤 사람 대신 사용하는 인형)
  • 용도: 실제 테이블로부터 데이터를 가져오는 것이 아닌 function, calculation을 수행하기 위해서 사용
    • SELECT 123123 * 123123 , to_char(123123 * 123123, '999,999,999,999') FROM dual;
    • SELECT 를 쓰려면 FROM이 와야한다. 그런데, 위와 같은 연산을 할 때 테이블이 필요하지 않다. 그때 쓰는 테이블이 DUAL이다.
  • 실습
    • Desc dual
    • desc dual
    • DESC DUAL
    • SELECT * FROM dual;
    • SELECT sysdate FROM dual;
      • ★서버에 있는 시간을 나타낸다.
        • 서버에 request 해서 response 온 결과다. 아주 비효율적이다.
        • 직업 확인 하는 것이 좋다.
      • 노트북에 있는 시간 아님!
      • 그런데도 왜 쓸까. 클라이언트의 시간이 각각 다를 수 있기 때문이다.
        • 데이터베이스의 이벤트는 시간정보가 입력된다.
        • 클라이언트마다 다르게 시간을 기입한다면, 혼란스럽다. 따라서 서버의 시간을 기준으로 시간을 작성한다.
    • SELECT 143475*127363, to_char(143475*127363,'999,999,999,999') FROM dual;
      • '999,999,999,999' => 세자리 마다 콤마를 찍겠다는 의미.
    • **SELECT 123123 * 123123 , to_char(123123 * 123123, '999,999,999,999') FROM dual;**
    • SELECT 123 * 123 , to_char(123 * 123, '999,999') FROM dual;

**SQL 주요 특징 4가지**

  1. ANSI/ISO-SQL
    • 미국 산업 표준화 기구 (ANSI: American National Standards Institute)
  2. RDBMS에 접근하는 유일한 언어
  3. English like
    • SQL 명령어는 대소문자를 구분하지 않는다. (Case - Insensitive)
      • 그러나, 조직마다 명명 규칙이 있다.
    • 의미와 문법구조가 영어와 친숙하다.
  4. 비절차적 언어
    • 튜닝에 중요한 개념이다. 지금은 알 단계가 아님.

DBMS 유저

  • DBA user : sys, system(default 유저) cf) 리눅스의 root 계정과 비슷하다.
  • DEV user : scott (지금 실습에 사용하는 계정)

2-3. WHERE

  • 의미: 조건절
  • 역할: 원하는 ROW(레코드 == 행 / tuple)만 조회(Selection)
    • cf) SELECT LIST: 원하는 COLUMN(필드 == 열 / attribute == feature == variable)만 조회
  • 실습
    • SELECT * FROM EMP WHERE DEPTNO = 10;
    • SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE SAL > 2000;
    • SELECT SALGRADE,SAL,EMPNO,ENAME FROM EMP WHERE DEPTNO = 10 AND SAL > 2000;
      • SALGRADE 없는 컬럼이네.
      • 비교 연산자와 논리 연산자를 함께 사용.
      • 내가 SELECT 하지 않은 컬럼을 조건절에 넣을 수 있다.
    • SELECT DEPTNO,SAL,EMPNO,ENAME FROM EMP WHERE DEPTNO = 10 AND SAL > 2000;
      • 부서번호 10번, 연봉 2000 초과
    • SELECT DEPTNO,SAL,EMPNO,ENAME FROM EMP WHERE DEPTNO = 10 OR SAL > 2000;
    • **SELECT DEPTNO,ENAME,JOB FROM EMP WHERE JOB = 'manager';**
      • **SQL문은 대소문자를 가리지 않지만, 데이터의 대소문자는 구분한다.**
      • SELECT DEPTNO,ENAME,JOB FROM EMP WHERE JOB = 'MANAGER';
    • **SELECT DEPTNO,ENAME,JOB FROM EMP WHERE 1=1;**
      • WHERE ture;
        • 전체 행을 조회하겠다.
      • SELECT DEPTNO,ENAME,JOB FROM EMP;
    • **SELECT DEPTNO,ENAME,JOB FROM EMP WHERE 1=2;**
      • WHERE false;
        • 대상 없음.

종결자

  • SQL: 문장 종결자는 ';'이다,
  • SQL PLUS : 문장 종결자가 없다.
    • DESC, Set, Col 같은 명령어

2.4 ORDER BY

  • [역할] 정렬(SORTING)
  • [기준] 정렬시 값 비교기준
    • 숫자, 문자, 날짜, NULL 모두 사용 가능.
    • 숫자 ~ 작은수/큰수 EX) 123 < 456
    • 문자 ~ 알파벳 순서(ASCII) EX) ‘SCOTT’ < ‘T’
    • 날짜 ~ 숫자와 동일 EX) ‘2003/11/16’ > ‘19990916’
    • **NULL ~ 가장 큰 값으로 간주**
      • 굉장히 중요하고, 오해하기 쉽다.
  • [방향]
    • ASC ~ 오름차순(ASCENDING ORDER) , DEFAULT
      • 키워드임.
    • DESC ~ 내림차순(DESCENDING ORDER)
  • 실습
    • SELECT DEPTNO,ENAME,SAL,HIREDATE FROM EMP ORDER BY ENAME;
    • SELECT DEPTNO,ENAME,SAL,HIREDATE FROM EMP ORDER BY SAL;
    • SELECT DEPTNO,ENAME,SAL,HIREDATE FROM EMP ORDER BY SAL ASC;
      • default 키워드가 ASC이지만, 명시해주는 것이 좋다.
      • 명확성!
    • SELECT DEPTNO,ENAME,SAL,HIREDATE FROM EMP ORDER BY SAL DESC;
    • SELECT DEPTNO,JOB,ENAME FROM EMP ORDER BY DEPTNO;
    • **SELECT DEPTNO,JOB,ENAME FROM EMP ORDER BY DEPTNO,JOB;**
      • 정렬의 기준이 복수개일 때
      • 첫번째 컬럼으로 우선 정렬, 동률일 때 그 다음 컬럼으로 정렬
      • 하나의 컬럼으로 정렬했을 때, 동률인 경우에는?
        • 저장된 순으로 출력된다. 그런데, 그 저장된 순서는 알 수 없다.(?)
    • SELECT DEPTNO,JOB,ENAME FROM EMP ORDER BY DEPTNO,JOB desc;
    • SELECT DEPTNO, JOB, ENAME, HIREDATE FROM EMP WHERE JOB = 'MANAGER' AND SAL > 2000 ORDER BY DEPTNO;
      • 혼자서 만들어 봄.
      • **SELECT FROM WHERE ORDER BY**
    • SELECT * FROM EMP WHERE 'SCOTT' < 'T';
    • SELECT * FROM EMP WHERE 'SCOTT' > 'T';

2.5 DISTINCT, FUNCTION

  • DISTINCT [역할] : 중복된 데이터를 필터링하여 조회(SELECT)
  • 실습
    • SELECT JOB FROM EMP;
    • SELECT DISTINCT JOB FROM EMP;
    • SELECT DISTINCT DEPTNO, JOB FROM EMP;
    • SELECT DISTINCT DEPTNO, DISTINCT JOB FROM EMP;
      • 에러난다.
      • DISTINCT의 범위는, 그 뒤에 나열되는 모든 컬럼들이다.
    • SELECT DISTINCT DEPTNO, JOB FROM EMP ORDER BY DEPTNO;
      • ORDER BY는 언제 적용되는가
    • SELECT DEPTNO, DISTINCT JOB FROM EMP;
      • DISTINCT는 SELECT 바로 뒤에 써야한다.
      • SELECT SYNTAX 보면 DISTINCT는 select_list 앞에 오는 것으로 돼 있음.
  • DISTINCT 내부 알고리즘
    • order by(=sort)
    • Hash 알고리즘
      • DB를 깊게 파려면, 알아야 한다.

  • FUNCTION [역할] : 입력값(Input Data)을 기반으로 특정 연산을 수행하여 결과값(Output Data) 값을 리턴(Return)하는 단위 기능 모듈(Module)

![image](https://user-images.githubusercontent.com/63223355/81156433-e5326780-8fc0-11ea-8ee4-b8fe49d5a8e2.png)

  • 함수의 종류
    • ORACLE 제공 함수
      • 단일행 함수(single row function): 1개의 row가 입력되고, 1개의 row가 반환됨.
        • LENGTH, UPPER, LOWER 등
      • 그룹행 함수(group row function): 여러개의 row가 입력되고, 1개의 row가 반환됨.
        • COUNT, SUM, AVG, MIN, MAX 등
    • 사용자 정의 함수
  • SQL 내에 함수를 사용할 수 있다. 그리고, 그 연산을 DBMS에 맡기면 된다.
    • 스스로 연산을 하지 않고, 이런 큰 연산은 DBMS에 넘기는 것이 잘 사용하는 것임.
    • 서버는 엄청난 성능임. 그러려고 그렇게 성능이 좋은 것이다.
  • 실습
    • SELECT ENAME,LENGTH(ENAME),UPPER(ENAME),LOWER(ENAME) FROM EMP;
      • LENGTH(SAL) 가능함. => SAL NUMBER 데이터임.
    • SELECT COUNT(*),COUNT(SAL),SUM(SAL),AVG(SAL),MIN(SAL),MAX(SAL) FROM EMP;