SQL

SQL

Tags
Backend
SQL
Published
Author
SQL(Structured Query Language)SQL ๋ฌธ๋ฒ• ์ˆœ์„œSQL ์‹ค์ œ ์‹คํ–‰ ์ˆœ์„œTABLEํ…Œ์ด๋ธ” ์กฐํšŒํ…Œ์ด๋ธ” ์ƒ์„ฑํ…Œ์ด๋ธ” ์‚ญ์ œํ…Œ์ด๋ธ” ๋ณ€๊ฒฝDBEntity(์—”ํ„ฐํ‹ฐ)Attribute(์†์„ฑ)Relationship(๊ด€๊ณ„)Identifier(์‹๋ณ„์ž)๋ฐ์ดํ„ฐ ์‚ฝ์ž… (INSERT)column ์„ ํƒ ์กฐํšŒ (SELECT)์ „์ฒด ํ…Œ์ด๋ธ” *LIMIT OFFSET๋ ˆ์ฝ”๋“œ ์‚ญ์ œ (DELETE)๋ ˆ์ฝ”๋“œ ์ˆ˜์ • (UPDATE)๊ธฐํƒ€ ํ•จ์ˆ˜wildecards(%, _)NULL ์ฒดํฌASGROUP BYJOINInner JOINSELF INNER JOINOUTER JOINLEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOINJOIN ์ •๋ฆฌ๋ณธAPPLY ์—ฐ์‚ฐ์žInline view (์ธ๋ผ์ธ ๋ทฐ)Multi Row Sub Query (๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ)MSSQL๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰BETWEEN A AND BROLLUPPIVOTCASE WHENํ”„๋กœ์‹œ์ € ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•จ์ˆ˜Stored Procedure(์ €์žฅ ํ”„๋กœ์‹œ์ €)์ผ๋ฐ˜ ์ฟผ๋ฆฌ๋ฌธ VS ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ช…๋ น์–ดMERGE ๊ตฌ๋ฌธWHEN ๊ตฌ๋ฌธdbodbo์™€ ์Šคํ‚ค๋งˆ ์ฐจ์ดTriggerMSSQL ํŠธ๋ฆฌ๊ฑฐqueryUNIONCursor๋ฌธCursorํŠน์ง•๋‚ด ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰STRING_AGG()CHARINDEX()IIFTOP์‹œ์ž‘์ผ์ž ์ข…๋ฃŒ์ผ์ž ์‚ฌ์ด ๋ชจ๋“  ์ผ์ž ์กฐํšŒ

SQL(Structured Query Language)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜, ์กฐ์ž‘, ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด
  • DDL(๋ฐ์ดํ„ฐ ์ •์˜์–ด) : ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์–ธ์–ด
  • DML(๋ฐ์ดํ„ฐ ์กฐ์ž‘์–ด) : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์–ธ์–ด
  • DCL(๋ฐ์ดํ„ฐ ์ œ์–ด์–ด) : ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๋Š” ์–ธ์–ด

SQL ๋ฌธ๋ฒ• ์ˆœ์„œ

SELECT โ†’ FROM โ†’ WHERE โ†’ GROUP BY โ†’ HAVING โ†’ ORDER BY

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

FROM โ†’ ON โ†’ JOIN โ†’ WHERE โ†’ GROUP BY โ†’ HAVING โ†’ SELECT โ†’ DISTINCT โ†’ ORDER BY
  • FROM : ๊ฐ ํ…Œ์ด๋ธ” ํ™•์ธ
  • ON : ์กฐ์ธ ์กฐ๊ฑด ํ™•์ธ
  • JOIN : ํ…Œ์ด๋ธ” ์กฐ์ธ(๋ณ‘ํ•ฉ)
  • WHERE : ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์กฐ๊ฑด ํ™•์ธ
  • GROUP BY : ํŠน์ • ์นผ๋Ÿผ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ทธ๋ฃนํ™”
  • HAVING : ๊ทธ๋ฃนํ™” ์ดํ›„ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์กฐ๊ฑด ํ™•์ธ
  • SELECT : ๋ฐ์ดํ„ฐ ์ถ”์ถœ
  • DISTINCT : ์ค‘๋ณต ์ œ๊ฑฐ
  • ORDER BY : ๋ฐ์ดํ„ฐ ์ •๋ ฌ

TABLE

ํ…Œ์ด๋ธ” ์กฐํšŒ

  • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
SELECT ํ•„๋“œ๋ช… FROM ํ…Œ์ด๋ธ”๋ช… ORDER BY ํ•„๋“œ๋ช… DESC;
  • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
SELECT ํ•„๋“œ๋ช… FROM ํ…Œ์ด๋ธ”๋ช… ORDER BY ํ•„๋“œ๋ช… ASC;

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE users( id INTEGER PRIMARY KEY, name TEXT ); CREATE TABLE ํ…Œ์ด๋ธ”๋ช… ( ์ปฌ๋Ÿผ1 ๋ฐ์ดํ„ฐํƒ€์ž… ์ œ์•ฝ์กฐ๊ฑด, ์ปฌ๋Ÿผ2 ๋ฐ์ดํ„ฐํƒ€์ž… ์ œ์•ฝ์กฐ๊ฑด, ์ปฌ๋Ÿผ3 ๋ฐ์ดํ„ฐํƒ€์ž… ์ œ์•ฝ์กฐ๊ฑด, ... ); // NOT NULL : ๊ณต๋ฐฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜ต์…˜ // AUTO_INCREMENT : ์ž๋ฃŒํ˜•์ด INT(์ •์ˆ˜ํ˜•)์ผ๋•Œ ์ ์šฉ ๊ฐ€๋Šฅ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ž๋™ ์ฆ๊ฐ€ // PRIMARY KEY : ์ค‘๋ณต ๊ฐ’ ํ—ˆ์šฉ ์•ˆํ•˜๋Š” ์ปฌ๋Ÿผ 1๊ฐœ ์„ ํƒ (ํ…Œ์ด๋ธ” ๋‚ด ๊ณ ์œ ๊ฐ’ ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
notion image

ํ…Œ์ด๋ธ” ์‚ญ์ œ

DROP TABLE users;

ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

  • table ์ด๋ฆ„ ๋ณ€๊ฒฝ
ALTER TABLE <๊ธฐ์กด table๋ช…> RENMAE TO <๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ table๋ช…>
  • ์ƒˆ๋กœ์šด column ์ถ”๊ฐ€
ALTER TABLE <table๋ช…> ADD COLUMN <์ถ”๊ฐ€ํ•  colum๋ช…> <column ํƒ€์ž…> <์˜ต์…˜>;
  • column ์ด๋ฆ„ ๋ณ€๊ฒฝ
ALTER TABLE <table๋ช…> RENAME COLUMN <๊ธฐ์กด column๋ช…> TO <๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ column๋ช…>;
  • ํ…Œ์ด๋ธ” ์†์„ฑ ๋ณ€๊ฒฝ
ALTER TABLE [ํ…Œ์ด๋ธ”๋ช…] change [ํ•ด๋‹นํ•„๋“œ] [๋ฐ”๊ฟ€ ํ•„๋“œ๋ช…] [๋ณ€๊ฒฝํ• ์†์„ฑ]

DB

Entity(์—”ํ„ฐํ‹ฐ)

  • ํ…Œ์ด๋ธ”
  • ์—…๋ฌด์—์„œ ํ•„์š”ํ•˜๊ณ  ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ง‘ํ•ฉ์ ์ธ ๊ฒƒ์ด๋‹ค.
  • ์ธ์Šคํ„ด์Šค์˜ ์ง‘ํ•ฉ
  • ์†์„ฑ์ด ์กด์žฌํ•ด์•ผํ•˜๊ณ  ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผํ•จ

Attribute(์†์„ฑ)

  • ์ปฌ๋Ÿผ
  • ์ธ์Šคํ„ด์Šค๋กœ ์˜๋งˆ์ƒ ๋”์ด์ƒ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ตœ์†Œ์˜ ๋ฐ์ดํ„ฐ ๋‹จ์œ„

Relationship(๊ด€๊ณ„)

  • ํ–‰
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์˜ ์ „์ฒด ์ง‘ํ•ฉ์„ ์˜๋ฏธ

Identifier(์‹๋ณ„์ž)

  • ํ•˜๋‚˜์˜ ์—”ํ„ฐํ‹ฐ ๋‚ด์— ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค ์ค‘์— ์—”ํ„ฐํ‹ฐ๋ฅผ ๋Œ€ํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ
  • ํ•˜๋‚˜์˜ ์—”ํ„ฐํ‹ฐ ์•ˆ์—๋Š” ๋ฐ˜๋“œ์‹œ ์œ ์ผํ•œ ์‹๋ณ„์ž๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ

๋ฐ์ดํ„ฐ ์‚ฝ์ž… (INSERT)

INSERT INTO users (name, age) VALUES ('ํ™๊ธธ๋™', 23);
table์˜ column์— ์žˆ๋Š” ๋ชจ๋“  VALUE๋ฅผ ๋„ฃ์„๋•Œ์—๋Š” column๋ช…์„ ์ ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋จ

column ์„ ํƒ ์กฐํšŒ (SELECT)

์ „์ฒด ํ…Œ์ด๋ธ” *

LIMIT

์œ„์—์„œ N๊ฐœ์˜ ๋ฐ์ดํ„ฐ
SELECT rowid, name FROM users LIMIT 2;

OFFSET

์•ž์— N๊ฐœ ์ œ๊ฑฐ
SELECT rowid, name FROM users LIMIT 1 OFFSET 2;

๋ ˆ์ฝ”๋“œ ์‚ญ์ œ (DELETE)

DELETE FROM users WHERE rowid=2; SELECT rowid, * FROM users; rowid name age address ----- ---- --- ------- 1 ํ™๊ธธ๋™ 30 ์„œ์šธ 3 ๊ฐ€๋‚˜๋‹ค 23 ๋ถ€์‚ฐ

๋ ˆ์ฝ”๋“œ ์ˆ˜์ • (UPDATE)

UPDATE users SET name="ํ™๊ธธ๋™", address="์ œ์ฃผ๋„" WHERE rowid='3' SELECT * FROM users; rowid name age address ----- ---- --- ------- 1 ํ™๊ธธ๋™ 30 ์„œ์šธ 3 ํ™๊ธธ๋™ 23 ์ œ์ฃผ๋„

๊ธฐํƒ€ ํ•จ์ˆ˜

  • COUNT : ์„ ํƒํ•œ ํ–‰์˜ ๋ ˆ์ฝ”๋“œ ๊ฐฏ์ˆ˜ ์กฐํšŒ
SELECT COUNT(*) FROM users; // users ํ…Œ์ด๋ธ” ์ „์ฒด ๋ ˆ์ฝ”๋“œ ๊ฐฏ์ˆ˜
  • AVG : ํ‰๊ท 
SELECT AVG(age) FROM users WHERE age>=30; // 30์‚ด ์ด์ƒ์ธ ์‚ฌ๋žŒ๋“ค ๋‚˜์ด์˜ ํ‰๊ท 
  • MAX : ๊ฐ€์žฅ ๋†’์€ ๊ฐ’
SELECT name, MAX(age) FROM users; // ๋‚˜์ด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‚ฌ๋žŒ๊ณผ ๊ทธ ๋‚˜์ด๋ฅผ ์กฐํšŒ

wildecards(%, _)

  • % : ์ด ์ž๋ฆฌ์— ๋ฌธ์ž์—ด์ด ์กด์žฌํ•  ์ˆ˜๋„ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค
  • _ : ๋ฌด์กฐ๊ฑด ๋‹จ์ผ ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค
SELECT * FROM users WHERE name LIKE '%๋™';

NULL ์ฒดํฌ

WHERE col_name is not null WHERE col_name is null
SELECT ANIMAL_TYPE, INFNULL(NAME, 'No name') NAME, SEX_UPON_INTKE FROM ANIMAL_INS

AS

SELECT ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ์นผ๋Ÿผ์— AS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

GROUP BY

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ญ‰์ณ์ค๋‹ˆ๋‹ค.
ex) ํ–‰์ด ๋‘๊ฐœ๊ฐ€ ๋œ๊ฑธ ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ํ•ฉ์น˜๊ธฐ ์œ„ํ•จ
์ง‘๊ณ„ํ•จ์ˆ˜
  • count
  • sum
  • max
  • min
  • avg

JOIN

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ โ€˜๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”โ€™์„ ์—ฐ๊ฒฐํ•˜์—ฌ โ€˜ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ์˜ ํ…Œ์ด๋ธ”โ€™๋กœ ๋งŒ๋“œ๋Š”๊ฒƒ์„ ์˜๋ฏธ
  • Inner Join
  • Outer Join

Inner JOIN

๋‘ ํ…Œ์ด๋ธ”์—์„œ โ€˜๊ณตํ†ต๋œ ๊ฐ’โ€™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ–‰๋“ค๋งŒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
SELECT * FROM ํ…Œ์ด๋ธ”1 INNER JOIN ํ…Œ์ด๋ธ”2 ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;
notion image

SELF INNER JOIN

ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ๋‹ค๋ฅธ ์—ด์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” โ€˜์ž๊ธฐ ์ž์‹ ๊ณผ์˜ ์กฐ์ธโ€™๋ฐฉ๋ฒ•
SELECT ํ…Œ์ด๋ธ”1.์—ด, ํ…Œ์ด๋ธ”2.์—ด FROM ํ…Œ์ด๋ธ”1 t1 JOIN ํ…Œ์ด๋ธ”1 t2 ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;

OUTER JOIN

๋‘ ํ…Œ์ด๋ธ”์—์„œ โ€˜๊ณตํ†ต๋œ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํ–‰๋“คโ€™๋„ ๋ฐ˜ํ™˜

LEFT OUTER JOIN

โ€˜์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰โ€™๊ณผ โ€˜์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ๊ณตํ†ต๋œ ๊ฐ’โ€™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ–‰๋“ค์„ ๋ฐ˜ํ™˜
SELECT * FROM ํ…Œ์ด๋ธ”1 LEFT JOIN ํ…Œ์ด๋ธ”2 ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;
notion image

RIGHT OUTER JOIN

โ€˜์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰โ€™๊ณผ โ€˜์™ผ์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ๊ณตํ†ต๋œ ๊ฐ’โ€™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ–‰๋“ค์„ ๋ฐ˜ํ™˜
SELECT * FROM ํ…Œ์ด๋ธ”1 RIGHT JOIN ํ…Œ์ด๋ธ”2 ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;
notion image

FULL OUTER JOIN

๋‘ ํ…Œ์ด๋ธ”์—์„œ โ€˜๋ชจ๋“  ๊ฐ’โ€™์„ ๋ฐ˜ํ™˜
SELECT * FROM ํ…Œ์ด๋ธ”1 FULL OUTER JOIN ํ…Œ์ด๋ธ”2 ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;
notion image

JOIN ์ •๋ฆฌ๋ณธ

notion image
INNER JOIN (๋‚ด๋ถ€์กฐ์ธ)์€ ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ๋‘ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์ง€์ •ํ•œ ์—ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค. OUTER JOIN (์™ธ๋ถ€์กฐ์ธ)์€ ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. CROSS JOIN (์ƒํ˜ธ์กฐ์ธ)์€ ํ•œ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰๊ณผ ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ์กฐ์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. SELF JOIN (์ž์ฒด์กฐ์ธ)์€ ์ž์‹ ์ด ์ž์‹ ๊ณผ ์กฐ์ธํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ 1๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

APPLY ์—ฐ์‚ฐ์ž

SELECT .. FROM [์™ธ๋ถ€ ํ…Œ์ด๋ธ”] CROSS | OUTER APPLY (SELECT .. FROM [๋‚ด๋ถ€ ํ…Œ์ด๋ธ”] WHERE [์กฐ์ธ ์กฐ๊ฑด์ž])
  • CROSS APPLY = INNER JOIN
    • ๋‚ด๋ถ€ ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ์œผ๋กœ๋ถ€ํ„ฐ ์กฐ์ธ ํ‚ค๋กœ ๊ฒฐํ•ฉํ•œ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์˜ ํ–‰๋งŒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • OUTER APPLY = LEFT OUTER JOIN
    • ๋‚ด๋ถ€ ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ์œผ๋กœ๋ถ€ํ„ฐ ์กฐ์ธ ํ‚ค์— ๊ฒฐํ•ฉํ•œ ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์˜ ํ–‰ + ๊ทธ๋ ‡์ง€ ์•Š์€ ํ–‰ ์ „๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ํ–‰์€ ์—ด์—์„œ NULL์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Inline view (์ธ๋ผ์ธ ๋ทฐ)

SELECT ์ ˆ์˜ ๊ฒฐ๊ณผ๋ฅผ FROM ์ ˆ์—์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

Multi Row Sub Query (๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ)

  • IN : ๊ฐ™์€ ๊ฐ’์„ ์ฐพ์Œ (=)
  • >ANY : ์ตœ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜
  • <ANY : ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜
  • <ALL : ์ตœ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜
  • >ALL : ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜
> any(a, b) : a,b ์ค‘ ์ตœ์†Œ๋ณด๋‹ค ํฐ > all(a, b) : a,b ์ค‘ ์ตœ๋Œ€๋ณด๋‹ค ํฐ < any(a, b) : a,b ์ค‘ ์ตœ๋Œ€๋ณด๋‹ค ์ž‘์€ < all(a, b) : a,b ์ค‘ ์ตœ์†Œ๋ณด๋‹ค ์ž‘์€
๐Ÿ’ก
where์ ˆ์ด ์•„๋‹Œ! ์„œ๋ธŒ์ฟผ๋ฆฌ์— min, max๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Œ

MSSQL

๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰

์ƒ์œ„ n๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT TOP n * FROM ํ…Œ์ด๋ธ”๋ช…
์นผ๋Ÿผ์ด ํŒจํ„ด๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
SELECT * FROM ํ…Œ์ด๋ธ”๋ช… WHERE ์นผ๋Ÿผ LIKE 'ํŒจํ„ด' // 'k%'(k๋กœ ์‹œ์ž‘๋˜๋Š”),'%k%'(์ค‘๊ฐ„์— k๊ฐ€ ์žˆ๋Š”), 'k%'(k๋กœ ๋๋‚˜๋Š”) // 'p_'(p๋กœ ์‹œ์ž‘ํ•˜๋Š” 2์ž๋ฆฌ), '_ _p'(3์ž๋ฆฌ ๋ฐ์ดํ„ฐ์ค‘ p๋กœ ๋๋‚˜๋Š”)
isnull, not null ์ฒ˜๋ฆฌ
WHERE ISNULL(์นผ๋Ÿผ,"") // is null WHERE ISNULL(์นผ๋Ÿผ,"")<> // not null

BETWEEN A AND B

SELECT * FROM employeeWHERE salary WHERE BETWEEN 300 AND 500; // salary๊ฐ€ 300์ด์ƒ 500์ดํ•˜์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ

ROLLUP

GROUP BY๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, GROUP BY๋กœ GROUPING๋œ ํ–‰๋“ค ๋ฐ์ดํ„ฐ ์ดํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ
SELECT job, deptno, SUM(sal) AS total_sal FROM emp WHERE job IN ('MANAGER', 'CLERK', 'SALESMAN') GROUP BY ROLLUP(job, deptno)
notion image
์†Œ๊ณ„ ์ œ๊ฑฐ ๋ฐฉ๋ฒ•
SELECT job, deptno, SUM(sal) AS total_sal FROM emp WHERE job IN ('MANAGER', 'CLERK', 'SALESMAN') GROUP BY ROLLUP(job, deptno) HAVING GROUPING(job) = 1 OR GROUPING
notion image

PIVOT

ํ–‰์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜
SELECT [PIVOT์—ด1], [PIVOT์—ด2], ...FROM ํ…Œ์ด๋ธ”๋ช… PIVOT (๋‚˜ํƒ€๋‚ด๊ณ ์žํ•˜๋Š” ๊ฐ’, FOR ํ–‰->์—ด๋กœ ๋ฐ”๊ฟ€ ์—ด IN ([PIVOT์—ด1], [PIVOT์—ด2], ...)) as ๋ณ„์นญ // UNPIVOT์€ ๋ฐ˜๋Œ€

CASE WHEN

CASE WHEN ์กฐ๊ฑด์ ˆ THEN ์ฐธ์ผ๋•Œ ๊ฐ’ ELSE ๊ฑฐ์ง“์ผ๋•Œ ๊ฐ’ END ์ปฌ๋Ÿผ๋ช…

ํ”„๋กœ์‹œ์ € ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

RAISERROR('๋ฉ”์‹œ์ง€', ์˜ค๋ฅ˜์‹ฌ๊ฐ๋„, ์ƒํƒœ[์˜ต์…˜]) // 1~10 : ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ •๋ณด // 11~16 : ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ // 17~25 : ์‹œ์Šคํ…œ ์˜ค๋ฅ˜

ํ•จ์ˆ˜

1. ์ˆ˜์น˜ํ•จ์ˆ˜ ROUND(์ˆ˜์น˜๊ฐ’, ๋ฐ˜์˜ฌ๋ฆผ์œ„์น˜) // ๋ฐ˜์˜ฌ๋ฆผ ๋ฐ ์ž๋ฅด๊ธฐ ABS(์ˆ˜์น˜๋ฐ์ดํ„ฐ) // ์ ˆ๋Œ“๊ฐ’ SIGN(์ˆ˜์น˜๋ฐ์ดํ„ฐ) // ๋ถ€ํ˜ธ SQRT(์ˆ˜์น˜๊ฐ’) // ์ œ๊ณฑ๊ทผ POWER(์ˆ˜์น˜๊ฐ’, n) // n์Šน 2. ๋ฌธ์ž์—ด ํ•จ์ˆ˜ ์ •๋ฆฌ Ascii() // ๋ฌธ์ž์—ด์˜ ์ œ์ผ ์™ผ์ชฝ ๋ฌธ์ž์˜ ์•„์Šคํ‚ค ์ฝ”๋“œ ๊ฐ’์„ ๋ฐ˜ํ™˜ Char() // ์ •์ˆ˜ ์•„์Šคํ‚ค ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜ Charindex() // ๋ฌธ์ž์—ด์—์„œ ์ง€์ •ํ•œ ์‹์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ Difference() // ๋‘ ๋ฌธ์ž์‹์— SOUNDEX ๊ฐ’ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ Left(), Right() // ๋ฌธ์ž์—ด ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ง€์ •ํ•œ ์ˆ˜๋งŒํผ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ Len() // ๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋ฐ˜ํ™˜ Lower() // ๋Œ€๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜ Ltrim(), Rtrim() // ๋ฌธ์ž์—ด์˜ ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ Nchar() // ์ง€์ •ํ•œ ์ •์ˆ˜ ์ฝ”๋“œ์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž ๋ฐ˜ํ™˜ Replace() // ๋ฌธ์ž์—ด์—์„œ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๋ฌธ์ž ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜ Replicate() // ๋ฌธ์ž์‹์„ ์ง€์ €ํ•œ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต Reverse() // ๋ฌธ์ž์—ด์„ ์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅ Space() // ์ง€์ •ํ•œ ์ˆ˜๋งŒํผ์˜ ๊ณต๋ฐฑ ๋ฌธ์ž ๋ฐ˜ํ™˜ Substring() // ๋ฌธ์ž,์ด์ง€๋Šํ…์ŠคํŠธ ๋˜๋Š” ์ด๋ฏธ์ง€ ์‹์˜ ์ผ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ Unicode() // ์‹์— ์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์ •์ˆ˜ ๊ฐ’์œผ ๋ฐ˜ํ™˜ Upper() // ์†Œ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜ Isnumeric() // ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์ˆซ์žํ˜•์ด๋ฉด 1 ์•„๋‹ˆ๋ฉด 0์„ ๋ฐ˜ํ™˜ Isdate() // ํ•ด๋‹น ๋ฌธ์ž์—ด์ด Datatime์ด๋ฉด 1 ์•„๋‹ˆ๋ฉด 0์„ ๋ฐ˜ํ™˜

Stored Procedure(์ €์žฅ ํ”„๋กœ์‹œ์ €)

ํŠน์ • ๋กœ์ง์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์—์„œ SQL ๋ช…๋ น์„ ์ปดํŒŒ์ผํ• ๋•Œ ์บ์‹œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • ๋ฐ˜๋ณต์ ์œผ๋กœ SQL ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ๋งคํšŒ ๋ช…๋ น๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฝ์œ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ๋‹ค ์ƒˆ๋กœ ๋งŒ๋“ค ํ•„์š”์—†์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์‹œ์ €๋ฅผ ๋ฐ˜๋ณต ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์„ ์ˆ˜์ • ์‹œ ํ”„๋กœ์‹œ์ €๋Š” ์„œ๋ฒ„์ธก์— ์žˆ์œผ๋ฏ€๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
์ €์žฅํ”„๋กœ์‹œ์ €์™€ ํ•จ์ˆ˜์˜ ์ฐจ์ด
  • ์ €์žฅํ”„๋กœ์‹œ์ € : ์ผ๋ จ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ, ๋ฆฌํ„ด๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์Œ, ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ํ•จ์ˆ˜ : ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์œ„ํ•œ ๊ธฐ๋Šฅ, ๋ฆฌํ„ด๊ฐ’์ด ํ•„์ˆ˜, ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์‹œ์ €๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.

์ผ๋ฐ˜ ์ฟผ๋ฆฌ๋ฌธ VS ์ €์žฅ ํ”„๋กœ์‹œ์ €

์ผ๋ฐ˜ ์ฟผ๋ฆฌ๋ฌธ ์ž‘๋™ ๋ฐฉ์‹
๊ตฌ๋ฌธ๋ถ„์„ โ†’ ๊ฐœ์ฒด ์ด๋ฆ„ ํ™•์ธ โ†’ ์‚ฌ์šฉ๊ถŒํ•œ ํ™•์ธ โ†’ ์ตœ์ ํ™” โ†’ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๊ณ„ํš ๋“ฑ๋ก(๋ฉ”๋ชจ๋ฆฌ(์บ์‹œ)) โ†’ ์‹คํ–‰
  • ๊ตฌ๋ฌธ๋ถ„์„ : ๊ตฌ๋ฌธ ์ž์ฒด์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ๋ถ„์„
  • ๊ฐœ์ฒด ์ด๋ฆ„ ํ™•์ธ : ํ…Œ์ด๋ธ”์ด ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š”์ง€ ํ™•์ธ
  • ์‚ฌ์šฉ๊ถŒํ•œ ํ™•์ธ : ํ˜„์žฌ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผ์ค‘์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
  • ์ตœ์ ํ™” : ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฌธ์ด ๊ฐ€์žฅ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •
  • ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰ ๊ณ„ํš ๋“ฑ๋ก : ํ•ด๋‹น ์‹คํ–‰๊ณ„ํš ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(์บ์‹œ)์— ๋“ฑ๋ก
์ €์žฅ ํ”„๋กœ์‹œ์ € ์ž‘๋™ ๋ฐฉ์‹
  1. ์ €์žฅํ”„๋กœ์‹œ์ € ์ •์˜ ๋‹จ๊ณ„
    1. Create Procedure โ†’ ๊ตฌ๋ฌธ ๋ถ„์„โ†’ ์ง€์—ฐ๋œ ์ด๋ฆ„ ํ™•์ธ โ†’ ์ƒ์„ฑ๊ถŒํ•œ ํ™•์ธ โ†’ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์— ๋“ฑ๋ก
      • ๊ตฌ๋ฌธ๋ถ„์„ : ๊ตฌ๋ฌธ์˜ ์˜ค๋ฅ˜ ํŒŒ์•…
      • ์ง€์—ฐ๋œ ์ด๋ฆ„ ํ™•์ธ : ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์ •ํ•˜๋Š” ์‹œ์ ์—์„œ ํ•ด๋‹น ๊ฐœ์ฒด(ํ…Œ์ด๋ธ”)๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†๋‹ค. ํ”„๋กœ์‹œ์ € ์‹คํ–‰ ๋‹น์‹œ์— ํ…Œ์ด๋ธ” ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธํ•จ(๊ฐœ์ฒด์ด๋ฆ„ ํ™•์ธ)
      • ์ƒ์„ฑ๊ถŒํ•œ ํ™•์ธ : ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์ƒ์„ฑํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
      • ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ” ๋“ฑ๋ก : ์ €์žฅ ํ”„๋กœ์‹œ์ €์˜ ์ด๋ฆ„ ๋ฐ ์ฝ”๋“œ๊ฐ€ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์— ๋“ฑ๋ก
  1. ์ฒ˜์Œ ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰
    1. ๊ตฌ๋ฌธ๋ถ„์„ ๋‹จ๊ณ„ ๋น ์ง„ ์ผ๋ฐ˜ ์ฟผ๋ฆฌ๋ฌธ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋™์ผ
      • ์ •์˜ ๋‹จ๊ณ„์—์„œ ์ง€์—ฐ๋œ ์ด๋ฆ„ํ™•์ธ์—์„œ ๋ฏธ๋ฃจ์–ด๋‘์—ˆ๋˜ ํ•ด๋‹น ๊ฐœ์ฒด ์กด์žฌ ์œ ๋ฌด๋ฅผ ๊ฐœ์ฒด ์ด๋ฆ„ ํ™•์ธ์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.
  1. ์ดํ›„ ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰
    1. ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋‘๋ฒˆ์งธ ์‹คํ–‰ โ†’ ๋ฉ”๋ชจ๋ฆฌ(์บ์‹œ)ํ™•์ธ โ†’ ์‹คํ–‰
      • ๋ฉ”๋ชจ๋ฆฌ(์บ์‹œ)์— ์žˆ๋Š” ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋‹จ์ถ•

๋ช…๋ น์–ด

CREATE PROC ํ”„๋กœ์‹œ์ €๋ช… AS SQL ๋ฌธ // ์ €์žฅ ํ”„๋กœ์‹œ์ € CREATE PROC ํ”„๋กœ์‹œ์ €๋ช… ๋ณ€์ˆ˜์„ ์–ธ AS SQL ๋ฌธ // ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ € CREATE PROC ํ”„๋กœ์‹œ์ €๋ช… WITH ENCRYPTION AS SQL ๋ฌธ // ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋ณด์•ˆ ์„ค์ • CREATE PROC ํ”„๋กœ์‹œ์ €๋ช… ์ธ์ˆ˜1 ๋ฐ์ดํ„ฐํ˜•, ...์ธ์ˆ˜2 ๋ฐ์ดํ„ฐํ˜• OUTPUT AS SQL๋ฌธ RETURN ๋ฆฌํ„ด๊ฐ’ // RETURN ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ € DROP PROCEDURE ํ”„๋กœ์‹œ์ €๋ช…1, ํ”„๋กœ์‹œ์ €๋ช…2 // ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‚ญ์ œ EXEC ํ”„๋กœ์‹œ์ €๋ช… ํŒŒ๋ผ๋ฏธํ„ฐ // ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ
BEGINโ€ฆEND // ๋ฌธ์žฅ์˜ ๋ธ”๋ก (SQL๋ฌธ๊ณผ ๋ณ€์ˆ˜์„ ์–ธ์€ BEGIN~END ์‚ฌ์ด์— ์ž‘์„ฑ) BEGIN END๋Š” ์ƒ๋žต๊ฐ€๋Šฅ DECLARE @๋ณ€์ˆ˜๋ช… ๋ฐ์ดํ„ฐํ˜• // ๋ณ€์ˆ˜ ์„ ์–ธ SET @๋ณ€์ˆ˜๋ช…=๊ฐ’ // ๋ณ€์ˆ˜์— ๊ฐ’ ์ง€์ • SET NOCOUNT ON // ๊ฒฐ๊ณผ ์ ์šฉ๋œ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ์˜ต์…˜ PRINT @๋ณ€์ˆ˜๋ช… // ํ•œ๊ฐœ์˜ ๋ณ€์ˆ˜ ์ถœ๋ ฅ SELECT @๋ณ€์ˆ˜1, @๋ณ€์ˆ˜2 // ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ณ€์ˆ˜ ์ถœ๋ ฅ IF // ์กฐ๊ฑด ์ˆ˜ํ–‰ ์ˆ˜ํ–‰1 ELSE ์ˆ˜ํ–‰2 WHILE ์กฐ๊ฑด1 // ๋ฐ˜๋ณต ์ˆ˜ํ–‰ BEGIN IF ์กฐ๊ฑด2 BREAK - WHILE ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค CONTINUE - ์ˆ˜ํ–‰์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด1๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค ์ˆ˜ํ–‰ END EXEC ์ €์žฅํ”„๋กœ์‹œ์ € // SQL๋ฌธ์„ ์‹คํ–‰ EXEC @(๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ SQL๋ฌธ) GO // BATCH๋ฅผ ๊ตฌ๋ถ„ ์ง€์ •
ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์œ ๋ฌด ํ™•์ธ
IF EXISTS (SELECT๋ฌธ) // ์กฐ๊ฑด๋ฌธ BEGIN // ๊ฐ’์ด ํ•˜๋‚˜์ด์ƒ ์žˆ์„ ์‹œ ์‹คํ–‰ SELECT1 END ELSE BEGIN // ๊ฐ’์ด ์—†์„ ๋•Œ ์‹คํ–‰ SELECT2 END // ๋ฆฌํ„ดํ˜•์‹ bool
ํ…Œ์ด๋ธ”์—์„œ ์ตœ์ƒ์œ„ ํ•œ์ค„์— ๋ฐ์ดํ„ฐ๋“ค ์œ ๋ฌด
IF EXISTS (SELECT TOP 1 1 from ...) // ๋ณด๊ธฐ ํŽธํ•˜๋ผ๊ณ  ํ•˜๋Š”๊ฑฐ์ž„ BEGIN ... END // ()์•ˆ์— ์ฟผ๋ฆฌ๋ฌธ์ด ์žˆ๋Š๋ƒ ์—†๋Š๋ƒ ์žˆ์œผ๋ฉด (BEGIN)

MERGE ๊ตฌ๋ฌธ

UPDATE, DELETE, INSERT๋ฅผ ํ•œ ๋ฒˆ์— ์ž‘์—…์ด ๊ฐ€๋Šฅ
(merge๋ฌธ์„ ์•ˆ ์“ฐ๋ฉด select๋กœ if๋ฌธ์„ ๊ฑธ์–ด์•ผ upadate๋‚˜ insert๊ฐ€ ๊ฐ€๋Šฅ)
MERGE INTO (๋ณ€๊ฒฝํ•  ํ…Œ์ด๋ธ”) USING (๋น„๊ตํ•  ํ…Œ์ด๋ธ”) ON (์กฐ๊ฑด๋ฌธ) WHEN MATCHED THEN (์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๊ฒฝ์šฐ) UPDATE SET WHEN NOT MATCHED THEN (์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ) DELETE
  • Target ํ…Œ์ด๋ธ”๊ณผ Source ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—” MATCHED ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๊ณ , ํ•ด๋‹น ํ–‰์€ Target ํ…Œ์ด๋ธ”์˜ ํ–‰์„ Updateํ•˜๊ฑฐ๋‚˜ Deleteํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Target ํ…Œ์ด๋ธ”์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ Source ํ…Œ์ด๋ธ”์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” NOT MATCHED BY SOURCE ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋ฉฐ, ํ•ด๋‹น ํ–‰์€ MATCHED์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Target ํ…Œ์ด๋ธ”์˜ ํ–‰์„ Updateํ•˜๊ฑฐ๋‚˜ Deleteํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Source ํ…Œ์ด๋ธ”์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ Target ํ…Œ์ด๋ธ”์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” NOT MATHCED BY TARGET ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๊ณ , ํ•ด๋‹น ํ–‰์€ Target ํ…Œ์ด๋ธ”๋กœ INSERT๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

WHEN ๊ตฌ๋ฌธ

MATCHED
  • MERGE๋ฌธ์— 1๊ฐœ๋งŒ ํฌํ•จ
  • MATCHED์ ˆ์„ 2๊ฐœ ํฌํ•จ์‹œํ‚ฌ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ์กฐ๊ฑด(AND condition)์ ˆ์„ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ๊ฐ๊ฐ UPDATE/DELETE ๋™์ž‘์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
NOT MATCHED BY TARGET
  • MERGE๋ฌธ์—๋Š” 1๊ฐœ๋งŒ ํฌํ•จ
  • BY TARGET์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ON์ ˆ์— ์ผ์น˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด INSERT ์ˆ˜ํ–‰ํ•œ๋‹ค.
NOT MATCHED BY SOURCE
  • MERGE๋ฌธ์— ์ตœ๋Œ€ 2๊ฐœ
  • WHEN MATCHED๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ
  • 2๊ฐœ ํฌํ•จ์‹œํ‚ฌ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ์กฐ๊ฑด์ ˆ์„ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ  ๊ฐ๊ฐ UPDATE/DELETE ๋™์ž‘์„ ์ง€์ •
  • ์ถ”๊ฐ€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์€ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์—ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

dbo

dbo(database owner)์˜ ์•ฝ์ž๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜๋Š” ์Šคํ‚ค๋งˆ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
์Šคํ‚ค๋งˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ์ฒด(ํ…Œ์ด๋ธ”, ๋ทฐ ๋“ฑ)๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.

dbo์™€ ์Šคํ‚ค๋งˆ ์ฐจ์ด

  • TEST๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด ์†Œ์œ ์ž(dbo)๊ฐ€ test์ผ์ง€๋ผ๋„, table์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์€ test.table๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ…Œ์ด๋ธ”๋ช… ์•ž์— ๋ถ™๋Š” ๋ช…์นญ์€ ์Šคํ‚ค๋งˆ ์ด๋ฆ„

Trigger

ํŠน์ • ํ…Œ์ด๋ธ”์— INSERT, DELETE, UPDATE ๋“ฑ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰
  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋ฆฌ๊ฑฐ
    1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ INSERT, DELETE, UPDATE ๋“ฑ์˜ ์ž‘์—…์ด ๋ฐœ์ƒํ•  ๋•Œ ํŠน์ • ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
  1. ํƒ€์ด๋จธ ๋˜๋Š” ์Šค์ผ€์ค„๋ง ํŠธ๋ฆฌ๊ฑฐ
    1. ์ •๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜์—ฌ ์ง€์ €๋œ ์‹œ๊ฐ„ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์ด๋ฉ”์ผ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ
    1. ์ด๋ฉ”์ผ ๋„์ฐฉ, ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ๋“ฑ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅ
  1. ํŒŒ์ผ ์‹œ์Šคํ…œ ํŠธ๋ฆฌ๊ฑฐ
    1. ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ƒ์„ฑ, ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œ์™€ ๊ฐ™์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์—ฐ๊ด€๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์™ธ๋ถ€ API ํ˜ธ์ถœ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ
    1. ์™ธ๋ถ€ ์„œ๋น„์Šค๋‚˜ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํŠน์ • ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

MSSQL ํŠธ๋ฆฌ๊ฑฐ

  • ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €์˜ ์ผ์ข…, ์ˆ˜๋™์œผ๋กœ๋Š” ์‹คํ–‰ ๋ถˆ๊ฐ€
  • ํ•œ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๋ จ๋˜์–ด์„œ๋งŒ ์กด์žฌ ํ•  ์ˆ˜ ์žˆ์Œ
-- ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ CREATE TRIGGER [TriggerName] ON [TableName] [AFTER, BEFORE] INSERT, UPDATE, DELETE // ์›ํ•˜๋Š” ์ด๋ฒคํŠธ ์ง€์ • AS BEGIN // ์‹คํ–‰๋  ์ฝ”๋“œ ๋˜๋Š” ์ž‘์—…์„ ์—ฌ๊ธฐ์— ์ž‘์„ฑ END;

query

set nocount on; select CodeID, CodeName from Information.CommonCodeDetail where CodeTypeID = 'AREA' and // ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž and, or CodeName like '%' + isnull(@CodeName, '') + '%' // isnull(null๊ฐ’์ด ์žˆ๋Š” ์นผ๋Ÿผ๋ช…,'') set nocount off;

UNION

2๊ฐœ ์ด์ƒ์˜ SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ์—ฐํ•ฉํ•ด์ฃผ๋Š” ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž
  • ์—ด์˜ ๊ฐœ์ˆ˜์™€ ์ˆœ์„œ๊ฐ€ ๋ชจ๋“  ์ฟผ๋ฆฌ์—์„œ ๋™์ผํ•ด์•ผํ•จ
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์ด ํ˜ธํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค
๐Ÿ’ก
union all์€ ์ค‘๋ณต๊ฐ’๋„ ์ „๋ถ€ ๋ณด์—ฌ์คŒ โ†’ ์†๋„๋Š” ๋” ๋น ๋ฆ„ union์€ ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์˜ ์ค‘๋ณต๊ฐ’์„ ์ œ๊ฑฐํ•ด์„œ ๋ณด์—ฌ์คŒ
-- UNION select [์ปฌ๋Ÿผ1], [์ปฌ๋Ÿผ2], [์ปฌ๋Ÿผ3], ... FROM ํ…Œ์ด๋ธ”๋ช… UNION select [์ปฌ๋Ÿผ1], [์ปฌ๋Ÿผ2], [์ปฌ๋Ÿผ3], ... FROM ํ…Œ์ด๋ธ”๋ช… -- UNION ALL select [์ปฌ๋Ÿผ1], [์ปฌ๋Ÿผ2], [์ปฌ๋Ÿผ3], ... FROM ํ…Œ์ด๋ธ”๋ช… UNION ALL select [์ปฌ๋Ÿผ1], [์ปฌ๋Ÿผ2], [์ปฌ๋Ÿผ3], ... FROM ํ…Œ์ด๋ธ”๋ช…

Cursor๋ฌธ

Cursor

  • ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ํ•  ๋•Œ ํ…Œ์ด๋ธ”์—์„œ ์ง‘ํ•ฉ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ํ–‰ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
  • DML (SELECT, UPDATE, DELETE, INSERT)

ํŠน์ง•

  • ์ง‘ํ•ฉ์ด ์•„๋‹Œ ํ–‰ ๋‹จ์œ„๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค
  • ํ…Œ์ด๋ธ”์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰์„ ์กฐํšŒํ•œ ํ›„ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ํ–‰์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
DECLARE : ์ปค์„œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋“ฑ ์ปค์„œ์— ๊ด€๋ จ๋œ ์„ ์–ธ์„ ํ•˜๋Š” ๋ช…๋ น
OPEN : ์ปค์„œ๊ฐ€ ์งˆ์˜ ๊ฒฐ๊ณผ์˜ ์ฒซ๋ฒˆ์งธ ํŠœํ”Œ(ํ–‰)์„ ํฌ์ธํŠธ ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ช…๋ น
FETCH : ์งˆ์˜ ๊ฒฐ๊ณผ์˜ ํŠœํ”Œ๋“ค ์ค‘ ํ˜„์žฌ์˜ ๋‹ค์Œ ํŠœํ”Œ(ํ–‰)๋กœ ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ช…๋ น
CLOSE : ์งˆ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์ข…๋ฃŒ ์‹œ ์ปค์„œ๋ฅผ ๋‹ซ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น
DELLOCATE : ์ปค์„œ์™€ ์ปค์„œ ์ด๋ฆ„ ๋˜๋Š” ์ปค์„œ ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ œ๊ฑฐ

๋‚ด ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰

SELECT physical_memory_kb, virtual_memory_kb, committed_kb, commmitted_target_kb, FROM sys.dm_os_sys_info;
  • physical_memory_kb : ์„œ๋ฒ„์— ์„ค์น˜๋œ ์ด ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ
  • virtual_memory_kb : SQL Server์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์–‘
  • Committed_kb : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํผ ์บ์‹œ์—์„œ ํ˜„์žฌ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ์–‘
  • Committed_target_kb : ๋ฒ„ํผ ์บ์‹œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ ์žํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘

STRING_AGG()

์—ฌ๋Ÿฌ ํ–‰์˜ ์ปฌ๋Ÿผ ๊ฐ’์„ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ ํ•ฉ์น  ๋•Œ
notion image
SELECT job, STRING_AGG(ename, ',') WITHIN GROUP(ORDER BY ename) enames FROM emp WHERE job IN ('MANAGER', 'SALESMAN') GROUP BY job

CHARINDEX()

๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ์ฐพ๊ณ  ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • ๋ฌธ์ž์—ด์˜ ์•ž๋ถ€ํ„ฐ ๋˜๋Š” ํŠน์ • ์œ„์น˜๋ถ€ํ„ฐ ๋ฌธ์ž๋ฅผ ๊ฒ€์ƒ‰
  • CHARINDEX(โ€์ฐพ์„ ๋ฌธ์žโ€, โ€œ๋ฌธ์ž์—ดโ€, โ€œ์‹œ์ž‘์œ„์น˜โ€)
๊ธฐ๋ณธ์‚ฌ์šฉ๋ฒ•
SELECT CHARINDEX('sql', 'Microsoft SQL Server')
์‹œ์ž‘์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ฐพ๊ธฐ
SELECT CHARINDEX('sql', 'Microsoft SQL Server', 11)
๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฐพ๊ธฐ
SELECT CHARINDEX('SQL', 'Microsoft SQL Server' COLLATE Latin1_General_CS_AS) // ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ : COLLATE Latin1_General_CS_AS // ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ฌธ์•ˆํ•จ : COLLATE Latin1_General_CI_AS (๊ธฐ๋ณธ๊ฐ’)
๋‘๋ฒˆ์งธ ๋ฌธ์ž ์ฐพ๊ธฐ
DECLARE @str VARCHAR(100) = 'SQL Server 2017, SQL Server 2019' SELECT CHARINDEX('sql', @str, CHARINDEX('sql', @str) + 1)

IIF

์ฐธ๊ณผ ๊ฑฐ์ง“ ๋‘ ๊ฒฝ์šฐ์˜ ๊ฐ’๋งŒ ๋ฆฌํ„ด์ด ๊ฐ€๋Šฅ
DECLARE @score INT = 80 SELECT IIF(@score >= 70, 'ํ•ฉ๊ฒฉ', '๋ถˆํ•ฉ๊ฒฉ') AS score // score // ํ•ฉ๊ฒฉ

TOP

์กฐํšŒ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒฝ์šฐ
SELECT TOP(5) ename, job, sal FROM emp ORDER BY sal // sal๋กœ ์ •๋ ฌ ํ›„ 5๊ฐœ๋งŒ ์กฐํšŒ

์‹œ์ž‘์ผ์ž ์ข…๋ฃŒ์ผ์ž ์‚ฌ์ด ๋ชจ๋“  ์ผ์ž ์กฐํšŒ

// ์žฌ๊ท€ ์ฟผ๋ฆฌ(WITH CTE) WITH DateRange(Date) AS ( SELECT CONVERT(DATE, '2021-12-01') --์‹œ์ž‘์ผ์ž UNION ALL SELECT DATEADD(d, 1, Dates) FROM DateRange WHERE Dates < CONVERT(DATE, '2021-12-7) --์ข…๋ฃŒ์ผ์ž ) SELECT * FROM DateRange OPTION (MAXRECURSION 0) // ์žฌ๊ท€ ์ฟผ๋ฆฌ์˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„ // 0์€ ๋ฌดํ•œ๋ฐ˜๋ณต, ์ƒ๋žตํ•˜๋ฉด ์ตœ๋Œ€ 100ํšŒ๊นŒ์ง€๋งŒ ๋ฐ˜๋ณต // 2021-12-01 ~ 2021-12-07
// master..spt_value SELECT DATEADD(d, number, CONVERT(DATE, '2021-12-01')) Dates FROM master..spt_values WHERE type = 'p' AND number <= DATEDIFF(d, CONVERT(DATE, '2021-12-01'), CONVERT(DATE, '2021-12-07')) // 2021-12-01 ~ 2021-12-07