공부/TIL

[SQL 첫걸음] 29강 - 31강

2024. 1. 13. 22:17
목차
  1. 29강 :인덱스 작성과 삭제
  2. 30강 : 뷰 작성과 삭제
  3. 7장 : 복수의 테이블 다루기
  4. 31강 : 집합 연산

29강 :인덱스 작성과 삭제

# 인덱스 작성
# CREATE INDEX isample65 ON sample62(no);
mysql> CREATE INDEX isample65 ON sample62(no);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 인덱스 삭제
# DROP INDEX 인덱스명(스키마 객체)
# DROP INDEX 인덱스명 ON 테이블명(테이블 내 객체)
mysql> DROP INDEX isample65 ON sample62;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

 

EXPLAIN

- 실제로 인덱스를 사용해 검사하는지 확인 가능

mysql> CREATE INDEX isample65 ON sample62(a);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM sample62 WHERE a = 'a';
Empty set (0.00 sec)

mysql> EXPLAIN SELECT * FROM sample62 WHERE a = 'a';
+----+-------------+----------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | sample62 | NULL       | ref  | isample65     | isample65 | 93      | const |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

# a열을 사용하지 않도록 조건 변경
mysql> EXPLAIN SELECT * FROM sample62 WHERE no > 10;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | sample62 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

 

30강 : 뷰 작성과 삭제

1. 뷰(가상 테이블)

테이블처럼 테이터베이스 객체 중 하나

앞에서 FROM 구에 기술된 서브쿼리에 이름을 붙이고 데이터베이스 객체화하여 쓰기 쉽게 한 것

SELECT 명령을 객체로서 관리 가능

SELECT에서만 사용 권장 -> 테이블처럼 데이터를 쓰고 지우는 저장공간이 없으므로 INSERT 등 사용 시엔 주의 필요

 

2. 뷰 작성과 삭제

# CREATE VIEW 뷰명 AS SELECT 명령
mysql> CREATE VIEW sample_view_67 AS SELECT * FROM sample54;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM sample_view_67;
+------+------+
| no   | a    |
+------+------+
|    1 |  100 |
|    2 |  900 |
|    4 |   80 |
+------+------+
3 rows in set (0.00 sec)

# 열을 지정해 뷰 작성하기
mysql> CREATE VIEW sample_view_672(n, v, v2) AS
    -> SELECT no, a, a*2 FROM sample54;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM sample_view_672 WHERE n = 1;
+------+------+------+
| n    | v    | v2   |
+------+------+------+
|    1 |  100 |  200 |
+------+------+------+
1 row in set (0.00 sec)

# 뷰 삭제
mysql> DROP VIEW sample_view_67;
Query OK, 0 rows affected (0.01 sec)

 

3. 뷰의 약점

저장공간 대신 CPU 자원 사용

 

Materialized View

- 일반적으로 뷰는 데이터를 일시적으로 저장했다 쿼리 실행 종료 시 함께 삭제됨

- Materialized View는 테이블처럼 처음 참조 되었을 때 데이터를 저장장치에 저장해두고 사용함

- 뷰에 지정된 테이블의 데이터가 변경된 경우, SELECT 명령 재실행 -> 데이터 재저장(일련의 과정은 RDBMS가 자동으로 실행)

- 현재는 Oracle과 DB2에서만 사용 가능

 

함수 테이블

- 뷰를 구성하는 SELECT 명령은 단독 실행 가능이 전제임 -> 부모 쿼리와 연관된 서브 쿼리는 사용 불가

-> 함수 테이블을 사용하면 회피 가능

- 테이블을 결괏값으로 반환해주는 사용자정의 함수이므로 인수 지정하여 WHERE 조건으로 결괏값 바꿀 수 있음

 

7장 : 복수의 테이블 다루기

31강 : 집합 연산

1. SQL과 집합

벤 다이어그램에선 하나의 원이 곧 하나의 집합

데이터베이스에서는 테이블의 행이 곧 요소에 해당

SELECT 명령 실행 결과 반환된 여러 행이 곧 하나의 집합

 

2. UNION으로 합집합 구하기

각각의 SELECT 명령의 열의 내용은 서로 일치해야 함

mysql> SELECT * FROM sample71_a;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM sample71_b;
+------+
| b    |
+------+
|    2 |
|   10 |
|   11 |
+------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM sample71_a
    -> UNION
    -> SELECT * FROM sample71_b;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|   10 |
|   11 |
+------+
5 rows in set (0.00 sec)

 

UNION 사용 시 ORDER BY

- 마지막 SELECT 명령에만 지정

mysql> SELECT a FROM sample71_a ORDER BY a
    -> UNION
    -> SELECT b FROM sample71_b;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
SELECT b FROM sample71_b' at line 2

# 합집합의 결과를 정렬하기 때문에 두 개의 SELECT 명령에서 열 이름이 서로 일치한단 보장이 없어 에러 발생
mysql> SELECT a FROM sample71_a
    -> UNION
    -> SELECT b FROM sample71_b ORDER BY b;
ERROR 1054 (42S22): Unknown column 'b' in 'order clause'

# 별명 붙여서 이름 일치 시켜 정렬 가능
mysql> SELECT a AS c FROM sample71_a
    -> UNION
    -> SELECT b AS c FROM sample71_b ORDER BY c;
+------+
| c    |
+------+
|    1 |
|    2 |
|    3 |
|   10 |
|   11 |
+------+
5 rows in set (0.00 sec)

 

UNION ALL

일반적으로 UNION한 결과엔 중복값이 제거되어 있는데, 중복값 제거 없이 그대로 합치고 싶을 때 사용

mysql> SELECT * FROM sample71_a
    -> UNION ALL
    -> SELECT * FROM sample71_b;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    2 |
|   10 |
|   11 |
+------+
6 rows in set (0.00 sec)

 

3. 교집합과 차집합

MySQL에선 지원 안함

INTESECT : 교집합

EXCEPT : 차집합(Oracle은 MINUS)

 

 

'공부 > TIL' 카테고리의 다른 글

[한 권으로 읽는 컴퓨터 구조와 프로그래밍]  (0) 2024.01.17
[SQL 첫걸음] 32강 - 36강  (1) 2024.01.15
[SQL 첫걸음] 26강 - 28강  (2) 2024.01.12
[SQL 첫걸음] 23강 - 25강  (1) 2024.01.10
[SQL 첫걸음] 20강 - 22강  (1) 2024.01.08
  1. 29강 :인덱스 작성과 삭제
  2. 30강 : 뷰 작성과 삭제
  3. 7장 : 복수의 테이블 다루기
  4. 31강 : 집합 연산
'공부/TIL' 카테고리의 다른 글
  • [한 권으로 읽는 컴퓨터 구조와 프로그래밍]
  • [SQL 첫걸음] 32강 - 36강
  • [SQL 첫걸음] 26강 - 28강
  • [SQL 첫걸음] 23강 - 25강
Ail_
Ail_
Ail_
log
Ail_
  • 분류 전체보기 (181)
    • 사설 (11)
      • 강연 (5)
      • * (3)
      • 회고 (3)
    • 공부 (161)
      • Just do it (3)
      • TIL (66)
      • [TIL] Game Bootcamp (31)
      • [Project] Game Bootcamp (1)
      • [TIL] Digital Twin Bootcamp (39)
      • [Project] Digital Twin Boot.. (21)
    • 노션 (3)

인기 글

최근 글

태그

  • mysql 설치
  • 노션
  • SQL 첫걸음
  • Do it! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬 편
  • 배포
  • Chat
  • 인터랙티브 웹 UX·UI
  • node.js
  • 유니티
  • 템플릿
  • unity
  • C#
  • 유니티 게임 개발
  • 피격
  • 개발회고
  • 데이터베이스
  • 한입 크기로 잘라 먹는 타입스크립트
  • 멋쟁이사자처럼
  • 공격
  • 오블완
  • 플레이어
  • 티스토리챌린지
  • 개발일지
  • 회고
  • 부트캠프
  • SQL첫걸음
  • 이펙트
  • notion
  • TypeScript
  • 대시

최근 댓글

전체
오늘
어제
hELLO · Designed By 정상우.
Ail_
[SQL 첫걸음] 29강 - 31강
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.