[초보자를 위한 SQL 200제]

1. 특정 열 선택하기

SELECT empno, ename, sal
  FROM emp;

- 모든 쿼리 끝에 세미콜론

2. 테이블에서 모든 열 출력하기

SELECT *
  FROM emp;

- *: 모든 열 선택
- 모든 열 출력하고 맨 끝에 다시 한 번 특정 컬럼 출력해야 하는 경우) SELECT table.*, column FROM table;
(ex) SELECT dept.*, deptno FROM dept;

3. 컬럼 별칭을 사용하여 출력되는 컬럼명 변경하기

SELECT empno as 사원 번호, ename as 사원 이름, sal as "Salary"
  FROM emp;

- 컬럼명 as 컬럼 별칭(alias)
- 컬럼 별칭에 " " 로 감싸줘야 하는 경우
- 대소문자 구분하여 출력할 때
- 공백문자 출력할 때
- 특수문자 출력할 때 ($, _, # 만 가능)

- 수식을 사용하여 결과 출력할 때 별칭 유용함 -> ORDER BY 절 사용할 때 유용

#(ex) 월급 = sal * (12 + 3000)

SELECT ename, sal * (12 + 3000) as 월급
  FROM emp;

 

4. 연결 연산자 사용하기 ( || )

SELECT ename || sal
  FROM emp;

- 컬럼과 컬럼 연결하여 출력
- (ex)

ENAME||SAL
KING5000
BLAKE2850
JONE2975

 

SELECT ename || '의 월급은 ' || sal || '입니다.' as 월급정보
  FROM emp;
월급정보
KING의 월급은 5000입니다.
BLAKE의 월급은 2850입니다.
JONE의 월급은 2975입니다.

 

5. 중복된 데이터 제거해서 출력하기 (DISTINCT)

SELECT DISTINCT job
  FROM emp;
  
SELECT UNIQUE job
  FROM emp;

- 컬럼에 있는 데이터들 중 중복된 것은 하나씩만 출력 (UNIQUE한 값만 출력)

6. 데이터 정렬해서 출력하기 (ORDER BY)

SELECT ename, sal
  FROM emp
  ORDER BY sal asc;

- asc: 오름차순, desc: 내림차순
- ORDER BY 절은 작성 시에도, 실행 시에도 맨 마지막에 실행됨
-> SELECT 절에 사용한 컬럼 별칭을 ORDER BY 절에 사용할 수 있음

SELECT ename, sal as 월급
  FROM emp
  ORDER BY 월급 asc;


- ORDER BY 절에 컬럼 여러개 작성 가능

SELECT ename, deptno, sal
  FROM emp
  ORDER BY deptno asc, sal desc;


-> 먼저 deptno를 오름차순 정렬한 것을 기준으로, 같은 deptno 내에서는 sal 내림차순 정렬
- 컬럼명 대신 숫자로도 작성 가능 -> SELECT 절 컬럼 순서

7. WHERE 절 배우기

(1) 숫자 데이터 검색

ex) 월급이 3000인 직원들의 이름, 월급, 직업 출력

SELECT ename, sal, job
  FROM emp
  WHERE sal = 3000;

- 원하는 검색 조건을 WHERE 절에 작성하여 데이터 검색
- WHERE 절은 FROM 절 다음에 작성
- 비교 연산자

연산자 의미
> 크다
< 작다
>= 크거나 같다
<= 작거나 같다
= 같다
!= 같지 않다
^= 같지 않다
<> 같지 않다
BETWEEN AND ~ 사이에 있는
LIKE 일치하는 문자 패턴 검색
IS NULL NULL값인지 여부
IN 값 리스트 중 일치하는 값 검색


- ORACLE은 FROM절 -> WHERE절 -> SELECT절 순서로 실행하기 때문에 WHERE 절에 컬럼 별칭 사용하면 에러남

(2) 문자와 날짜 검색

(ex) 이름이 SCOTT인 사원의 이름, 월급, 직업, 입사일, 부서번호

SELECT ename, sal, job, hiredate, deptno
  FROM emp
  WHERE ename = 'SCOTT';


(ex) 81년 11월 17일에 입사한 사원의 이름과 입사일

SELECT ename, hiredate
  FROM emp
  WHERE hiredate = '81/11/17';

- 현재 접속한 세션의 날짜 형식에 맞춰 작성

# 현재 접속한 세션의 날짜 형식 확인
SELECT *
  FROM NLS_SESSION_PARAMETERS
  WHERE PARAMETER = 'NLS_DATE_FORMAT';
  
# 현재 접속한 세션의 파라미터 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YY/MM/DD';

 

9. 산술 연산자 배우기 (*, /, +, -)

(ex) 연봉이 36000 이상인 사람들의 이름과 연봉 출력

SELECT ename, sal*12 as 연봉
  FROM emp
  WHERER sal*12 >= 36000;

(ex) 부서 번호가 10번인 사람들의 이름, 월급, 커미션, 월급 + 커미션 출력

SELECT ename, sal, comm, sal + comm
  FROM emp
  WHERE deptno = 10;

- 산술식의 컬럼값이 NULL인 경우 결과값도 NULL
- NVL함수: 컬럼값이 NULL이면 0으로 출력하는 함수

10. 비교연산자 배우기

(1) <, >, <=, >=, !=, ^=, <>, =

(ex) 월급이 1200 이하인 사원들의 이름, 월급, 직업, 부서 번호 출력

SELECT ename, sal, job, deptno
  FROM emp
  WHERE sal <= 1200;

(2) BETWEEN AND

(ex) 월급이 1000에서 3000 사이인 사원들의 이름과 월급 출력

SELECT ename, sal
  FROM emp
  WHERE sal BETWEEN 1000 AND 3000;
SELECT ename, sal
  FROM emp
  WHERE (sal >= 1000 AND sal <= 3000);

- BETWEEN 하한값 AND 상한값

# 월급이 1000에서 3000 사이가 아닌 사원들
SELECT ename, sal 
  FROM emp
  WHERE sal NOT BETWEEN 1000 AND 3000;
  
SELECT ename, sal
  FROM emp
  WHERE (sal < 1000 AND sal > 3000);


(ex) 1982년도에 입사한 사원들의 이름과 입사일 출력

SELECT ename, hiredate
  FROM emp
  WHERE hiredate BETWEEN '1982/01/01' AND '1982/12/31';

 

(3) LIKE

(ex) 이름의 첫 글자가 S인 사원들의 이름과 월급 출력

SELECT ename, sal
  FROM emp
  WHERE ename LIKE 'S%';

- % : 와일드 카드. 0개 이상의 임의의 문자와 일치 -> 'LIKE' 연산자와 함께 쓸 경우!

(ex) 이름 두번째 글자가 M인 사원의 이름 출력

SELECT ename
  FROM emp
  WHRERE ename LIKE '_M%';

- _ : 언더바. 한 자리수의 어떤 철자. 하나의 문자와 일치

(ex) 이름의 끝 글자가 T인 사원의 이름 출력

SELECT ename
  FROM emp
  WHERE ename LIKE '%T';


(ex) 이름에 A 포함하고 있는 사원들의 이름 출력

SELECT ename
  FROM emp
  WHERE ename LIKE '%A%';

 

(4) IS NULL

- NULL : 데이터가 할당되지 않은 상태. 알 수 없는 값. -> = 연산자로 비교 불가

# 커미션이 NULL인 사원들의 이름과 커미션 출력
SELECT ename, comm
  FROM emp
  WHERE comm IS NULL;

 

(5) IN

(ex) 직업이 salesman, analyst, manager인 사원들의 이름, 월급, 직업 출력

SELECT ename, sal, job
  FROM emp
  WHERE job IN ('SALESMAN', 'ANALYST', 'MANAGER');

- = 연산자는 하나의 값만 조회, IN 연산자는 여러 리스트의 값 조회 가능

11. 논리 연산자 배우기 (AND, OR, NOT)

(ex) 직업이 SALESMAN이고 월급이 1200 이상인 사원들의 이름, 월급 직업

SELECT ename, sal, job
  FROM emp
  WHERE job = 'SALESMAN' AND sal >= 1200;

 

'Database > SQL' 카테고리의 다른 글

[Lecture] 2. DBMS 개념과 아키텍쳐  (0) 2022.03.21
[Lecture] 1. 데이터베이스 시스템  (0) 2022.03.21
[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11

[수업출처] 숙명여자대학교 IT공학전공 박영호 교수님 수업 '데이터베이스'

 

1. 데이터 모델

- 모델: 실체를 가져올 수 없기 때문에, 핵심 특성을 담은 모형을 등장시켜 실체를 설명하기 위한 것

- 어떤 데이터에 대한 개념적, 형식적 표현

- original 대상을 다음 3가지로 구분하여 설명

1) 구조 structure (ex. DML 정의: CREATE SCHEMA ... )

2) 연산 operation (구조를 운용하기 위함. SELECT, DELETE, INSERT, UPDATE ...)

3) 제약조건 constraint (개념들의 집합)

 

종류

1) Conceptual Data Models (high-level, semantic-level) 개념적 데이터 모델

- 데이터를 높은 수준이나 의미적 수준으로 표현하는 데이터 모델

- ex) '학생' 테이블의 구성요소 - 나이, 주소 등

→ Database Schema

→ 데이터 베이스를 설계한다는 것 = Schema를 설계하는 것

 

2) Physical Data Models (low-level, internal-level) 물리적 데이터 모델

- 데이터를 낮은 수준이나 물리적 수준으로 표현하는 데이터 모델

- 데이터가 디스크에 어떻게 저장되는 것이 효과적인지 설명하기 위한 구현 수준의 실질적 데이터 모델

- ex) '나이'는 4byte 정수로, B-tree index 구축하자 등을 정하는 일

 

3) Implementation Data Models (record-oriented, representational)

- 상위 두 모델의 중간 레벨로, 상용 제품의 구현 시 적용되는 데이터 모델

 

4) Self-Describing Data Model

- data value를 가진 data들의 설명을 결합한 데이터 모델

- ex) XML, NoSQL systems

 

2. Schema vs Instance

1) Schema (구조, 뼈대)

- 데이터베이스에 대한 설명서

- 데이터베이스 구조 & 제약조건들에 대한 설명 포함

- 데이터베이스 카탈로그에 존재

 

- Schema Diagram 스키마 도면: 데이터베이스 스키마를 diagram 형식으로 표현한 것 (ex. E-R diagram)

- 테이블들을 구성하고 있는 속성들을 그림으로 표현한 데이터 설계 도면

 

- 스키마 구성: 스키마의 구성요소 또는 스키마에 포함된 객체 

 

2) Database State

- 특정 시점에 데이터베이스에 저장된 실제 데이터

- 데이터베이스의 모든 데이터 집합이 포함됨

= database instance (= occurrence, snapshot)

    - instance는 개별 데이터베이스 구성요소에도 적용됨

    - ex) record instance, table instance, entity instance

 

3) 비교

- 스키마는 자주 변하지 않음

- 인스턴스는 (state) 데이터베이스가 갱신될 때마다 변함

- 스키마 = intention

- 인스턴스 = extension

- ex) 학생 릴레이션의 나이는 '22', 주소는 '강남구 논현동', 학년은 '3' 일 때, 

나이, 주소, 학년schema,

'22', '강남구 논현동', '3'Instance

 

'Database > SQL' 카테고리의 다른 글

[SQL] CH01 - 15  (2) 2022.11.17
[Lecture] 1. 데이터베이스 시스템  (0) 2022.03.21
[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11

[수업출처] 숙명여자대학교 IT공학전공 박영호 교수님 수업 '데이터베이스'

 

1. 데이터베이스 시스템 개략도

사용자 질의(Query) ↔ DB 컴퓨터 [질의 언어 처리(Query Processor) ↔ DBMS 관리기 ↔ 데이터베이스] → 결과 도출

 

2. 스키마와 인스턴스

- 스키마 schema: 데이터베이스에 저장되는 데이터의 구조 및 유형을 정의하는 것. 데이터베이스의 전체적인 정의

    → 메타데이터

    → DDL로 정의

    → DBMS 관리 하의 디스크 카탈로그에 존재

 

- 인스턴스 instance: 데이터베이스에 저장되는 실제 값

    → 저장데이터

    → 하드 디스크의 DB 내에 존재

 

 

3. 기본 정의

- Database: 연관된 데이터들의 모음

- Data: 기록될 수 있는, 어떤 묵시적인 의미를 가지고 있는 알려진 사실들

- Mini-world: Real-world의 부분. 실제 세상 데이터 중에 특정 일부분을 데이터베이스에 저장하고, 이를 Mini-world라 한다.

- Database Management System(DBMS): 데이터베이스들을 관리하는 소프트웨어 패키지

 

4. 데이터를 저장하는 두가지 방법

1) 파일 시스템에 저장

    - 파일에 데이터 저장

    - 순차적, 비순차적 파일 구조를 가짐

    - 데이터에 대한 정보는 파일 자체에 내장되어 있음. 일단 파일을 읽어야 함.

 

2) 데이터베이스 시스템에 저장

    - 파일에 데이터 저장

    - 파일에 대한 설명서인 '스키마'를 가짐. 스키마는 카탈로그에 존재

    - 스키마를 통해 데이터 구조를 먼저 파악하고 데이터에 접근

 

가장 큰 차이점: 카탈로그의 존재 유무

 

5. 데이터베이스 기술의 주요 특징

1) 자기 기술성 Self-contained nature

    - 카탈로그라는 메타 데이터가 있어 데이터베이스를 설명해줌

    - 메타 데이터는 하나의 DBMS SW를 다른 데이터 환경인 다른 DB들에서도 동작하게 해주는 다리 역할을 함

    - DB가 변경되는 경우 DBMS는 메타 데이터만 바꾸어주면 됨

 

2) 프로그램과 데이터 간의 분리 Insulation 

    - program-data independence

    - 서로 독립적임

    - 데이터의 format을 바꾸어도 프로그램은 바뀌지 않음

 

3) 데이터 추상화 Data Abstraction

    - 일반 사용자는 데이터의 위치 location까지 정확히 알 필요 없음

    - 데이터 모델은 그 detail을 감추고자 할 때 사용되며, 데이터베이스의 'conceptual view'만 사용자들에게 보여주는 기능

 

4) 같은 데이터에 대한 다중 관점 Multiple View 지원

    - 같은 데이터에 대해 얻고자 하는 관점이 모두 다름

    - 각 사용자는 그 DB의 각기 다른 view만을 보고자 함 → 원하는 데이터만 기술해줌

 

5) 추가적인 특징

    - data storage 내의 중복 redundancy를 최대한 없애고, 개발과 유지 보수 노력 줄여줌

    - multiple user간의 데이터 공유

    - 다중 동시 접근에 대한 동시성 제어 concurrency control

    - 데이터의 unauthorized access 막음 -> view

    - 다양한 클래스의 사용자들을 위한 다중 interface 지원

    - 데이터 간의 복잡한 관계성 표현 -> entitiy, relationship

    - 제약사항을 넣어두면 DB는 항상 무결성 integrity constraint를 확인

    - backup, recovery services 제공

    - standards 유지

    - 프로그램에 영향 없이 자료구조 변경 가능

    - 응용 개발 시간 줄여줌

    - 항상 최신 정보를 동시에 얻을 수 있음 (Availability of up-to-date information)

    - 대형 시스템을 만들 때에도 DBMS로 다룰 수 있음 (Economies of scale)

 

6. Database Users

1) Workers on the scene

    - 방대한 데이터베이스를 매일 사용하는 사람들

    - Database administrators (DBAs): 설계된 데이터베이스 관리하는 책임자

    - Database designers: 데이터베이스 설계자

    - System analysts/application programmers: 응용 프로그래머 ('caned transactions' 구현)

    - End users

        - querying, updating, report 생성을 위해 데이터 베이스 사용

        - casual end users데이터베이스를 종종 사용하지만, DB에 접근할 때는 관리자등의 새로운 정보가 필요

        - Parametric end users: DBMS에 대한 지식은 없지만 일상 생활에서 데이터베이스 자주 사용. 'canned transactions' 사용

 

2) Workers behind the scene

    - DBMS SW 패키지를 만들거나 design, development, operation, maintenance하는 프로그램 전문가들

    - DBMS designers and implementers: DBMS SW 패키지 설계 및 구현

    - Tool developers: DBMS SW 사용을 돕는 도구 설계 및 구현 - design tool, performance tool, special interfaces, etc.

    - Operators and maintenance person: 데이터베이스 시스템의 하드웨어 및 소프트웨어 환경 실행 및 유지 관리 작업

  

7. DBMS를 사용하지 않는 경우

    - 초기 구입 비용이 크고, 추가적인 하드웨어가 필요한 경우가 있음

    - generality, security, recovery, integrity, concurrency control을 지원하기 위해 연산 overhead 비용이 들 수 있음

    - 데이터베이스가 간결하고, 잘 정의되어 있으며 자주 구조가 변하는 경우엔 DBMS를 사용할 필요가 없음

    - 혼자 사용하는 경우에도 사용할 필요 없음

'Database > SQL' 카테고리의 다른 글

[SQL] CH01 - 15  (2) 2022.11.17
[Lecture] 2. DBMS 개념과 아키텍쳐  (0) 2022.03.21
[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11

SQL 실행 과정

 

1. SQL 파싱 (PARSING)

SQL 파싱은

 

1) SQL 문장에 문법적 오류가 없는지 검사 (Syntax 검사)

2) 의미상 오류가 없는지 검사 (Semantic 검사)

3) 사용자가 발생한 SQL과 그 실행계획시 라이브러리캐시(프로시저캐시)에 캐싱되어 있는지 확인

4) 캐싱되어 있다면 소프트파싱, 캐싱되어있지 않다면 하드파싱

 

으로 구성된다.

 

* 소프트파싱: SQL과 실행계획을 캐시에서 찾아 곧바로 실행단계로 넘어가는 경우

* 하드파싱: SQL과 실행계획을 캐시에서 찾지 못해 최적화 과정을 거치고나서 실행단계로 넘어가는 경우

 

* 라이브러리캐시는 해시구조로 엔진에서 관리된다. SQL마다 해시값에 따라 여러 해시 버킷으로 나뉘며 저장되고, SQL을 찾을 때는 SQL 문장을 해시 함수에 적용하여 반환되는 해시값을 이용해서 해시 버킷을 탐색한다.

 

2. 규칙기반 옵티마이저 (RBO)

실행계획을 정해진 룰에 따라 만든다.

룰은 데이터베이스 엔진마다 여러 가지가 있다.

 

예를 들어서 오라클의 RBO는 다음과 같다.

순위 액세스 경로
1 Single Row by Rowid
2 Single Row by Cluster Join
3 Single Row by Hash Cluster Key with Unique or Primary Key
4 Single Row by Unique or Primary Key
5 Clustered Join
6 Hash Cluster Key
7 Indexed Cluster Key
8 Composite Index
9 Single-Column Indexes
10 Bounded Range Search on Indexed Columns
11 Unbounded Range Search on Indexed Columns
12 Sort Merge Join
13 MAX or MIN of Indexed Column
14 ORDER BY on Indexed Column
15 Full Table Scan

 

자세한 과정은 잘 모르겠지만, 크게 보면 엑세스를 할 때에 인덱스를 이용하느냐, 전체 테이블을 스캔하느냐 등으로 나눌 수 있다. 1번부터 순서대로 맞는 경우에 진행하며, 아래로 갈수록 data가 흐트러져서 저장되기 때문에 비용이 많이 든다.

그리고 요즘에는 대부분 RBO보다 CBO를 이용한다.

 

3. 비용기반 옵티마이저 (CBO)

비용을 기반으로 최적화를 수행하는 방식이다. 이때 비용이란 쿼리를 수행하는데 소요되는 일의 양 또는 시간 예상치이다.

 

딕셔너리에서 테이블과 인덱스를 통해 레코드 개수, 블록 개수, 평균 행 길이, 칼럼 값의 수, 칼럼 값 분포, 인덱스 높이, 클러스터링 팩터 등의 통계값을 기반으로 비용을 예측하는 방식이다. 이 예측된 비용에 따라 최적의 실행 계획을 도출한다. 최근에는 추가적으로 하드웨어적 특성을 반영한 시스템 통계정보 (CPU 속도, 디스크 I/O 속도 등)까지 이용한다.

 

4. SQL 실행계획

실행 계획은 SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미한다. 즉, SQL을 어떤 순서로 어떻게 진행할 지 결정한다는 것이다.

 

실행 계획의 구성요소는 다음 다섯 가지가 있다.

  • 조인 순서 (Join Order) : JOIN 수행에서 어떤 테이블이 먼저 조회되는가
  • 조인 기법 (Join Method) : loop, merge, sorting 등
  • 액세스 기법 (Access Method) : Index / Full table 등
  • 최적화 정보 (Optimization Information) : 알고리즘
  • 연산 (Operation) : 크다, 작다, 함수, MAX, MIN 등

 

5. INDEX

INDEX는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조이다.

 

CREATE INDEX IDX_### ON db, table (column);

ALTER TABLE db.table ADD INDEX IDX_###;

 

두 코드 모두 column에 대한 INDEX를 생성하는 코드이다.

 

ALTER TABLE db.table DROP INDEX IDX_###;

 

테이블에 있는 인덱스를 삭제하는 코드이다.

 

EXPLAIN SELECT * FROM db.table;

 

실행 계획을 확인하는 코드이다.

 

예제) 

DESC kaggle.titanic;

 

EXPLAIN SELECT * FROM kaggle.titanic WHERE `Age` = 23;

>> Age가 23인 데이터를 찾기 위해 418개의 rows를 모두 검색하는 것이 플랜임을 알 수 있다.

 

[INDEX 생성 후]

 

DESC kaggle.titanic;

Age에 인덱스가 생성된 것을 확인할 수 있다.

 

EXPLAIN SELECT * FROM kaggle.titanic WHERE `Age` = 23;

>> IDX_AGE를 사용해서 reference를 통해서 쿼리를 실행하는 것이 플랜임을 알 수 있다.

>> 데이터를 얻기 위해서 11개의 row만 검색하면 된다.

'Database > SQL' 카테고리의 다른 글

[Lecture] 2. DBMS 개념과 아키텍쳐  (0) 2022.03.21
[Lecture] 1. 데이터베이스 시스템  (0) 2022.03.21
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11
[MySQL] University DB 예제  (0) 2021.01.10

1. 계정 생성

CREATE USER ' ----- '@' host ' IDENTIFIED BY 'password';

 

host에게 password로 접근할 수 있는 계정을 생성해주는 것이다.

% 은 '모든 값'을 의미한다.

 

2. 계정 생성 확인

SELECT HOST, USER FROM MYSQL.USER;

 

STUDENT를 포함한 이름을 가진 유저를 호출한다는 의미이고, 위와 같이 세 개의 계정이 생성 되어있음을 알 수 있다.

 

3. 권한 부여

GRANT ALL ON database.* TO ' ----- '@' host ';

 

해당 계정에게 어떤 데이터베이스의 특정 클래스에 대한 권한을 부여하는 것이다. 

 

GRANT ALL 은 "모든" 권한을 부여한다는 의미이고, university.* 은 university 데이터베이스의 모든 테이블에 권한을 부여한다는 의미이다.

GRANT SELECT는 SELECT 함수만 실행할 수 있도록 권한을 부여한다는 의미이고, university.addresses는 university데이터베이스의 addresses 컬럼에만 접근할 수 있도록 권한을 부여한다는 의미이다.

 

4. 권한 확인

SHOW GRANTS FOR ' ----- '@' host ';

 

계정에 부여된 권한을 확인하는 코드이다.

 

 

5. 권한 취소

REVOKE functions ON class.table FROM ' ----- '@' host ';

 

해당 계정에 부여되었던 권한을 취소하는 코드이다. 모든 권한을 취소할 수도 있고, 일부 함수에 대한 권한만 취소할 수도 있다.

 

그런데 이 부분은 계속 오류가 떠서 더 알아보고 시도해봐야겠다.

 

6. 계정 삭제

DROP USER ' ----- '@' host ';

 

'STUDENT'@'localhost' 계정이 삭제되었음을 알 수 있다.

'Database > SQL' 카테고리의 다른 글

[Lecture] 1. 데이터베이스 시스템  (0) 2022.03.21
[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11
[MySQL] University DB 예제  (0) 2021.01.10
[MySQL] MySQL 설치하기  (0) 2021.01.10

 

create database kaggle;

use kaggle;

CREATE TABLE `org_test_import` (
  `PassengerId` int NULL,
  `Pclass` int NULL,
  `Name` text,
  `Sex` text,
  `Age` text,
  `SibSp` int  NULL,
  `Parch` int  NULL,
  `Ticket` text,
  `Fare` text,
  `Cabin` text,
  `Embarked` text
) ENGINE=InnoDB ; 

SELECT @@sql_mode;

set @@sql_mode = "";    

CREATE TABLE `test` (
  `PassengerId` int NULL,
  `Pclass` int NULL,
  `Name` text,
  `Sex` text,
  `Age` double,
  `SibSp` int  NULL,
  `Parch` int  NULL,
  `Ticket` text,
  `Fare` double,
  `Cabin` text,
  `Embarked` text
) ENGINE=InnoDB ;

INSERT INTO `kaggle`.`test` (
  `PassengerId`,
  `Pclass`,
  `Name`,
  `Sex`,
  `Age`,
  `SibSp`,
  `Parch`,
  `Ticket`,
  `Fare`,
  `Cabin`,
  `Embarked` )
SELECT `org_test_import`.`PassengerId`,
    `org_test_import`.`Pclass`,
    `org_test_import`.`Name`,
    `org_test_import`.`Sex`,
    `org_test_import`.`Age`,
    `org_test_import`.`SibSp`,
    `org_test_import`.`Parch`,
    `org_test_import`.`Ticket`,
    `org_test_import`.`Fare`,
    `org_test_import`.`Cabin`,
    `org_test_import`.`Embarked`
FROM `kaggle`.`org_test_import`;

select age from `org_test_import`;  

select age from `kaggle`.`test`;   

SELECT * FROM `gender_submission`;

ALTER TABLE `test` ADD PRIMARY KEY (`PassengerId`);

ALTER TABLE `gender_submission` ADD PRIMARY KEY (`PassengerId`);

ALTER TABLE `gender_submission` ADD FOREIGN KEY (`PassengerId`) REFERENCES `test` (`PassengerId`);

SELECT COUNT (*) FROM `gender_submission`;
SELECT COUNT (*) FROM `test`;
SELECT COUNT (*) FROM test A JOIN gender_submission B ON A.PassengerId = B.PassengerId;

CREATE TABLE `titanic` (
  `PassengerId` int not NULL,
  `Pclass` int NULL,
  `Name` text,
  `Sex` text,
  `Age` double,
  `SibSp` int  NULL,
  `Parch` int  NULL,
  `Ticket` text,
  `Fare` double,
  `Cabin` text,
  `Embarked` text,             
  `Survived` int ,             
  primary key (`PassengerId` )
) ENGINE=InnoDB ; 

INSERT INTO `kaggle`.`titanic` (
  `PassengerId`,
  `Pclass`,
  `Name`,
  `Sex`,
  `Age`,
  `SibSp`,
  `Parch`,
  `Ticket`,
  `Fare`,
  `Cabin`,
  `Embarked`,
  `Survived`) 
SELECT 
A.`PassengerId`,
  `Pclass`,
  `Name`,
  `Sex`,
  `Age`,
  `SibSp`,
  `Parch`,
  `Ticket`,
  `Fare`,
  `Cabin`,
  `Embarked`, 
B.`Survived`
FROM test A JOIN gender_submission B ON A.PassengerId = B.PassengerId ; 

SELECT COUNT(*) FROM `kaggle`.`titanic` ; 

SELECT * FROM `kaggle`.`titanic` ; 

SELECT MAX(`Age`) FROM `kaggle`.`titanic`;

SELECT MIN(`Age`) FROM `kaggle`.`titanic` WHERE `Age` > 0;

SELECT AVG(`Age`), COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0;

SELECT sum(`Fare`) FROM `kaggle`.`titanic`;

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY 1 ;  ##첫번째 컬럼 기준으로 오름차순 (Name)

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY 3 ;

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY `Name` DESC ;

#10개 제한된 행 조회
SELECT * FROM `kaggle`.`titaic` WHERE `Name` LIKE 'A%' LIMIT 10;   #이름이 A로 시작하는 row 10개

##`PassengerId` 유일한 값만 조회
SELECT DISTINCT `PassengerId` FROM `kaggle`.`titanic`;

SELECT DISTINCT `Sex` FROM `kaggle`.`titanic`;

SELECT `Sex`, COUNT(*) FROM `kaggle`.`titanic` GROUP BY 1;    #첫번째 컬럼을 그룹화해서 카운트

SELECT `Sex`, COUNT(*) CNT FROM `kaggle`.`titanic` GROUP BY `Sex` HAVING CNT > 200;  #count = cnt, cnt가 200이상인 그룹의 카운트 수

SELECT `Sex`, `survived`, COUNT(*) FROM `kaggle`.`titanic` GROUP BY `Sex`, `Survived` ;

##floor = 반올림
#연령 밴드별 조회
SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1; #~대 미만 승객 수

SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1 order by 1;

SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1 order by 1 desc;

SELECT floor(`Age`/10) * 10 + 10, `survived`, COUNT(*) CNT FROM `kaggle`.`titanic` 
WHERE `Age` > 0 group by 1, 1 HAVING CNT > 40 order by 1 desc, 2 desc;


#서브쿼리
SELECT * FROM `kaggle`.`titanic`
WHERE `PassengerId` IN (SELECT `PassengerId` FROM `test` WHERE `Age` = 0);  # NULL 값이었던 passengerId(age=0)를 titanic table에서 조회해라

UPDATE `kaggle`.`titanic`
SET `Age` = 30.272590361445783
WHERE `PassengerId` IN (SELECT `PassengerId` FROM `test` WHERE `Age` = 0) ;

 

이번 예제는 csv 파일을 import하여 타이타닉 데이터를 활용해보는 예제이다.

이번에 사용할 2개의 예제 데이터는 https://www.kaggle.com/c/titanic/ 에서 받을 수 있다.

(gender_submission, test)

 

 

 

 

kaggle 테이블을 만들고, 스키마에서 Tables -> Table Data Import Wizard를 누르면 csv파일을 import할 수 있다.

첫번째로 'gender_submission.csv' 파일을 import해주었다.

 

이때, 현재 sql모드가 data타입을 strict하게 설정하도록 되어있기 때문에,

Wizard로 import한 데이터파일에 NULL값이 있으면 그 값은 truncate (삭제) 된다.

두번째로 import할 'test.csv' 파일에 NULL값이 있기 때문에

이걸 고치기 위해 sql 모드를 strict하지 않게 바꿔주고, 데이터타입을 바꿔주는 테이블을 생성할 것이다.

 

코드를 살펴보겠다.

 

create database kaggle; 
use kaggle;

kaggle database를 생성하고, 이용하겠다는 뜻이다.

 

이후 위에 있는 사진처럼 이 데이터베이스에 'gender_submission.csv'파일을 import 했다.

import할 때에 'gender_submission'이라는 테이블을 함께 형성해서 저장했다.

 

CREATE TABLE `org_test_import` (
`PassengerId` int NULL,   
`Pclass` int NULL,   
`Name` text,   
`Sex` text,   
`Age` text,   
`SibSp` int  NULL,   
`Parch` int  NULL,   
`Ticket` text,   
`Fare` text,   
`Cabin` text,   
`Embarked` text ) ENGINE=InnoDB ; 

이 테이블은 두번째로 import할 'test.csv'파일의 값을 저장할 테이블이다. 

현재 sql모드가 데이터를 strict하게 저장하도록 설정되어있기 때문에, 'text.csv' 파일에서 double타입의 'age' 값에 NULL값이 있으면 Wizard로 import 할 때 테이블이 truncate된다. (삭제된다)

 

따라서, 우선 'age'와 'fare'의 데이터타입을 text로 변경한 테이블 'org_test_import'에 파일을 import하고, 

이후 다시 원래대로 데이터 타입을 바꾼 테이블('test')에 값을 저장해주도록 하겠다.

 

SELECT @@sql_mode;  

현재 sql_mode를 알려준다.

 

strict

 

set @@sql_mode = "" ;

또한, sql_mode를 strict하지 않게 바꿔주었다.

 

바꿔준 뒤 select

 

CREATE TABLE `test` (
  `PassengerId` int NULL,
  `Pclass` int NULL,
  `Name` text,
  `Sex` text,
  `Age` double,
  `SibSp` int  NULL,
  `Parch` int  NULL,
  `Ticket` text,
  `Fare` double,
  `Cabin` text,
  `Embarked` text
) ENGINE=InnoDB ; 

 

이 테이블이 import한 'test.csv'파일을 옮겨 담을 테이블이다.

'age'와 'fare'의 도메인을 원래처럼 double로 바꿔주었다.

 

INSERT INTO `kaggle`.`test`
(`PassengerId`,
`Pclass`,
`Name`,
`Sex`,
`Age`,
`SibSp`,
`Parch`,
`Ticket`,
`Fare`,
`Cabin`,
`Embarked`)
SELECT `org_test_import`.`PassengerId`,
    `org_test_import`.`Pclass`,
    `org_test_import`.`Name`,
    `org_test_import`.`Sex`,
    `org_test_import`.`Age`,
    `org_test_import`.`SibSp`,
    `org_test_import`.`Parch`,
    `org_test_import`.`Ticket`,
    `org_test_import`.`Fare`,
    `org_test_import`.`Cabin`,
    `org_test_import`.`Embarked`
FROM `kaggle`.`org_test_import`;

 

'org_test_import'에 저장된 모든 값을 'test'테이블에 삽입하는 코드이다.

 

이제 NULL값이 있던 'age'값을 각각의 테이블에서 select해보겠다.

 

select age from `org_test_import` ;       #NULL값이 있음  (text이기 때문)

 

 

select age from `kaggle`.`test` ;          #NULL -> 0   (double이기 때문)

 

 

test파일에 저장된 'age' 값에는 NULL값이 없고 그 값들이 모두 0으로 바뀐 것을 볼 수 있다.

 

NULL값이 있는 데이터 파일을 wizard로 import할 때에는 위와 같이 도메인을 text로 바꾼 테이블을 만들어서 import한 뒤, 다시 옮겨주는 방법을 사용하면 된다.

 

SELECT * FROM `gender_submission` ;

'gender_submission' 테이블의 값을 보여준다.

 

AlTER TABLE `test` ADD PRIMARY KEY ( `PassengerId` ) ; 

'test' 테이블의 기본키를 'PassengerId'로 바꿔주는 코드이다.

 

AlTER TABLE `gender_submission` ADD PRIMARY KEY ( `PassengerId` ) ; 

'gender_submission' 테이블의 기본키를 'PassengerId'로 설정하는 코드이다.

 

AlTER TABLE `gender_submission` ADD FOREIGN KEY ( `PassengerId` ) REFERENCES `test` ( `PassengerId` ) ; 

'gender_submission' 테이블의 외래키를 'PassengerId'로 설정하며, 'test' 테이블의 'PassengerId' 값을 참조하겠다는 코드이다.

 

SELECT COUNT(*) FROM `gender_submission` ; 
SELECT COUNT(*) FROM `test` ;

count( ) 는 투플의 개수를 세는 함수이다. FROM - 뒤에 WHERE - 을 붙여 조건을 걸 수 있다.

정확한 표현인지는 모르겠지만..

예제에 나온 SELECT COUNT(*) FROM 'gender_submission'; 은 'gender_submission' 테이블에 있는 전체 투플 수 (rows)를 count해준다.

 

SELECT  COUNT(*) FROM test A JOIN gender_submission B ON A.PassengerId = B.PassengerId ;

'test' 테이블의 'PassengerId'와 'gender_submission'테이블의 'PassengerId'가 같을 경우에, 'test'테이블과 'gender_submission'테이블을 결합한다는 의미이다. 그리고, 그 결합한 것의 투플 수 (row 수)를 세는 코드이다. 

두 테이블 다 418개의 투플을 갖고 있기 때문에, 이 결과도 418이 나온다.

 

 

CREATE TABLE `titanic` (
  `PassengerId` int not NULL,
  `Pclass` int NULL,
  `Name` text,
  `Sex` text,
  `Age` double,
  `SibSp` int  NULL,
  `Parch` int  NULL,
  `Ticket` text,
  `Fare` double,
  `Cabin` text,
  `Embarked` text,                   

  `Survived` int ,                       
  primary key (`PassengerId` )
) ENGINE=InnoDB; 

'titanic'이라는 테이블을 생성했다. 이 테이블에는 'test'테이블과 'gender_submission'테이블을 결합하여 저장할 것이다.

 

INSERT INTO `kaggle`.`titanic`

(`PassengerId`,
 `Pclass`,
 `Name`,
 `Sex`,
 `Age`,
 `SibSp`,
 `Parch`,
 `Ticket`,
 `Fare`,
 `Cabin`,
 `Embarked`,
 `Survived`) 
SELECT 
A.`PassengerId`,
   `Pclass`,
   `Name`,
   `Sex`,
   `Age`,
   `SibSp`,
   `Parch`,
   `Ticket`,
   `Fare`,
   `Cabin`,
   `Embarked`, 
B.`Survived`
FROM test A JOIN gender_submission B ON A.PassengerId = B.PassengerId ;

 

insert into, select, from join on 함수를 이용하여,

'test'테이블의 PassengerId값과 'gender_submission'테이블의 PassengerId값이 같을 경우,

두 테이블을 결합하여 각각의 값들을 'titanic' 테이블에 저장해 하나의 테이블로 만드는 것이다.

 

SELECT COUNT(*) FROM `kaggle`.`titanic` ; 

'titanic' 테이블의 투플 수를 보여준다.

'gender_submission'의 'PassengerId'값은 외래키로, 'test' 테이블의 값을 참조한 것이기 때문에 모든 값이 같다.

따라서 모든 투플이 결합하여 저장되었기 때문에 count 수는 동일하게 418이다.

 

 

SELECT * FROM `kaggle`.`titanic` ; 

'titanic' 테이블의 모든 값을 보여준다.

 

 

SELECT MAX(`Age`) FROM `kaggle`.`titanic`;

MAX함수는 이 속성에서 가장 큰 값을 보여준다.

 

 

SELECT MIN(`Age`) FROM `kaggle`.`titanic` WHERE `Age` > 0;

MIN함수는 반대로 이 속성에서 가장 크기가 작은 값을 보여준다.

WHERE은 조건문 느낌으로, 'Age'값이 0보다 큰 범위에서 가장 작은 값을 보여달라는 의미이다.

NULL값이 0으로 변환되었기 때문에 이 조건을 추가한 것이다.

 

아마 개월 수로 따져서 이러한 값이 들어가있는 것 같다.

 

SELECT AVG(`Age`), COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0;

AVG는 평균을 보여주는 값이다. 

COUNT는 뒤에 WHERE `Age` > 0 의 조건이 붙었기 때문에 'Age' 값이 0보다 큰 투플의 개수를 알려준다.

 

 

SELECT sum(`Fare`) FROM `kaggle`.`titanic`;

sum은 해당 속성의 투플 값들을 모두 더한 값을 반환한다.

 

 

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY 1 ;  

ORDER BY 1은 SELECT 뒤에 나열된 4개의 속성들 중 첫번째 속성을 기준으로 오름차순 정렬하여 반환하라는 의미이다.

 

name 기준으로 오름차순 정렬된 것을 볼 수 있다

 

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY 3 ;

마찬가지로 3번째 속성인 'Sex'를 기준으로 오름차순 정렬하라는 의미이다.

 

sex 기준으로 오름차순 정렬된 것을 볼 수 있다

 

SELECT `Name`, `Pclass`, `Sex`, `Age` FROM `kaggle`.`titanic` ORDER BY `Name` DESC ;

ORDER BY - DESC는 해당 속성 기준으로 내림차순 정렬하라는 의미이다.

그리고 ORDER BY 뒤에 숫자보다는 이와 같이 속성명을 직접 써주는 것이 더욱 직관적이다.

 

name 기준으로 내림차순 정렬된 것을 볼 수 있다

 

SELECT * FROM `kaggle`.`titanic` WHERE `Name` LIKE 'A%' LIMIT 10; 

LIKE 'A%' 은 'Name' 값들 중에서 A로 시작하는 값을 반환하라는 조건이다.

LIMIT 10은 그 중에서 상위 10개만 반환하라는 조건이다. 아마 조건에 대한 오름차순 정렬 후 10개인 것 같다.

 

 

SELECT DISTINCT `PassengerId` FROM `kaggle`.`titanic`;

DISTINCT 는 해당 속성의 값들 중 유일한 값만 조회하는 함수이다.

'PassengerId'의 경우 기본키로, 모든 투플이 유일하게 갖는 값이기 때문에 모든 값이 반환된다.

 

 

SELECT DISTINCT `Sex` FROM `kaggle`.`titanic`;

마찬가지로 'Sex' 의 값들 중 유일한 값들만 반환한다. 

이 경우 투플 값이 male과 female 두 가지로 나뉘기 때문에 두개의 값만 반환된다.

 

 

SELECT `Sex`, COUNT(*) FROM `kaggle`.`titanic` GROUP BY 1;  

GROUP BY는 해당 속성 값들을 그룹화하는 함수이다. 이 경우 'Sex'는 male과 female의 두개의 그룹으로 나뉠 것이다.

여기에 COUNT함수를 적용하면, 각각의 그룹에 속하는 투플 수를 보여준다.

 

 

SELECT `Sex`, COUNT(*) CNT FROM `kaggle`.`titanic` GROUP BY `Sex` HAVING CNT > 200;  

위의 코드처럼 'Sex' 속성을 그룹화하여 count한 뒤, HAVING (조건) 을 이용해서 count값이 200보다 큰 값만 출력되도록 하는 코드이다.

count값을 CNT로 지정해서 HAVING 조건을 이용한 것이 특징이다.

위의 결과를 보면 male은 count값이 266, female은 152이기 때문에 male의 값만 출력되었다.

 

 

SELECT `Sex`, `survived`, COUNT(*) FROM `kaggle`.`titanic` GROUP BY `Sex`, `Survived` ;

'Sex' 속성과 'survived' 속성을 각각 그룹화하여 count값을 출력하는 코드이다.

 

이 값을 보면 남자는 모두 생존하지 못했고, 여자는 모두 생존했음을 알 수 있다. 

 

 

SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1; 

floor반올림을 해주는 함수이다. 연령대별로 몇 명의 사람이 있는지 알아보기 위해서 'Age'를 10으로 나눈 값을 반올림하고, 10을 곱한 뒤, 0~9의 값이 있기 때문에 10을 더해준다. 그러면 이 값 미만의 사람들이 몇 명있는지 알아볼 수 있다.

 

 

SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1 order by 1;

위의 값들을 오름차순으로 정렬하는 코드이다.

 

 

SELECT floor(`Age`/10) * 10 + 10, COUNT(*) FROM `kaggle`.`titanic` WHERE `Age` > 0 group by 1 order by 1 desc;

위의 값들을 내림차순으로 정렬하는 코드이다.

 

 

SELECT floor(`Age`/10) * 10 + 10, `survived`, COUNT(*) CNT FROM `kaggle`.`titanic` 
WHERE `Age` > 0 group by 1, 1 HAVING CNT > 40 order by 1 desc, 2 desc;

위의 코드처럼 'Age'를 연령대 별로 나누고, 그 중 count값이 40보다 큰 값에 대해 'Age' 값과 'survived' 값을 각각 내림차순으로 정렬하는 코드이다.

 

 

 

#서브쿼리: 하나의 SQL문 안에 들어있는 또 다른 SQL문(쿼리)! 괄호( )로 나타낸다.

#서브쿼리가 조건절이 됨. 결과에 해당하는 데이터를 조건으로 해서 메인쿼리 실행.

 

SELECT * FROM `kaggle`.`titanic`
WHERE `PassengerId` IN (SELECT `PassengerId` FROM `test` WHERE `Age` = 0); 

서브쿼리// 'test' 테이블에서 'Age'값이 0인 'PassengerId'를 찾는다.

메인쿼리// 그 'PassengerId'를 가진 값의 모든 데이터를 출력한다. ('PassengerId'가 JOIN으로 연결되어있기 때문에 같은 값임)

 

 

 

UPDATE `kaggle`.`titanic`
SET `Age` = 30.272590361445783
WHERE `PassengerId` IN (SELECT `PassengerId` FROM `test` WHERE `Age` = 0) ;

위의 코드대로 'Age' 값이 0인 데이터를 찾아서 그 값들의 'Age' 값을 평균인 30.272590361445783로 업데이트하는 코드이다.

업데이트한 후 위의 코드를 다시 실행시켜보면 'Age' 값이 모두 변경된 것을 볼 수 있다.

위의 코드는 'test' 테이블에서 'Age' 값이 0인 투플을 찾은 것이기 때문에 'titanic' 테이블에서 값을 변경한 뒤 다시 확인하기에 좋았다.

 

 

'Database > SQL' 카테고리의 다른 글

[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] University DB 예제  (0) 2021.01.10
[MySQL] MySQL 설치하기  (0) 2021.01.10
[MySQL] 데이터베이스 개념  (0) 2021.01.10
CREATE DATABASE `university`;

SHOW databases;

USE `university`;

#DROP TABLE `university`.`student`;
CREATE TABLE `university`.`student`(           # ` ` 은 해도 되고 안해도 되는 것 같다. 속성도.
  `student_id` int unsigned NOT NULL ,
  `name` varchar(20) NOT NULL ,
  `address` varchar(100) NULL ,
  `birth_date` char(8) NULL ,
  `major_id` smallint NULL ,
  `enterance_year` smallint NULL ,
  `leave_yn` bit NULL default 0;
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`student_id`)
) ENGINE=InnoDB;

INSERT INTO `university`.`student`
(student_id, name, address, birth_date, major_id, enterance_year, leave_yn)
VALUES
(2016001, '정소정', '서울시 서초구 방배동 911-1', '19971101', 111, 2016, 0),
(2017053,'성민경','경상북도 대구 수성구 삼익 1-1','19980412',111,2017,1),
(2018111,'노규희','충청남도','19991204',130,2018,1),
(2017105,'박성희','강원도','19980908',130,2017,0);

select * from `university`.`student`;

select * from `university`.`student`
where student_id = 2016001;

select student_id, name from `university`.`student`
where major_id = 111;

UPDATE `university`.`student`
SET
address = '부산특별시 해운대 비치333-3',
leave_yn = 1
WHERE student_id = 2016001;

select * from university.student
where student_id = 2016001;

DELETE FROM university.student
WHERE student_id = 2016001;

select * from university.student 
where student_id = 2016001;

select * from university.student;

CREATE TABLE `university`.`class` (
  `class_id` int unsigned NOT NULL ,
  `name` varchar(20) NOT NULL , 
  `professor_id` int NOT NULL , 
  `major_id` smallint NULL ,
  `duration` smallint NULL ,
  `type` tinyint NULL ,
  `start_time` char(2) NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (class_id)
  ) ENGINE = InnoDB;
  
SHOW TABLES;

SHOW CREATE TABLE `university`.`class`;

select * from `university`.`class`;

DESC `university`.`class`;

INSERT INTO `university`.`class`
(class_id, name, professor_id, major_id, duration, type, start_time)
VALUES
(10000, '데이터베이스', 10001, 111, 3, 1, '13'),
(20001, '물리기초1', 20011, 111, 1, 2, '09'),
(30002, '사회학개요', 30001, 120, 2, 3, '15'),
(50003, '통계학1', 50001, 130, 3, 4, '10');

CREATE TABLE `university`.`registerClass` (
  student_id int unsigned NOT NULL ,
  class_id int unsigned NOT NULL ,
  last_update timestamp NOT NULL DEFAULT CURRNET_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (student_id, class_id) ,
  FOREIGN KEY (student_id) REFERENCES `university`.`student` (student_id) ,
  FOREIGN KEY (class_id) REFERENCES `university`.`class` (class_id)
  ) ENGINE=InnoDB;
  
INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2018111, 10000), (2018111, 5003), (2018111, 30002);

INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2017105, 20001), (2017105, 30002), (2017105, 50003);

SELECT * FROM `university`.`registerClass`;

INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2017053, 10000), (2017053, 50003);

  #INSERT INTO `university`.`registerClass`
  #(student_id, class_id)
  #VALUES
  #(2017053, 45003);

SELECT S.NAME, C.NAME, R.last_update
FROM student S join registerClass R on S.student_id = R.student_id
join class C on R.class_id = C.class_id
where S.student_id = 2017053;

SELECT S.NAME, C.NAME, R.last_update
FROM student S join registerClass R on S.student_id = R.student_id
join class C on R.class_id = C.class_id
where S.student_id = 2018111;

SELECT S.NAME, C.NAME, R.last_update
FROM student S join registerClass R on S.student_id = R.student_id
join class C on R.class_id = C.class_id
where S.student_id = 2017105;

 

 

CREATE DATABASE `university`;

`university`라는 데이터베이스를 생성한다.

 

SHOW databases;

현재 생성되어있는 데이터베이스들을 보여준다.

 

 

USE `university`;

`university` 데이터베이스를 이용할 것임을 선언한다.

 

#DROP TABLE `university`.`student`;

DROP TABLE은 이미 존재하는 이 테이블을 삭제하겠다는 의미이다.

 

CREATE TABLE `university`.`student`(          
  `student_id` int unsigned NOT NULL ,
  `name` varchar(20) NOT NULL ,
  `address` varchar(100) NULL ,
  `birth_date` char(8) NULL ,
  `major_id` smallint NULL ,
  `enterance_year` smallint NULL ,
  `leave_yn` bit NULL default 0;
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`student_id`)
ENGINE=InnoDB;

 

university DB 안에 'student'라는 테이블을 생성한 것이다.

 

student_id, name, address, birth_date, major_id, enterance_year, leave_yn, last_update가 속성이다.

속성 이름 뒤에 도메인을 적어준다. 도메인은 속성의 특성에 맞는 자료형이다.

 

unsigned는 부호가 없다는 뜻이다. 예를 들어 tinyint의 경우, (signed) tinyint의 범위는 -128~127이며, 

unsigned tinyint의 범위는 0~255이다.

 

NULL, NOT NULL은 NULL값이 될 수 있냐 없냐를 정해주는 것이다. 예제의 경우 학번과 이름은 NULL값이 될 수 없도록 했다.

 

varchar( )의 괄호 속 숫자는 최대로 들어갈 수 있는 byte 값이다.

 

`leave_yn`는 휴학여부 속성으로 0과 1로 구분되고, 투플값이 없을 경우 default 값은 0이 들어가도록 했다.

 

`last_update`는 업데이트 시각으로, 직접 적는 것이 아니라 CURRNET_TIMESTAMP를 이용하여 자동으로 저장된다.

이 테이블의 기본키는 `student_id`로, 학번만 가지고도 투플들을 구분할 수 있다는 뜻이다.

 

MySQL의 스토리지 엔진으로 주로 MyISAM과 InnoDB가 사용된다.

스토리지 엔진은 데이터베이스 엔진이라고도 불리며, RDBMS가 데이터베이스에 대해 데이터를 삽입, 추출, 업데이트, 삭제하는 데 사용하는 기본 소프트웨어 컴포넌트이다. 

MyISAM은 항상 테이블에 ROW COUNT를 가지고 있기 때문에 SELECT 명령 시 속도가 빠르고, '풀텍스트 인덱스'를 지원하는데, 이는 자연 언어를 이용해 검색할 수 있는 특별한 인덱스로 모든 데이터 문자열의 단어를 저장한다는 것이다. 이때문에 Read only 기능이 많은 서비스일수록 효율적으로 사용할 수 있는 엔진이다. 단점으로는, row level locking을 지원하지 못해서 select, insert, update, delete 명령 시 해당 테이블 전체에 locking이 걸린다는 것이다. 그래서 갱신이 많이 필요한 경우에는 유용하지 못하다.

InnoDB는 MyISAM과 대조적인 엔진으로, 우선 row level locking이 지원된다는 장점이 있고, 트랜잭션 처리가 필요한 대용량 데이터를 다룰 때 효율적이다. 데이터의 변화가 많은 서비스에 적합하다. 또한, 유일하게 외래키를 지원하는 표준적인 스토리지 엔진이다.단점으로는, 풀텍스트 인덱스를 지원하지 않는다는 것이 있다.

 

주로 InnoDB를 많이 사용한다고 하고, 이번 예제에서도 InnoDB를 사용하였다. 

 

INSERT INTO `university`.`student`
(student_id, name, address, birth_date, major_id, enterance_year, leave_yn)
VALUES
(2016001, '정소정', '서울시 서초구 방배동 911-1', '19971101', 111, 2016, 0),
(2017053,'성민경','경상북도 대구 수성구 삼익 1-1','19980412',111,2017,1),
(2018111,'노규희','충청남도','19991204',130,2018,1),
(2017105,'박성희','강원도','19980908',130,2017,0);

 

student 테이블에 투플들을 삽입하는 코드이다. 

INSERT INTO로 속성을 한 번 나열하고, VALUES를 통해 각각의 개체들을 추가한다.

 

select * from `university`.`student`;

select from은 테이블에서 정보를 가져온다는 뜻이고, *은 테이블에 있는 모든 데이터를 가져온다는 뜻이다.

따라서 이 코드를 실행하면 university.student에 있는 4개의 투플들을 보여준다.

 

select * from `university`.`student`
where student_id = 2016001;

where은 조건의 개념으로, 이 경우에는 학번이 2016001인 투플의 모든 데이터를 가져온다는 뜻이 된다.

 

select student_id, name from `university`.`student`
where major_id = 111;

이 경우에는 selcet student_id, name 이므로, 전공번호가 111인 투플의 학번과 이름을 가져온다.

 

UPDATE `university`.`student`
SET
address = '부산특별시 해운대 비치333-3',
leave_yn = 1
WHERE student_id = 2016001;

 

update는 말 그대로 테이블을 새로운 정보로 업데이트한다는 뜻이다.

이 경우, 학번이 2016001인 투플의 주소와 휴학여부 정보를 변경하게 된다.

 

select * from university.student
where student_id = 2016001;

DELETE FROM university.student
WHERE student_id = 2016001;

select * from university.student 
where student_id = 2016001;


select from university.student;

 

select문은 마찬가지로 정보를 가져오는 코드이고,

DELETE문은 university DB의 student 테이블에서 student_id가 2016001인 투플을 삭제하는 코드이다.


CREATE TABLE `university`.`class` (
  `class_id` int unsigned NOT NULL ,
  `name` varchar(20) NOT NULL , 
  `professor_id` int NOT NULL , 
  `major_id` smallint NULL ,
  `duration` smallint NULL ,
  `type` tinyint NULL ,
  `start_time` char(2) NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (class_id)
  ) ENGINE = InnoDB;

 

두번째로 universityDB 안에 'class'라는 테이블을 생성한 것이다.

속성으로는 class_id, name, professor_id, major_id, duratin, type, start_time, last_update가 있고 각각의 도메인이 달려있다.

투플을 구분할 수 있는 기본키는 class_id이다.

 

SHOW CREATE TABLE `university`.`class`;

class 테이블에 대한 정보를 알려준다.

 

select * from `university`.`class`;

DESC `university`.`class`;

테이블의 속성과 도메인, NULL 여부 등의 모든 정보를 알려주는 DESC문이다.

 

INSERT INTO `university`.`class`
(class_id, name, professor_id, major_id, duration, type, start_time)
VALUES
(10000, '데이터베이스', 10001, 111, 3, 1, '13'),
(20001, '물리기초1', 20011, 111, 1, 2, '09'),
(30002, '사회학개요', 30001, 120, 2, 3, '15'),
(50003, '통계학1', 50001, 130, 3, 4, '10');

 

class테이블에 4개의 투플을 생성하는 코드이다. 위의 INSERT구문과 같다.

 

CREATE TABLE `university`.`registerClass` (
  `student_id` int unsigned NOT NULL ,
  `class_id` int unsigned NOT NULL ,
  `last_update` timestamp NOT NULL DEFAULT CURRNET_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
  PRIMARY KEY (student_id, class_id) ,
  FOREIGN KEY (student_id) REFERENCES `university`.`student` (student_id) ,
  FOREIGN KEY (class_id) REFERENCES `university`.`class` (class_id)
  ) ENGINE=InnoDB;

 

세번째로 registerClass 테이블을 생성하는 코드이다. 

속성으로는 student_id, class_id, last_update가 있고, 기본키는 student_id와 class_id이다.

이 테이블에서는 외래키를 사용하였는데, 외래키는 다른 테이블의 속성을 참조하는 속성이다.

student_id는 student 테이블의 student_id를 참조하였고,

class_id는 class 테이블의 class_id를 참조하였다. 그곳에서 값을 가져올 수 있다고 생각하면 될 것 같다.

 

INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2018111, 10000), (2018111, 5003), (2018111, 30002);

INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2017105, 20001), (2017105, 30002), (2017105, 50003);

SELECT * FROM `university`.`registerClass`;

INSERT INTO `university`.`registerClass`
(student_id, class_id)
VALUES
(2017053, 10000), (2017053, 50003);

 

resigterClass 테이블에 투플들을 생성하는 코드들이다.

코드를 보면 student_id와 class_id 투플값이 모두 student테이블의 student_id와 class테이블의 class_id에 있는 값들인 것을 확인할 수 있다. 외래키를 사용했기 때문이다.

 

  #INSERT INTO `university`.`registerClass`
  #(student_id, class_id)
  #VALUES
  #(2017053, 45003);

이처럼 만약 참조되는 테이블에 없는 값을 value로 입력하면 오류가 뜬다.

 

SELECT S.NAME, C.NAME, R.last_update                        #조회할 것 -> 결합할 것
FROM student S join registerClass R on S.student_id = R.student_id         #조건
join class C on R.class_id = C.class_id
where S.student_id = 2017053;

SELECT S.NAME, C.NAME, R.last_update
FROM student S join registerClass R on S.student_id = R.student_id
join class C on R.class_id = C.class_id
where S.student_id = 2018111;

SELECT S.NAME, C.NAME, R.last_update
FROM student S join registerClass R on S.student_id = R.student_id
join class C on R.class_id = C.class_id
where S.student_id = 2017105;

 

join은 릴레이션 간의 조합을 검색하는 키워드이다.

 

예를 들어, 첫번째 예시는 학번이 2017053인 학생의 이름(from S)과 수강한 과목(C), 수강신청시간(R)을 조회하는 코드이다.

우선 join 다음에 나오는 on은 두 테이블이 결합할 조건을 의미한다.

이 예제에서는 student테이블의 student_id와 registerClass테이블의 student_id가 같을 경우, 

student테이블의 name과 class테이블의 name과 registerClass테이블의 last_update를 결합한다는 의미이다.

결과는 다음과 같이 나온다.

 

 

두번째, 세번째 예제도 같은 코드이고 학번만 바꾼 예제이다.

'Database > SQL' 카테고리의 다른 글

[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11
[MySQL] MySQL 설치하기  (0) 2021.01.10
[MySQL] 데이터베이스 개념  (0) 2021.01.10

1. MySQL 

MySQL은 오라클이 관리하고 배포하는 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)이다.

매우 빠르고 유연하며 사용하기 쉽다는 특징이 있다.

C, C++, 에펠, 자바, 펄, PHP, Python 스크립트 등을 위한 응용 프로그램 인터페이스(API)를 제공한다.

일반적인 웹 개발에 주로 이용되고 있으며, 상업적으로 사용할 때에는 상업용 라이선스를 구입해야 한다.

 

2. MySQL 설치하기

구글에 저렇게 검색한다.

 

6개 중 첫 번째에 있는 페이지로 들어가면

 

이러한 페이지가 뜬다. 64bit여도 그냥 저 두 번째에 있는 것을 다운로드하면 된다.

설치 페이지가 뜨면 기본적으로 설정되어있는대로 다음을 눌러주면 된다.

 

 

MySQL 서버에 접속할 때 사용할 비밀번호를 설정해주면 된다.

쭉 그대로 진행하면 [connect to server]라고 로그인을 하는 페이지가 뜬다.

그때 설정해준 비밀번호로 로그인을 하면 된다. 또 계속 NEXT 눌러주면

 

이제 MySQL을 실행하려면 MySQK Workbench를 실행해주면 된다.

 

 

이 회색 버튼을 눌러서 처음에 비밀번호를 입력해주면 다음부터는 그냥 접속이 가능하다. (save password 체크하기!)

 

그러면 이제 

 

 

이렇게 코드를 입력할 수 있게 나올 것이다. 준비 끝(ง˙∇˙)ว

'Database > SQL' 카테고리의 다른 글

[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11
[MySQL] University DB 예제  (0) 2021.01.10
[MySQL] 데이터베이스 개념  (0) 2021.01.10

1. 데이터베이스

데이터베이스는 정보 시스템 내부에서 데이터를 저장하고 있다가 필요할 때 제공하는 역할을 담당한다.

 

정보시스템은 조직 운영에 필요한 데이터를 수집하여 저장해두었다가 필요할 때 유용한 정보를 만들어주는 수단이다.

데이터베이스는 특정 조직의 여러 사용자가 공유하여 사용할 수 있도록 통합해서 저장한 운영데이터의 집합체이다.

특징으로는 1) 실시간 접근, 2) 계속 변화, 3) 내용 기반, 4) 동시 공유 가 있다.

 

데이터베이스 관리 시스템(DBMS)은 데이터베이스를 생성하여 안정적이고 효율적으로 운영하는데 필요한 기능들을 제공하는 소프트웨어이다.

DBMS의 종류에는 RDBMS(관계형 데이터베이스)와 NoSQL(Non SQL 또는 Non relational)이 있다.

 

1) RDBMS

RDBMS는 관계형 모델을 기반으로 하는 데이터베이스 관리 시스템인데, 관계형 모델은 술어 논리와 집합론에 기반을 두어 데이터를 "관계로서" 표현한다.

즉, 행과 열의 집합으로 구성된 테이블 묶음 형식으로 데이터를 제공한다. 

그리고 테이블 형식의 데이터를 조작할 수 있는 관계 연산자가 SQL이다. RDBMS는 SQL을 제공한다.

RDBMS에서는 '무결성 원칙'이 가장 중요한데, 이는 데이터베이스에 정확한 데이터가 유지되고 있음을 보장하는 것이다.

RDBMS의 종류로는 MySQL, Microsoft SQL Server가 있다.

 

2) NoSQL

NoSQL의 데이터베이스는 전통적인 관계형 데이터베이스보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공한다.

빅데이터, 대량 트래픽 저장과 동시성이 높은 조회에 뛰어나다.

"많은 사용자들이 늘 동일한 데이터를 보지 않아도 된다"는 전제 하에 개발되었다.

NoSQL의 종류로는 mongoDB, cassandra, redis가 있다.

mongoDB는 문서 등의 대용량 파일에 적합하다.

cassandra는 data 속성을 특정 값으로 하나의 컬럼에 넣는다는 특징이 있다.

redis는 <key-value> 메모리성 데이터베이스로 "=" 연산을 빠르게 할 수 있다는 특징이 있다.

 

2. 관계 데이터 모델

데이터 모델링이란 현실 세계에 존재하는 데이터를 컴퓨터 세계의 데이터베이스로 옮기는 변환 과정이다.

 

관계 데이터 모델은 개념적 구조를 논리적 구조로 표현하는 논리적 데이터 모델이다.

하나의 개체에 대한 데이터를 하나의 릴레이션(Relation)에 저장한다.

 

릴레이션이란 하나의 개체에 관한 데이터를 2차원 데이블의 구조로 저장한 것이다. 

 

학번 학생이름 주소 생년월일 전공번호 휴학여부
INT VARCHAR VARCHAR CHAR INT CHAR
1578398 홍길동 전라남도 광주시 19980823 123 N
1628739 이지은 경상북도 대구 20001201 107 Y

위의 예시가 하나의 릴레이션이고, 현재 두 개의 개체가 저장되어 있다.

 

① 관계 데이터 모델의 기본 용어

1) 속성 attribute (열) : 파일 관리 시스템 관점에서 '필드'에 대응

2) 투플 tuple (행): 파일 관리 시스템 관점에서 '레코드'에 대응

3) 도메인 domain: 일반적으로 속성의 특성을 고려한 데이터 타입으로 정의

                        속성 값을 입력 및 수정할 때 적합성의 판단 기준이 됨

 

위의 예시에서 학번, 학생이름, 주소, 생년월일, 전공번호, 휴학여부가 속성이다.

홍길동, 이지은이 투플이며, INT, VARCHAR, CHAR가 도메인이다.

 

 

② 릴레이션의 구성

1) 릴레이션 스키마

릴레이션 스키마는 릴레이션의 논리적 구조로, 릴레이션의 이름과 릴레이션에 포함된 모든 속성 이름으로 정의된다.

정적인 특징이 있다. (한번 만들어지면 거의 변경이 없다.)

ex) 학생 (학번, 학생이름, 주소, 생년월일, 전공번호, 휴학여부)

 

2) 릴레이션 인스턴스

릴레이션 인스턴스는 어느 한 시점에 릴레이션에 존재하는 투플들의 집합으로, 동적인 특징이 있다.

위의 예시에서는 학생 한 명 한 명이 각각 인스턴스가 된다.

 

 

③ 데이터베이스의 구성

1) 데이터베이스 스키마

데이터베이스 스키마는 데이터베이스의 전체 구조로, 데이터베이스를 구성하는 각각의 릴레이션 스키마의 모음이다.

 

2) 데이터베이스 인스턴스

데이터베이스 인스턴스는 데이터베이스를 구성하는 각각의 릴레이션 인스턴스의 모음이다.

 

 

④ 릴레이션의 특성

1) 투플의 유일성: 하나의 릴레이션에는 동일한 투플이 존재할 수 없다. (모든 속성의 값이 동일한 투플 X)

2) 투플의 무순서: 하나의 릴레이션에서 투플 사이의 순서는 무의미하다.

3) 속성의 무순서: 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.

4) 속성의 원자성: 속성 값으로 원자 값만 사용할 수 있다.

(더이상 분해할 수 없는 속성 = 단순 속성 -> data의 일관성)

단순속성 ↔ 복합 속성 ex) 주소는 '시', '도', '군' 의 단순 속성 여러 개를 활용하여 구현이 가능하다.

 

 

키(KEY) 정의와 특성

1) 키의 정의: 릴레이션에서 투플들을 유일하게 구별하는 속성 또는 속성들의 집합

2) 키의 특성

 - 유일성: 하나의 릴레이션에서 모든 투플은 서로 다른 키 값을 가져야 한다.

 - 최소성: 꼭 필요한 최소한의 속성들로만 키를 구성해야 한다.

 

⑥ 키의 종류와 관계

1) 수퍼키(super key): 유일성을 만족하는 속성 또는 속성들의 집합

2) 후보키(candidate key): 유일성과 최소성을 만족하는 속성 또는 속성들의 집합

3) 기본키(primary key): 후보키 중에서 기본적으로 사용하기 위해 선택한 키

4) 대체키(alternate key): 기본키로 선택되지 못한 후보키

출처) 숙명여자대학교 비교과 프로그램 '데이터베이스와 SQL' 강의자료

 

5) 외래키(foreign key): 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합

                              릴레이션들 간의 관계를 표현

'Database > SQL' 카테고리의 다른 글

[MySQL] SQL 옵티마이저  (0) 2021.01.18
[MySQL] 데이터 제어어 : DCL  (0) 2021.01.18
[MySQL] Titanic 예제  (0) 2021.01.11
[MySQL] University DB 예제  (0) 2021.01.10
[MySQL] MySQL 설치하기  (0) 2021.01.10

+ Recent posts