DB 5일차 3(subquery)

2022. 12. 13. 10:52코딩배움일지/DataBase

subquery

하나의 SQL 문에 포함되어 있는 또 다른 SQL 문을 말합니다.

 

서브쿼리 사용시 주의사항

 

1. 서브쿼리를 괄호로 감싸서 사용한다.

2. 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.

3. 서브쿼리에서는 ORDER BY 를 사용하지 못한다.

 

사용 하는 곳

1. SELECT 절

2. FROM 절

3. WHERE 절

4. HAVING 절

5. ORDER BY 절

6. INSERT 문의 VALUES 절

7. UPDATE 문의 SET 절

 

서브 쿼리 분류

 

더보기

단일행

서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 합니다.

 

다중행

서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다.

 

INSERT INTO
	board_mst
VALUE
	(0,'제목1', '게시글 내용1', 0, 1),
	(0,'제목2', '게시글 내용2', 0, 1),
	(0,'제목3', '게시글 내용3', 0, 1),
	(0,'제목1', '게시글 내용1', 0, 2),
	(0,'제목2', '게시글 내용2', 0, 2),
	(0,'제목3', '게시글 내용3', 0, 2),
	(0,'제목4', '게시글 내용4', 0, 1),
	(0,'제목5', '게시글 내용5', 0, 1),
	(0,'제목6', '게시글 내용6', 0, 1),
	(0,'제목4', '게시글 내용4', 0, 2),
	(0,'제목5', '게시글 내용5', 0, 2),
	(0,'제목6', '게시글 내용6', 0, 2);
	
SELECT
	*
	
FROM
	board_mst;

작가 가 몇개의 글을 작성하였나?

SELECT
	writer_id,
	COUNT(1)
	
FROM
	board_mst

GROUP BY
	writer_id;

 

서브 쿼리  (함부로 쓰리지마라 ㅈ된다.) 

SELECT
	*,
	(SELECT COUNT(1) FROM board_mst bm2 WHERE bm2.writer_id = bm.writer_id)
FROM
	board_mst bm;

서브쿼리는 컬럼값을 하나만 가져와야한다. 

 

from 에서 쓰는 서브 쿼리

SELECT
	*,
	wc.writer_count	
FROM
	board_mst bm
	LEFT OUTER JOIN (SELECT 
		writer_id, 
		COUNT(1) AS writer_count
	FROM 
		board_mst 
	GROUP by 
		writer_id) wc ON (wc.writer_id = bm.writer_id);

 

from 에서 쓰는 서브 쿼리1

SELECT
	bm.id,
	bm.title,
	bm.content,
	bm.read_count,
	bm.writer_id,
	wc.writer_count	
FROM
	board_mst bm
	LEFT OUTER JOIN (SELECT 
		writer_id, 
		COUNT(1) AS writer_count
	FROM 
		board_mst 
	GROUP by 
		writer_id) wc ON (wc.writer_id = bm.writer_id);

from 안

join 을 통한 서브 쿼리가 효율 적이다. 결과는 같으나 이게 좋다. 

 

 

'코딩배움일지 > DataBase' 카테고리의 다른 글

DB 6일차 2()  (0) 2022.12.14
DB 6일차 1(서브쿼리)  (0) 2022.12.14
DB 5일차 2(group by)  (0) 2022.12.13
DB 5일차 1()  (0) 2022.12.13
DB 4일차 4()  (0) 2022.12.12