6์žฅ. SQL ๋ฌธ์˜ ๊ธฐ๋ณธ

SELECT ๋ฌธ์˜ ์ดํ•ด
  1. SELECT
  2. INSERT, UPDATE, DELETE
  3. VIEW
  4. SUBQUERY
  5. JOIN
  6. ์ฒดํฌํฌ์ธํŠธ

 

๐Ÿง SQL์„ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

์š”์ฆ˜์€ ORM์œผ๋กœ ์ž‘์—…์„ ๋งŽ์ด ํ•˜๋‹ˆ๊นŒ SQL.. ์ž์„ธํžˆ ๋ชฐ๋ผ๋„ ๋˜๋Š”๊ฑฐ ์•„๋‹๊นŒ? SQL์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

โ—๏ธ ORM์€ SQL์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ, ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ•˜๋‚˜์˜ ๋„๊ตฌ

  • ORM์ด ์™œ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋Š”์ง€
  • SQL ๋™์ž‘์›๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋œ๊ฑด์ง€
  • ORM์ด ์—†์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€

์ œ์ผ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ, DB์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด๋žŒํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


SELECT ๋ฌธ

  • MySQL CLI๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ํ•œ ํ›„
  • MySQL ์„œ๋ฒ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ํ‘œ์‹œ
mysql> show databases;
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ
mysql> use DB๋ช…;
  • ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๋ชฉ๋ก ํ‘œ์‹œ
mysql> show tables;

 

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„(MySQL)

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„
INTERVAL ๋†’์Œ
BINARY, COLLATE  
-(๋‹จํ•ญ ๊ฐ์‚ฐ), ~(๋‹จํ•ญ ๋น„ํŠธ ๋ฐ˜์ „)  
^  
*, /, DIV, %, MOD  
-, +  
&  
|  
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN  
BETWEEN, CASE, WHEN, THEN, ELSE  
NOT  
&&, AND  
XOR  
||, OR  
=(๋Œ€์ž… ๋“ฑํ˜ธ), := ๋‚ฎ์Œ

 

SQL์˜ ๊ธฐ์ดˆ์ ์ธ ๊ธฐ์ˆ  ๊ทœ์น™

  • SQL ๋ฌธ์˜ ๋งˆ์ง€๋ง‰์— ๋”œ๋ฆฌ๋ฏธํ„ฐ๋ฅผ ๋ถ™์ธ๋‹ค (๋Œ€๋ถ€๋ถ„ ์„ธ๋ฏธ์ฝœ๋ก )
  • ํ‚ค์›Œ๋“œ๋Š” case-sensitive ํ•˜์ง€ ์•Š๋‹ค (select์™€ SELECT๋Š” ๊ฐ™๋‹ค)
  • ์ •์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ์“ด๋‹ค. ๋ฌธ์ž์—ด, ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ์€ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ๋‹ค
  • ๋‹จ์–ด๋Š” ๋ฐ˜๊ฐ ์ŠคํŽ˜์ด์Šค๋‚˜ ๊ฐœํ–‰์œผ๋กœ ๊ตฌ๋ณ„ํ•œ๋‹ค

 

DISTINCT

์„ ํƒํ•œ ํ–‰์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ๊ณ  ์ด๋ฅผ ์—†์• ๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ

SELECT DISTINCT ์ปฌ๋Ÿผ๋ช… FROM ํ…Œ์ด๋ธ”๋ช… WHERE ์กฐ๊ฑด;

 

ORDER BY

SELECT ~ FROM ํ…Œ์ด๋ธ”๋ช… ORDER BY ์ •๋ ฌํ‚ค1[, ์ •๋ ฌํ‚ค2, ... DESC/ASC];
  • ํ–‰์˜ ์ˆœ์„œ๋ฅผ ํ™•์‹คํžˆ ๊ฐ™๊ฒŒ ํ•˜๋ ค๋ฉด ํ–‰์˜ ์ •๋ ฌํ‚ค๋ฅผ uniqueํ•˜๊ฒŒ ์ •ํ•ด์•ผ ํ•จ
    • ์ •๋ ฌํ‚ค๊ฐ€ ๊ฐ™์€ ๊ฐ’์˜ ํ–‰์ด ๋ณต์ˆ˜ ๊ฐœ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ํ–‰๋“ค์˜ ์ˆœ์„œ๋Š” ์ผ์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
  • ๊ธฐ๋ณธ๊ฐ’ : ASC(์˜ค๋ฆ„์ฐจ์ˆœ)

 

์ง‘์•ฝํ•จ์ˆ˜

๊ธฐ๋ณธ์ ์œผ๋กœ NULL์„ ์ œ์™ธํ•˜๊ณ  ์ง‘๊ณ„

COUNT ํ•จ์ˆ˜๋งŒ์€ 'COUNT(*)'๋กœ ํ‘œ๊ธฐ(NULL์„ ํฌํ•จํ•œ ์ „์ฒด ํ–‰ ์ง‘๊ณ„)

 

  • COUNT ํ…Œ์ด๋ธ” ํ–‰์ˆ˜
  • SUM ํ…Œ์ด๋ธ” ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ ํ•ฉ๊ณ„
  • AVG ํ…Œ์ด๋ธ” ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ ํ‰๊ท 
  • MAX ํ…Œ์ด๋ธ” ์ž„์˜์—ด ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ€๊ฐ’
  • MIN ํ…Œ์ด๋ธ” ์ž„์˜์—ด ๋ฐ์ดํ„ฐ ์ตœ์†Œ๊ฐ’
  • (MySQL only) GROUP_CONCAT ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ, ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„
# GROUP_CONCAT๊ณผ DISTINCT๋กœ ์ค‘๋ณต ํšŒํ”ผ
# ์ค‘๋ณต์ด ์—†์–ด์ง€๊ณ  ํ–‰์ •๊ตฌ์—ญ์ด 1ํšŒ๋งŒ ์กฐํšŒ
mysql> SELECT GROUP_CONCAT(DISTINCT district) FROM CITY WHERE COUNTRYCODE='KOR';

 

GROUP BY

๋ฐ์ดํ„ฐ๋ฅผ ๋ช‡ ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ง‘์•ฝํ•˜๋Š” ๊ฒƒ

SELECT ~ FROM ํ…Œ์ด๋ธ”๋ช… GROUP BY ์ปฌ๋Ÿผ๋ช…1 [, ์ปฌ๋Ÿผ๋ช…2, ...];
  • GROUP BY๋กœ ์ง€์ •ํ•œ ์—ด : ์ง‘์•ฝ ํ‚ค, ๊ทธ๋ฃนํ™” ํ‚ค
  • ๋ณต์ˆ˜ ์—ด์„ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•ด ์ง€์ •

 

HAVING

๊ทธ๋ฃน๋งˆ๋‹ค ์ง‘์•ฝํ•œ ๊ฐ’์„ ์กฐ๊ฑด์œผ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ

SELECT ~ FROM GROUP BY ~ HAVING ๊ทธ๋ฃน์˜ ๊ฐ’์— ๋Œ€ํ•œ ์กฐ๊ฑด;

 

์ž‘์„ฑ ์ˆœ์„œ

  1. SELECT
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. ORDER BY

 

์‹คํ–‰ ์ˆœ์„œ

  1. FROM
  2. ON, WHERE
  3. JOIN, GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
  7. LIMIT (MySQL) / ROWNUM (Oracle)

UPDATE, INSERT, DELETE ๋ฌธ

UPDATE

UPDATE ํ…Œ์ด๋ธ”๋ช… SET ์ปฌ๋Ÿผ๋ช…1=๊ฐ’1[,์ปฌ๋Ÿผ๋ช…2=๊ฐ’2,...] WHERE ์กฐ๊ฑด;
  • ๊ฐฑ์‹ ํ•˜๋Š” ์—ด์— ๋””ํดํŠธ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ : ๊ฐ’ ๋Œ€์‹  'DEFAULT'  ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ๋จ

 

INSERT

  • INSERT๋Š” ํ–‰ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ํ…Œ์ด๋ธ” ์ •์˜๋ฅผ ์ •ํ™•ํžˆ ํ™•์ธ ํ›„ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ
    • \G๋Š” ; ๋Œ€์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋”œ๋ฆฌ๋ฏธํ„ฐ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์„ธ๋กœ๋กœ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•จ
SHOW CREATE TABLE ํ…Œ์ด๋ธ”๋ช…\G
# ํ…Œ์ด๋ธ” ์ •์˜ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋‹จ์ˆœํžˆ ์—ด ์ •๋ณด ์กฐํšŒ์šฉ (Oracle ํ˜ธํ™˜)
DESC ํ…Œ์ด๋ธ”๋ช…;

 

  • INSERT๋ฌธ
# ๊ธฐ๋ณธ
INSERT INTO ํ…Œ์ด๋ธ”๋ช…(์ปฌ๋Ÿผ1[,์ปฌ๋Ÿผ2,...]) VALUES (๊ฐ’1[,๊ฐ’2,...]);
# Multi row insert (MySQL)
INSERT INTO city (name, code, district) VALUES ('Gimpo', 'KOR', 'Kyonggi'), 
('Seongnam', 'KOR', 'Kyonggi'), ('Hwaseong', 'KOR', 'Kyonggi');
# ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ
INSERT INTO ํ…Œ์ด๋ธ”1 SELECT FROM ํ…Œ์ด๋ธ”2; # SELECT๋ฌธ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ ˆ์ฝ”๋“œ๋กœ ์ž…๋ ฅ

 

DELETE

DELETE FROM ํ…Œ์ด๋ธ”๋ช… WHERE ์กฐ๊ฑด;

VIEW

๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”, ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ(ํ…Œ์ด๋ธ”๊ณผ ๋™์ผํ•˜์ง€๋งŒ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Œ)

 

VIEW ์–ธ์ œ ์“ธ๊นŒ? VIEW์˜ ์ด์ 

์„ค๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜์ž!

  1. ํŽธ๋ฆฌ์„ฑ : ๋ณต์žกํ•œ SELECT ๋ฌธ์„ ์ผ์ผ์ด ๋งค๋ฒˆ ๊ธฐ์ˆ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ ์—†์ด(๊ธฐ์–ต์žฅ์น˜์˜ ์šฉ๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ) ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ณด์•ˆ์„ฑ : ํ•„์š”ํ•œ ์—ด๊ณผ ํ–‰๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋ฏผ๊ฐํ•œ ์ปฌ๋Ÿผ์€ ๋งˆ์Šคํ‚นํ•˜๊ธฐ
  3. ๋…๋ฆฝ์„ฑ : ๊ธฐ์กด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ทฐ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ, ๊ฐฑ์‹  ์‹œ์—๋„ ๋ทฐ ์ •์˜์— ๋”ฐ๋ฅธ ๊ฐฑ์‹ ์œผ๋กœ ํ•œ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ทฐ๋ฅผ ์ œ๊ฑฐ(DROP VIEW)ํ•ด๋„ ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

VIEW ์ž‘์„ฑ

CREATE VIEW ๋ทฐ์ด๋ฆ„(์—ด๋ช…1[, ์—ด๋ช…2, ...]) AS SELECT๋ฌธ;

 

VIEW ์ž…๋ ฅ, ๊ฐฑ์‹  ์ œํ•œ

  • ๊ฐฑ์‹  ๋ถˆ๊ฐ€
    • ์–ด๋–ค ํ–‰์ด ๋Œ€์‘ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์ข‹์„์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ
  • ์‚ฝ์ž… ๋ถˆ๊ฐ€
    • 2๊ฐ€์ง€ ์ด์ƒ ํ…Œ์ด๋ธ”์„ ์กฐํ•ฉํ•ด ์ž‘์„ฑํ•œ ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์–ด๋Š ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•˜๋ฉด ์ข‹์„์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
    • ์„ ํƒ๋œ ์—ด ์ด์™ธ์˜ ์—ด์— ๊ธฐ๋ณธ๊ฐ’๋„ ์—†๊ณ  NULL๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ (ํ•ด๋‹น ์—ด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ)

SUBQUERY

ํ•˜๋‚˜์˜ SQL ๋ฌธ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ SQL ๋ฌธ

 

์ฃผ์˜์‚ฌํ•ญ

  1. ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•  ๊ฒƒ
  2. ORDER BY๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค
  3. ๋‹จ์ผ ํ–‰ ๋˜๋Š” ๋ณต์ˆ˜ ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
SELECT		-- ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ
FROM		-- ์ธ๋ผ์ธ ๋ทฐ
WHERE		-- ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋“ฑ
HAVING		-- ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋“ฑ
ORDER BY	-- ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ


-- ํ…Œ์ด๋ธ”2์˜ ์ •๋ณด๋ฅผ ๋ฝ‘์•„์„œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”1์— ๋„ฃ์–ด์ค€๋‹ค.
-- value()๋“ค์–ด๊ฐˆ ์ž๋ฆฌ๋ฅผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋Œ€์ฒด ํ–ˆ๋‹ค.
INSERT INTO table1 (SELECT * FROM table2);


-- ์ธํ„ด์˜ ์ •๋ณด๋ฅผ ๊ตฌํ•ด์™€์„œ ์‚ญ์ œํ•œ๋‹ค. 
DELETE FROM employee 
WHERE id = (SELECT id FROM employee where office_worker = '์ธํ„ด' );


-- ์ธํ„ด์— ์ •๋ณด๋ฅผ ๊ตฌํ•ด์™€์„œ ๊ธ‰์—ฌ๋ฅผ 10๋งŒ์› ์ธ์ƒํ•œ๋‹ค.
UPDATE employee SET salary=(salary+100000)
WHERE id = (SELECT id FROM employee where office_worker = '์ธํ„ด' );
  • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ : ํ•œ ํ–‰๋งŒ ๋ฐ˜ํ™˜
  • ์ธ๋ผ์ธ ๋ทฐ : SQL๋ฌธ์ด ์‹คํ–‰๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๋ทฐ์ด๊ธฐ ๋•Œ๋ฌธ์— DB์— ์ €์žฅ๋˜์ง€ ์•Š์Œ (๋™์ , ์ž„์‹œ์ )
  • ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ : =, <, <=, >, >=, <> ์—ฐ์‚ฐ์ž๋กœ ์–ป์€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ 1๊ฐœ ์ดํ•˜ ํ–‰์„ ๋ฐ˜ํ™˜
  • ๋ณต์ˆ˜ ํ–‰(์ค‘์ฒฉ) ์„œ๋ธŒ์ฟผ๋ฆฌ : IN, ANY, ALL, EXISTS ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋กœ ์–ป์€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์—ฌ๋Ÿฌ๊ฐœ ํ–‰์„ ๋ฐ˜ํ™˜

JOIN

2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

ON ์„ ์ด์šฉํ•ด์„œ ๊ฒฐํ•ฉ์กฐ๊ฑด์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•จ

 

INNER JOIN

ON ์œผ๋กœ ์ง€์ •ํ•œ ๊ฒฐํ•ฉ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ์„ 2๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ

SELECT ์„ ํƒํ•  ์—ด ๋ชฉ๋ก FROM ํ…Œ์ด๋ธ”1 INNER JOIN ํ…Œ์ด๋ธ”2 ON ๊ฒฐํ•ฉ์กฐ๊ฑด;

 

OUTER JOIN

ํ•œ ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ํ–‰์„ ํ‘œ์‹œํ•˜๊ณ  ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์€ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰์ด ์žˆ์œผ๋ฉด ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ

https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

  • ํŠน๋ณ„ํ•œ ์ด์œ (์ฟผ๋ฆฌ ์ž๋™ ์ƒ์„ฑ์œผ๋กœ ํ…Œ์ด๋ธ”1, ํ…Œ์ด๋ธ”2์˜ ์ฟผ๋ฆฌ์—์„œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋“ฑ)๊ฐ€ ์•„๋‹ˆ๋ฉด LEFT OUTER JOIN ์‚ฌ์šฉ
SELECT ์„ ํƒํ•  ์—ด ๋ชฉ๋ก FROM ํ…Œ์ด๋ธ”1 LEFT OUTER JOIN ํ…Œ์ด๋ธ”2 ON ๊ฒฐํ•ฉ์กฐ๊ฑด;
SELECT ์„ ํƒํ•  ์—ด ๋ชฉ๋ก FROM ํ…Œ์ด๋ธ”1 RIGHT OUTER JOIN ํ…Œ์ด๋ธ”2 ON ๊ฒฐํ•ฉ์กฐ๊ฑด;

์ฒดํฌํฌ์ธํŠธ (SQL ์ฝ”๋”ฉ์˜ ๊ธฐ์ˆ  ์ฐธ์กฐ)

๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง๊ณผ ๊ฒ€์ƒ‰

  • LIKE ์ œ๋Œ€๋กœ ์“ฐ๊ธฐ
    • LIKE '%keyword%'์ฒ˜๋Ÿผ ์ „ํ›„๋ฐฉ ๋ชจ๋‘ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • LIKE๋Š” ์ตœ๋Œ€ํ•œ ์ž์„ธํ•˜๊ฒŒ
  • ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ผ ๋•Œ
    • ์ด๋ก ์ ์œผ๋กœ๋Š” EXISTS๊ฐ€ NOT IN๋ณด๋‹ค ๋น ๋ฆ„
    • ๋˜๋Š” LEFT JOIN์„ ์‚ฌ์šฉํ•˜๊ณ  WHERE์—์„œ NULL๊ฐ’์„ ์ฐพ๋Š” Frustrated JOIN ์‚ฌ์šฉํ•˜๊ธฐ

 

GROUP BY

  1. GROUP BY ์ ˆ์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜์ž
    • ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ GROUP BY ์ ˆ์€ SELECT DISTINCT์™€ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค
    • ์ง‘๊ณ„ ์ˆ˜ํ–‰ ์ „ WHERE ์ ˆ์ด ์ ์šฉ๋œ๋‹ค
    • GROUP BY ์ ˆ์€ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ง‘๊ณ„ํ•œ๋‹ค
    • HAVING ์ ˆ์€ ์ง‘๊ณ„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ•„ํ„ฐ๋งํ•œ๋‹ค
    • ORDER BY ์ ˆ์€ ๋ณ€ํ˜•๋œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ •๋ ฌํ•œ๋‹ค
    • SELECT ์ ˆ์—์„œ ์ง‘๊ณ„ ํ•จ์ˆ˜๋‚˜ ์ง‘๊ณ„ ๊ณ„์‚ฐ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์€ GROUP BY ์ ˆ์— ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค
  1. GROUP BY ์ ˆ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์ž
    • HAVING ์ ˆ์˜ ์ง„์ •ํ•œ ํž˜์€ ํ•œ ๊ทธ๋ฃน์˜ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ์ง‘๊ณ„ ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋Š” ๋Šฅ๋ ฅ์— ์žˆ๋‹ค.
    • ๋ณ„์นญ์œผ๋กœ SELECT ์ ˆ์—์„œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, HAVING ์ ˆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํ•ด๋‹น ํ‘œํ˜„์‹์„ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. (?)
  2. ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด GROUP BY๋‚˜ HAVING ์ ˆ์„ ์‚ฌ์šฉํ•˜์ž
SELECT SUM(col) AS total
GROUP BY ...
HAVING SUM(col) ...;
  1. GROUP BY ์ ˆ ์—†์ด ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์ž

 

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

  1. ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์–ด๋””์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‘์ž
    • ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ผ๋ฉด ์–ด๋””์—๋‚˜ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
    • ํ…Œ์ด๋ธ” ์„œ๋ธŒ์ฟผ๋ฆฌ: FROM, JOIN ๋“ฑ์— ์‚ฌ์šฉ
    • ๋‹จ์ผ ์ปฌ๋Ÿผ ์„œ๋ธŒ์ฟผ๋ฆฌ: IN, NOT IN ์กฐ๊ฑด์— ์‚ฌ์šฉ
    • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ
  1. ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ์—ฐ๊ด€์„ฑ ์—†๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์ฐจ์ด์ ์„ ํŒŒ์•…ํ•˜์ž
  2. ์„œ๋ธŒ์ฟผ๋ฆฌ ๋Œ€์‹  ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด ๋” ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ž
SELECT NAME
FROM BEERSTYLE
WHERE CountryFK IN (
    SELECT CountryID
    FROM Countries
    WHERE CountryNm = "Belgium"
);

SELECT S.NAME
FROM STYLE AS S
INNER JOIN Countries AS c
    ON S.CountryFK = C.CountryID
WHERE C.CountryNm = "Belgium";

 

์กฐ์ธ

  1. LEFT JOIN์˜ ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฑธ๋Ÿฌ๋‚ด์ž
  1. OUTER JOIN์—์„œ๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” COUNT(*) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž 
    • '*'๋ฅผ ์‚ฌ์šฉํ•ด COUNT๋ฅผ ํ•˜๋ฉด row ์ž์ฒด๋ฅผ ์นด์šดํŠธํ•œ๋‹ค. ์ฆ‰ ๋ชจ๋“  ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด NULL๋กœ ์ฑ„์›Œ์ ธ ์žˆ์–ด๋„ ์นด์šดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋ฐ˜๋ฉด์— ์ปฌ๋Ÿผ๋ช…์„ ์‚ฌ์šฉํ•ด COUNT๋ฅผ ํ•˜๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด NULL์ด๋ฉด ์นด์šดํŠธํ•˜์ง€ ์•Š๋Š”๋‹ค. 
    • NULL ๊ฐ’์ด ์žˆ๋Š” ๋กœ์šฐ๋ฅผ ํฌํ•จํ•ด ๋ชจ๋“  ๋กœ์šฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ : COUNT(*)
    • ์ปฌ๋Ÿผ ๊ฐ’์ด NULL์ด ์•„๋‹Œ ๋กœ์šฐ์˜ ๊ฐœ์ˆ˜๋งŒ ์„ธ๊ธฐ : COUNT(์ปฌ๋Ÿผ๋ช…)
  • EXPLAIN, STRAIGHT JOIN(์™ผ์ชฝ ํ…Œ์ด๋ธ”๋ถ€ํ„ฐ ์ฝ๋Š” ์กฐ์ธ), SEMI JOIN(๋ฉ”์ธ ์ฟผ๋ฆฌ ํ…Œ์ด๋ธ”๊ณผ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธ)
  • ์กฐ์ธ๋˜์–ด์•ผ ํ•  ๊ฐ ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ๋ฒ”์œ„์™€ ์ˆœ์„œ์— ๋”ฐ๋ผ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
    • ๊ฐ€์žฅ ์ข์€ ๋ฒ”์œ„๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ• ์ˆ˜๋ก ์กฐ์ธ ํšจ์œจ์€ ์ฆ๊ฐ€

 

 

 

 

 

 

 

์ฐธ๊ณ 

https://mozi.tistory.com/233

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC

+ Recent posts