마크다운 형태는 왤케 글씨가 작게보이지
[수업 정리]
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가지**
- ANSI/ISO-SQL
- 미국 산업 표준화 기구 (ANSI: American National Standards Institute)
- RDBMS에 접근하는 유일한 언어
- English like
- SQL 명령어는 대소문자를 구분하지 않는다. (Case - Insensitive)
- 그러나, 조직마다 명명 규칙이 있다.
- 의미와 문법구조가 영어와 친숙하다.
- SQL 명령어는 대소문자를 구분하지 않는다. (Case - Insensitive)
- 비절차적 언어
- 튜닝에 중요한 개념이다. 지금은 알 단계가 아님.
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;
- WHERE ture;
- **SELECT DEPTNO,ENAME,JOB FROM EMP WHERE 1=2;**
- WHERE false;
- 대상 없음.
- 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)
- ASC ~ 오름차순(ASCENDING ORDER) , DEFAULT
- 실습
- 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 등
- 단일행 함수(single row function): 1개의 row가 입력되고, 1개의 row가 반환됨.
- 사용자 정의 함수
- ORACLE 제공 함수
- 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;
- SELECT ENAME,LENGTH(ENAME),UPPER(ENAME),LOWER(ENAME) FROM EMP;
'데이터베이스 > ORACLE' 카테고리의 다른 글
[Oracle] SQL Developer 엑셀 import 하기 (0) | 2020.09.07 |
---|---|
[Oracle] 한글 Alias에는 반드시 더블쿼테이션("")을 붙여야 함 (0) | 2020.09.05 |
[Oacle] 최종 프로젝트 쿼리 정리 (0) | 2020.09.04 |
[Oracle] 연산이 필요한 게 아니라면 NUMBER 타입을 쓰지 말자 (0) | 2020.09.02 |
[Oracle] 비교절에 현재시간 + 문자열 넣기 (0) | 2020.08.31 |