๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/DBMS

SQL Select ํ™œ์šฉ(์„œ๋ธŒ์ฟผ๋ฆฌ, group by, join)

by HanaV 2023. 4. 10.
728x90

*๋ฐ์ดํ„ฐ ์ž๋ฃŒ๋Š” ํ•œ๋น›๋ฏธ๋””์–ด ์‚ฌ์ดํŠธ์˜ ํ˜ผ๊ณต ์ž๋ฃŒ์‹ค์— ์žˆ๋Š” ์ž๋ฃŒ

์„œ๋ธŒ์ฟผ๋ฆฌ

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ฟผ๋ฆฌ ์•ˆ์— () ์•ˆ์— ์ฟผ๋ฆฌ๊ฐ€ ๋˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

SELECT * FROM member WHERE height > (SELECT height FROM member WHERE mem_name LIKE '์—์ดํ•‘ํฌ');

(limit์€ mysql ์ „์šฉ)

SELECT * FROM member WHERE height > (SELECT height FROM member WHERE mem_name LIKE '์—์ดํ•‘ํฌ')
	ORDER BY height DESC LIMIT 3;

 

group by

group by๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ํ–‰๋“ค์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค.
group by๋Š” ์ฃผ๋กœ ์ง‘๊ณ„ํ•จ์ˆ˜์™€ ์‚ฌ์šฉ๋œ๋‹ค.

sum(): ํ•ฉ๊ณ„
avg(): ํ‰๊ท 
min(): ์ตœ์†Ÿ๊ฐ’
max(): ์ตœ๋Œ“๊ฐ’
count(): ํ–‰์˜ ๊ฐœ์ˆ˜
count(distinct): ์ค‘๋ณต๋˜์ง€ ์•Š์€ ํ–‰์˜ ๊ฐœ์ˆ˜
SELECT mem_id, SUM(amount) AS 'ํ•ฉ๊ณ„'  FROM buy GROUP BY mem_id ORDER BY mem_id;

grouping๊ณผ ๊ด€๋ จ๋œ ์กฐ๊ฑด์‹์€ where์ด ์•„๋‹Œ having์„ ์‚ฌ์šฉํ•œ๋‹ค.

SELECT mem_id, SUM(amount) AS 'ํ•ฉ๊ณ„'  FROM buy GROUP BY mem_id HAVING SUM(amount) > 5 ORDER BY mem_id;

 

join (=inner join)

2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
๋งŒ์•ฝ Error Code: 1052. Column 'student_number' in field list is ambiguous ๊ฐ€ ๋œฌ๋‹ค๋ฉด,  value ์ด๋ฆ„์ด ๊ฒน์ณ์„œ ์–ด๋Š ํ…Œ์ด๋ธ”์˜ value๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑด์ง€ ํ™•์‹คํ•˜๊ฒŒ ํ‘œ์‹œํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

SELECT buy.mem_id, SUM(price*amount) AS total
	FROM buy
		INNER JOIN member
		ON buy.mem_id = member.mem_id
	GROUP BY mem_id;

 

์˜ˆ์‹œ ๋ฌธ์ œ

Q1. ์†Œ๋…€์‹œ๋Œ€๋ž‘ ๊ฐ™์€ ์ง€์—ญ์— ์‚ฌ๋Š” ์—ฐ์˜ˆ์ธ ์•„์ด๋””์™€ ์ด๋ฆ„, ์ธ์›์„ ์ถœ๋ ฅํ•˜๋ผ. 
       (๋‹จ, ๋ฐ๋ท”๋‚ ์งœ๊ฐ€ ์˜ค๋ž˜๋œ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ผ.)

๋”๋ณด๊ธฐ
	-- ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ select
		-- Q1. ์†Œ๋…€์‹œ๋Œ€๋ž‘ ๊ฐ™์€ ์ง€์—ญ์— ์‚ฌ๋Š” ์—ฐ์˜ˆ์ธ ์•„์ด๋””์™€ ์ด๋ฆ„, ์ธ์›์„ ์ถœ๋ ฅํ•˜๋ผ. 
        -- ๋‹จ, ๋ฐ๋ท”๋‚ ์งœ๊ฐ€ ์˜ค๋ž˜๋œ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ผ
        
        select mem_id, mem_name, mem_number
			from member
            where addr = (select addr from member where mem_name='์†Œ๋…€์‹œ๋Œ€')
            order by debut_date;

 

Q2. ์ด ๊ตฌ๋งค๋‚ด์—ญ์ด ์ œ์ผ ๋†’์€ 5๋ช…์˜ ์•„์ด๋””์™€ ๊ตฌ๋งค๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๋ผ.
        (๋‹จ, ๊ตฌ๋งค๋‚ด์—ญ์€ 100 ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.)

๋”๋ณด๊ธฐ
	-- grouping์„ ์‚ฌ์šฉํ•œ select
		-- Q2. ์ด ๊ตฌ๋งค๋‚ด์—ญ์ด ์ œ์ผ ๋†’์€ 5๋ช…์˜ ์•„์ด๋””์™€ ๊ตฌ๋งค๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๋ผ.
        -- ๋‹จ, ๊ตฌ๋งค๋‚ด์—ญ์€ 100 ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.
        select mem_id, sum( price * amount ) as total
			from buy
            group by mem_id
            having total > 100
            order by total desc
            limit 5;

 

Q3. ์ด๋ฆ„์— '์ด'๊ฐ€ ํฌํ•จ๋œ ๊ทธ๋ฃน์˜ ์ด๋ฆ„๊ณผ ์•„์ด๋””, ๋ฐ๋ท”์ผ์ž๋ฅผ ํ‚ค๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋ผ.

๋”๋ณด๊ธฐ
	-- like๋ฅผ ์‚ฌ์šฉํ•œ ์กฐ๊ฑด๋ฌธ
		-- Q3. ์ด๋ฆ„์— '์ด'๊ฐ€ ํฌํ•จ๋œ ๊ทธ๋ฃน์˜ ์ด๋ฆ„๊ณผ ์•„์ด๋””, ๋ฐ๋ท”์ผ์ž๋ฅผ ํ‚ค๊ฐ€ ํฐ ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋ผ.
        select mem_name, mem_id, debut_date
			from member
            where mem_name
				like '%์ด%'
			order by height;

 

Q4. member ํ…Œ์ด๋ธ”์— ์•„์ด๋ธŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ.

๋”๋ณด๊ธฐ
-- insert๋ฌธ
	-- Q. member ํ…Œ์ด๋ธ”์— ์•„์ด๋ธŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ.
	insert into member values ('IVE', '์•„์ด๋ธŒ', 5, '์„œ์šธ', '02', '12345678', 169, '2021.12.01');
	-- date๋Š” 2021.12.01 ํ˜•ํƒœ๋ณด๋‹ค 2021-12-01์„ ํ‘œ์ค€์œผ๋กœ ์žก๊ณ  ์žˆ์–ด์„œ warning ํ‘œ์‹œ๊ฐ€ ๋œฌ๋‹ค.
	select * from member;

 

Q5. ์•„์ด๋ธŒ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค. ๋ฉค๋ฒ„ ์ˆ˜๋ฅผ 5๋ช…์—์„œ 6๋ช…์œผ๋กœ ์ˆ˜์ •ํ•˜๋ผ.

๋”๋ณด๊ธฐ
-- update๋ฌธ
	-- Q. ์•„์ด๋ธŒ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค. ๋ฉค๋ฒ„ ์ˆ˜๋ฅผ 5๋ช…์—์„œ 6๋ช…์œผ๋กœ ์ˆ˜์ •ํ•˜๋ผ.
    update member set mem_number = '6'
		where mem_id = 'IVE';
	select * from member;

 

Q6. ์—ฌ์ž์นœ๊ตฌ๋Š” ํ•ด์ฒดํ•˜์˜€๋‹ค. (ใ…œใ…œ) member ํ…Œ์ด๋ธ”์—์„œ ์—ฌ์ž์นœ๊ตฌ๋ฅผ ์‚ญ์ œํ•˜๋ผ.

๋”๋ณด๊ธฐ
-- delete๋ฌธ
	-- Q. ์—ฌ์ž์นœ๊ตฌ๋Š” ํ•ด์ฒดํ•˜์˜€๋‹ค. (ใ…œใ…œ) member ํ…Œ์ด๋ธ”์—์„œ ์—ฌ์ž์นœ๊ตฌ๋ฅผ ์‚ญ์ œํ•˜๋ผ.
    delete from buy 
		where mem_id ='WMN';
			-- PK๋ฅผ ์‚ญ์ œํ• ๋•Œ๋Š” ๋ฌถ์—ฌ์žˆ๋Š” FK๋ฅผ ๋จผ์ € ์‚ญ์ œํ•ด์•ผํ•œ๋‹ค.
	delete from member
		where mem_id = 'WMN';
	select * from member;

 

Q7. ํ˜ผ๊ณต SQL์„ ๊ตฌ๋งคํ•œ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„๊ณผ ์ธ์›์„ ์ถœ๋ ฅํ•˜๋ผ.

๋”๋ณด๊ธฐ
-- join์„ ์‚ฌ์šฉํ•œ select๋ฌธ
	-- Q1. ํ˜ผ๊ณต SQL์„ ๊ตฌ๋งคํ•œ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„๊ณผ ์ธ์›์„ ์ถœ๋ ฅํ•˜๋ผ.
    select member.mem_name, member.mem_number
    from member
    join buy
		on buy.mem_id = member.mem_id
	where prod_name = 'ํ˜ผ๊ณตSQL';

 

Q8. ์ด ๊ตฌ๋งค๋‚ด์—ญ์ด 300 ์ด์ƒ์ธ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„, ๋ฐ๋ท”์ผ์ž, ์ด ๊ตฌ๋งค๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๋ผ.
    (๋‹จ, 3๋ช…์ด ๋„˜์œผ๋ฉด 3๋ช…๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ๊ตฌ๋งค๋‚ด์—ญ์ด ๋†’์€ ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋ผ.)

๋”๋ณด๊ธฐ
    -- Q2. ์ด ๊ตฌ๋งค๋‚ด์—ญ์ด 300 ์ด์ƒ์ธ ์—ฐ์˜ˆ์ธ์˜ ์ด๋ฆ„, ๋ฐ๋ท”์ผ์ž, ์ด ๊ตฌ๋งค๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๋ผ.
    -- ๋‹จ, 3๋ช…์ด ๋„˜์œผ๋ฉด 3๋ช…๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ๊ตฌ๋งค๋‚ด์—ญ์ด ๋†’์€ ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๋ผ.
    SELECT buy.mem_id, mem_name, debut_date, SUM(amount * price) AS total
	FROM buy
	JOIN member
		ON member.mem_id = buy.mem_id
	GROUP BY mem_id
	HAVING total > 300
	ORDER BY total DESC
	LIMIT 3;

 

Q9. 1์ธ๋‹น ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰์ด ์ œ์ผ ๋†’์€ 3๋ช…์˜ ์ด๋ฆ„๊ณผ ์•„์ด๋””, ๋ฉค๋ฒ„ ์ˆ˜, 1์ธ ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰์„ ์ถœ๋ ฅํ•˜๋ผ.

๋”๋ณด๊ธฐ
    -- Q3. 1์ธ๋‹น ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰์ด ์ œ์ผ ๋†’์€ 3๋ช…์˜ ์ด๋ฆ„๊ณผ ์•„์ด๋””, ๋ฉค๋ฒ„ ์ˆ˜, 1์ธ ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰์„ ์ถœ๋ ฅํ•˜๋ผ.
    select member.mem_name, member.mem_id, member.mem_number, sum(price * amount)/member.mem_number as '1์ธ ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰'
    from member
    join buy
		on buy.mem_id = member.mem_id
	group by mem_id
    order by '1์ธ ํ‰๊ท  ๊ตฌ๋งค๋Ÿ‰' desc
    limit 3;
728x90

"); wcs_do();