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 |