공부/TIL

[SQL 첫걸음] 23강 - 25강

2024. 1. 10. 23:15
목차
  1. 23강 : 서브쿼리
  2. 24강 : 상관 서브쿼리
  3. 25강 : 데이터베이스 객체

23강 : 서브쿼리

1. DELETE의 WHERE 구에서 서브쿼리 사용하기

mysql> select * from sample54;
+------+------+
| no   | a    |
+------+------+
|    1 |  100 |
|    2 |  900 |
|    3 |   20 |
|    4 |   80 |
+------+------+
4 rows in set (0.05 sec)

mysql> select min(a) from sample54;
+--------+
| min(a) |
+--------+
|     20 |
+--------+
1 row in set (0.00 sec)

mysql> delete from sample54 where a = (select min(a) from sample54);
ERROR 1093 (HY000): You can't specify target table 'sample54' for update in FROM clause
# -> mysql에서는 실행 불가능 : 데이터 추가/갱신할 경우 동일한 테이블을 서브쿼리에서 사용할 수 없기 때문

# 다음과 같이 인라인 뷰로 임시 테이블을 만들어서 처리하면 가능
mysql> DELETE FROM sample54 WHERE a = (SELECT a FROM (SELECT MIN(a) AS a FROM sample54) AS x);
Query OK, 1 row affected (0.01 sec)

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

 

2. 스칼라 값

SELECT 명령이 하나의 값만 반환하는 것

스칼라 값을 반환하는 서브쿼리(스칼라 서브쿼리)는 = 연산자로 비교 가능

# 80이라는 하나의 값만 반환하는 스칼라 값
mysql> SELECT MIN(a) FROM sample54;
+--------+
| MIN(a) |
+--------+
|     80 |
+--------+
1 row in set (0.00 sec)

# 나머지는 해당 없음
mysql> SELECT no FROM sample54;
+------+
| no   |
+------+
|    1 |
|    2 |
|    4 |
+------+
3 rows in set (0.00 sec)

mysql> SELECT MIN(a), MAX(no) FROM sample54;
+--------+---------+
| MIN(a) | MAX(no) |
+--------+---------+
|     80 |       4 |
+--------+---------+
1 row in set (0.00 sec)

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

 

3. SELECT 구에서 서브쿼리 사용하기

mysql> SELECT
    -> (SELECT COUNT(*) FROM sample51) AS sq1,
    -> (SELECT COUNT(*) FROM sample54) AS sq2;
+------+------+
| sq1  | sq2  |
+------+------+
|    5 |    3 |
+------+------+
1 row in set (0.01 sec)

 

 

4. SET 구에서 서브쿼리 사용하기

mysql> UPDATE sample54 SET a = (SELECT MAX(a) FROM sample54);

 

5. FROM 구에서 서브쿼리 사용하기

SELECT나 SET 구와 다르게 스칼라 값 반환 안해도 됨

중첩 구조도 가능함

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

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

# 3중첩도 가능
mysql> SELECT * FROM (SELECT * FROM (SELECT * FROM sample54) sq1) sq2;
+------+------+
| no   | a    |
+------+------+
|    1 |  100 |
|    2 |  900 |
|    4 |   80 |
+------+------+
3 rows in set (0.00 sec)

 

6. INSERT 명령과 서브쿼리

mysql> INSERT INTO sample541 VALUES(
    -> (SELECT COUNT(*) FROM sample51),
    -> (SELECT COUNT(*) FROM sample54)
    -> );
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM sample541;
+------+------+
| a    | b    |
+------+------+
|    5 |    3 |
+------+------+
1 row in set (0.00 sec)

 

- INSERT SELECT

mysql> INSERT INTO sample541 SELECT 1, 2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM sample541;
+------+------+
| a    | b    |
+------+------+
|    5 |    3 |
|    1 |    2 |
+------+------+
2 rows in set (0.00 sec)

 

24강 : 상관 서브쿼리

1. EXSITS

mysql> SELECT * FROM sample551;
+------+------+
| no   | a    |
+------+------+
|    1 | NULL |
|    2 | NULL |
|    3 | NULL |
|    4 | NULL |
|    5 | NULL |
+------+------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM sample552;
+------+
| no2  |
+------+
|    3 |
|    5 |
+------+
2 rows in set (0.00 sec)

# EXISTS를 사용해 '있음'으로 갱신하기
mysql> UPDATE sample551 SET a = '있음' WHERE
    -> EXISTS (SELECT * FROM sample552 WHERE no2 = no);
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> SELECT * FROM sample551;
+------+------+
| no   | a    |
+------+------+
|    1 | NULL |
|    2 | NULL |
|    3 | 있음 |
|    4 | NULL |
|    5 | 있음 |
+------+------+
5 rows in set (0.00 sec)

 

2. NOT EXISTS

# 이번엔 '없음'으로 갱신하기
mysql> UPDATE sample551 SET a ='없음' WHERE
    -> NOT EXISTS (SELECT * FROM sample552 WHERE no2 = no);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> SELECT * FROM sample551;
+------+------+
| no   | a    |
+------+------+
|    1 | 없음 |
|    2 | 없음 |
|    3 | 있음 |
|    4 | 없음 |
|    5 | 있음 |
+------+------+
5 rows in set (0.00 sec)

 

3. 상관 서브쿼리

부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것

mysql> UPDATE sample551 SET a ='없음' WHERE
    -> NOT EXISTS (SELECT * FROM sample552 WHERE no2 = no);

- 테이블명 붙이기

테이블명.열명 형식으로 작성하면 됨(ex. sample552.no)

 

4. IN

집합 안의 값이 존재하는지 확인 가능

NULL은 IS NULL을 사용해야 함

mysql> SELECT * FROM sample551 WHERE no IN (3, 5);
+------+------+
| no   | a    |
+------+------+
|    3 | 있음 |
|    5 | 있음 |
+------+------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM sample551 WHERE no IN
    -> (SELECT no2 FROM sample552);
+------+------+
| no   | a    |
+------+------+
|    3 | 있음 |
|    5 | 있음 |
+------+------+
2 rows in set (0.00 sec)

 

25강 : 데이터베이스 객체

1. 데이터베이스 객체

테이블이나 뷰, 인덱스 등 데이터베이스 내에 정의하는 모든 것

 

객체

- 데이터베이스 내에 실체를 가지는 어떤 것

- 객체의 종류에 따라 데이터베이스에 저장되는 내용도 달라짐

- 테이블도 객체, SQL 명령은 데이터베이스 내에 존재하는 것이 아니므로 객체가 아님

- 이름을 가짐, 중복되지 않도록 함

 

작명 시 제약 사항

- 기존 이름이나 예약어와 중복하지 않음.

- 숫자로 시작할 수 없음

- 언더스코어(_) 이외의 기호는 사용할 수 없음

- 한글을 사용할 때는 더블쿼트(MySQL에서는 백쿼트)로 둘러쌈

- 시스템이 허용하는 길이를 초과하지 않음

-> 의미없는 이름은 피할 것

 

2. 스키마

데이터베이스 객체가 만들어지는 그릇 -> 스키마가 다르면 객체의 이름이 동일해도 상관 없음

데이터베이스 객체는 스키마 객체라고 불리기도 함

MySQL에서는 CREATE DATABASE 명령으로 작성 '데이터베이스' = 스키마

 

스키마 설계

- 데이터베이스에 테이블을 작성해서 구축해나가는 작업

- SQL 명령의 DDL을 이용하여 정의함

 

네임스페이스 namespace

- 이름이 충돌하지 않도록 기능하는 그릇

ex. 스키마, 테이블

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

[SQL 첫걸음] 29강 - 31강  (1) 2024.01.13
[SQL 첫걸음] 26강 - 28강  (2) 2024.01.12
[SQL 첫걸음] 20강 - 22강  (1) 2024.01.08
[SQL 첫걸음] 17강 - 19강  (0) 2024.01.06
[SQL 첫걸음] 14강 - 16강  (1) 2024.01.05
  1. 23강 : 서브쿼리
  2. 24강 : 상관 서브쿼리
  3. 25강 : 데이터베이스 객체
'공부/TIL' 카테고리의 다른 글
  • [SQL 첫걸음] 29강 - 31강
  • [SQL 첫걸음] 26강 - 28강
  • [SQL 첫걸음] 20강 - 22강
  • [SQL 첫걸음] 17강 - 19강
Ail_
Ail_
Ail_
log
Ail_
  • 분류 전체보기 (180)
    • 사설 (11)
      • 강연 (5)
      • * (3)
      • 회고 (3)
    • 공부 (160)
      • Just do it (3)
      • TIL (66)
      • [TIL] Game Bootcamp (30)
      • [Project] Game Bootcamp (1)
      • [TIL] Digital Twin Bootcamp (39)
      • [Project] Digital Twin Boot.. (21)
    • 노션 (3)

인기 글

최근 글

태그

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

최근 댓글

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

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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