SQL(Structured Query Language)SQL ๋ฌธ๋ฒ ์์SQL ์ค์ ์คํ ์์ํ
์ด๋ธ ๊ตฌ์กฐ ๋ณด๊ธฐDB ๋ง๋ค๊ธฐTABLEํ
์ด๋ธ ์กฐํํ
์ด๋ธ ์์ฑํ
์ด๋ธ ์ญ์ ํ
์ด๋ธ ๋ณ๊ฒฝDBEntity(์ํฐํฐ)Attribute(์์ฑ)Relationship(๊ด๊ณ)Identifier(์๋ณ์)๋ฐ์ดํฐ ์ฝ์
(INSERT)๋์์ ์ฌ๋ฌ ํ INSERT ๋ฐฉ๋ฒselect๋ ๊ฒฐ๊ณผ INSERT ๋ฐฉ๋ฒํน๋ณํ ๊ฐ INSERT ๋ฐฉ๋ฒ๊ณ ์ ํค ๊ฐ ๋ง๋ค๊ธฐ(Sequence ์์ฑ๊ธฐ ์ด์ฉ)Sequence ํ์ธ๊ณ ์ ํค ์์ฑ ๋ฐ ์
๋ ฅcolumn ์ ํ ์กฐํ (SELECT)์ ์ฒด ํ
์ด๋ธ *LIMIT OFFSET๋ ์ฝ๋ ์ญ์ (DELETE)์์ (UPDATE)TRUNCATEDROP๊ธฐํ ํจ์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 ๊ตฌ๋ฌธEXITS, NOT EXITSSELECT ์ปฌ๋ผ ๊ฐ ๋ณ์๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒdbodbo์ ์คํค๋ง ์ฐจ์ดTriggerMSSQL ํธ๋ฆฌ๊ฑฐqueryUNIONCursor๋ฌธCursorํน์ง๋ด ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋STRING_AGG()CHARINDEX()IIFTOP์์์ผ์ ์ข
๋ฃ์ผ์ ์ฌ์ด ๋ชจ๋ ์ผ์ ์กฐํPartition byPaging QueryOFFSET ROWS FETCH์กฐํ ์๋ฒ ๋งค๊ธฐ๊ธฐ๋ถ์ํจ์over()over(ORDER BY ์ปฌ๋ผ)over(partition by ์ปฌ๋ผ)over(partition by ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2) Select ๋ฌธ ๋๊ฐ ํฉ์น๊ธฐcount( ) ํจ์DATE(๋ ์ง๊ด๋ จ)date_addํน์ ๋ ์ง 1์ผ๋ถํฐ ํน์ ๋ ์ง๊น์ง๋
, ๋ฌ, ์ผ (์กฐํ)ํน์ ๋ฌ๊น์ง ์กฐํdense_rank()ROW NUMBER()WITH (NOLOCK)์์ํ
์ด๋ธ ์ปฌ๋ผ๋ช
๊ฐ์ ธ์ค๊ธฐํ
์ด๋ธ ์ปฌ๋ผ๋ช
๊ฐ์ ธ์ค๊ธฐSQL ๋ก๊ทธ ํ์ผ1. ๋ก๊ทธ ํ์ผ ํ์ธ2. ๋ก๊ทธ ํ์ผ ์ฉ๋ ์ค์ด๊ธฐSQL ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋ ํ์ธIN, NOT IN ์ฐ์ฐ์INNOT IN, ์ฃผ์์ฌํญ์ฌ์ฉ์ ์ ์ ํจ์(User-defined Fuction, UDF)์ด์ ์ค์นผ๋ผ ํจ์ (Scalar User-defined Fuction, scalar UDF)ํ
์ด๋ธ ๋ฐํ ํจ์ (Table-valued Fuction, TVF)์์คํ
ํจ์ (System Fuction)Fuction ์์ฑFunction ์คํFunction ์์ Function ์ญ์ MSSQL , 0์ผ๋ก ๋๋๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ต๋๋ค ๊ด๋ จ ์ฒ๋ฆฌgroup by(์ง๊ณํจ์) vs partition by(์๋์ฐํจ์)group bypartition by๋น์จ ๊ด๋ จ ํจ์OUTER JOIN VS INNER JOIN ์ฑ๋ฅ์ฟผ๋ฆฌ๋ฌธ ๋นจ๊ฐ์ค ํ์ ํด๊ฒฐSQL ๋ค์ฌ์๊ธฐ ์ค๋ฅํธ๋์ญ์
(Transaction)์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ๊ธฐ ์ ์ํ์ปค๋ฐ ํ ํ ์ํ์ธ๋ฑ์ค(INDEX)ํ
์ด๋ธ ์ก์ธ์ค ๋ฐฉ๋ฒ์ธ๋ฑ์ค ์์ฑ์ธ๋ฑ์ค ์ญ์ ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค์คํ ๊ณํ ๋
ผ๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ฐธ์กฐCompute ScalarStream Aggregate์ฌ๊ท์ ๊ณตํต ํ
์ด๋ธ ํํ์ (CTE)์ต์ปค ๋ฉค๋ฒ(Anchor Member) ์ฌ๊ท ๋ฉค๋ฒ(Recursive Member)์คํ ๊ณผ์ with ์ ์ ๋์ ๋ฐฉ์Inline ViewMaterializeBulk InsertREPLICATEOUTPUT ์ Emergency ๋ฐฑ์
1. ๋น์๋ก๊ทธ ๋ฐฑ์
(Tail-Log Backup)2. DB ๋ฐฑ์
๋ณธ ๋ถ๋ฌ์์ ๋ถ์ด๊ธฐ3. ๋ณต์ ์ํฌ ์์ ์ฐพ๊ธฐ4. Restore ์งํ ๋ฐ Recovery State๋ฅผ โRECOVERYโ๋ก ๋ฐ๊พธ๊ธฐ5. ๋ณต์ํ Dummy DB๋ฅผ ํตํด ์๋ DB์ ๋ฐ๋ ๋ถ๋ถ ์๋ณตํ๊ธฐ๋ณ๊ฒฝ ๋ด์ฉ ์ถ์ 1. ์ธํ
2. ๋ณ๊ฒฝ ๋ด์ฉ ๊ฐ์ ธ์ค๊ธฐ
SQL(Structured Query Language)
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์, ์กฐ์, ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ช
๋ น์ด
DDL(๋ฐ์ดํฐ ์ ์์ด)
: ํ ์ด๋ธ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ค๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ด๋ จ๋ ๋ช ๋ น์ด
DML(๋ฐ์ดํฐ ์กฐ์์ด)
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์ฝ์ , ์์ , ์ญ์ ํ๋ ๋ฑ์ ์ญํ ์ ํ๋ ์ธ์ด
DCL(๋ฐ์ดํฐ ์ ์ด์ด)
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ณ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ๋๋ก ๊ถํ์ ์ฃผ๊ณ ํ์ํ๋ ๋ช ๋ น์ด
TCL(ํธ๋์ญ์ ์ ์ด์ด)
: ๋ ผ๋ฆฌ์ ์ธ ์์ ์ ๋จ์๋ฅผ ๋ฌถ์ด์ DML์ ์ํด ์กฐ์๋ ๊ฒฐ๊ณผ๋ฅผ ์์ ๋จ์ ๋ณ๋ก ์ ์ดํ๋ ๋ช ๋ น์ด
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 : ๋ฐ์ดํฐ ์ ๋ ฌ
ํ ์ด๋ธ ๊ตฌ์กฐ ๋ณด๊ธฐ
DESC tablename
DB ๋ง๋ค๊ธฐ
use master GO if NOT EXISTS ( select name from sys.databases where name = N'DevelopmentDB' ) create database [DevelopmentDB] GO
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๊ฐ ์ ํ (ํ ์ด๋ธ ๋ด ๊ณ ์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ)
ํ ์ด๋ธ ์ญ์
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 [ํด๋นcolumn๋ช ] [๋ฐ๊ฟ column๋ช ] [๋ณ๊ฒฝํ ์์ฑ]
- ๋ฐ์ดํฐ ์ ์ฝ ์กฐ๊ฑด ์ถ๊ฐ, ์ญ์
-- primary key ALTER TABLE [ํ ์ด๋ธ๋ช ] ADD CONSTRAINT primary key (์ปฌ๋ผ๋ช ); -- foreign key ALTER TABLE [ํ ์ด๋ธ๋ช ] ADD CONSTRAINT foreign key (์ปฌ๋ผ๋ช ) references [๋ถ๋ชจํ ์ด๋ธ๋ช ] (pk์ปฌ๋ผ๋ช )
DB
Entity(์ํฐํฐ)
- ํ ์ด๋ธ
- ์ ๋ฌด์์ ํ์ํ๊ณ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ์งํฉ์ ์ธ ๊ฒ์ด๋ค.
- ์ธ์คํด์ค์ ์งํฉ
- ์์ฑ์ด ์กด์ฌํด์ผํ๊ณ ๋ค๋ฅธ ์ํฐํฐ์ ์ต์ ํ ๊ฐ ์ด์์ ๊ด๊ณ๊ฐ ์์ด์ผํจ
Attribute(์์ฑ)
- ์ด(column)
- ์ธ์คํด์ค๋ก ์๋ง์ ๋์ด์ ๋ถ๋ฆฌ๋์ง ์๋ ์ต์์ ๋ฐ์ดํฐ ๋จ์
Relationship(๊ด๊ณ)
- ํ(row)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ด์ฉ์ ์ ์ฒด ์งํฉ์ ์๋ฏธ
Identifier(์๋ณ์)
- ํ๋์ ์ํฐํฐ ๋ด์ ๊ตฌ์ฑ๋์ด ์๋ ์ฌ๋ฌ ์์ฑ๋ค ์ค์ ์ํฐํฐ๋ฅผ ๋ํํ ์ ์๋ ์์ฑ
- ํ๋์ ์ํฐํฐ ์์๋ ๋ฐ๋์ ์ ์ผํ ์๋ณ์๊ฐ ์กด์ฌํด์ผ ํจ
๋ฐ์ดํฐ ์ฝ์ (INSERT)
INSERT INTO users (name, age) VALUES ('ํ๊ธธ๋', 23);
table์ column์ ์๋ ๋ชจ๋ VALUE๋ฅผ ๋ฃ์๋์๋ column๋ช
์ ์ ์ด์ฃผ์ง ์์๋ ๋จ
๋์์ ์ฌ๋ฌ ํ INSERT ๋ฐฉ๋ฒ
INSERT INTO users (name, age) VALUES ('๊ฐ๋๋ค',20), ('hongil',44)
select๋ ๊ฒฐ๊ณผ INSERT ๋ฐฉ๋ฒ
INSERT INTO dbo.users (deptno, name, age) SELECT deptno + 1 , 'tansan' , 30 FROM users WHERE deptno IN (60, 70, 80)
ํน๋ณํ ๊ฐ INSERT ๋ฐฉ๋ฒ
--NULL ๊ฐ ๋ฃ๊ธฐ insert into s_customer values (216, 'Tester', null, null, 'good' 2, 12, null); -- Empty String ๋ฃ๊ธฐ insert into s_customer values (216, "", "", "", 'good' 2, 12, ""); -- ํจ์ ์ฌ์ฉํ์ฌ insertํ๊ธฐ insert into s_customer values (27,"", 'Student', USER, SYSDATE, null); -- USER : ํ์ฌ USER ์ด๋ฆ, SYSDATE : ํ์ฌ ์์คํ ์ผ์,์๊ฐ
๊ณ ์ ํค ๊ฐ ๋ง๋ค๊ธฐ(Sequence ์์ฑ๊ธฐ ์ด์ฉ)
Sequence ํ์ธ
select object_name from user_objects where object_type = 'SEQUENCE';
๊ณ ์ ํค ์์ฑ ๋ฐ ์ ๋ ฅ
insert into s_dept(id, name, region_id) values (s_dept_id.NEXTVAL, 'Education', 1); -- Sequence_name.NEXTVAL : ํ์ฌ๊ฐ์ ๋ค์๊ฐ์ ์ฃผ๊ณ ์์ ์ ๋ค์๊ฐ์ ๊ฐ์ง๋ค. -- Sequence_name.CURRRVAL : ํ์ฌ๊ฐ์ ์ค๋ค.
- ํ๋ฒ ๋ถ์ฌ๋ Sequence ๊ฐ์ ๋๋๋ฆด ์ ์๋ค.
- ์ฌ์ ์ํ์ฌ ์ด๊ธฐ๊ฐ์ ์ฌ์ค์ ๊ฐ๋ฅ
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 ์ ์ฃผ๋
UPDATE dbo.dept // ์คํค๋ง ๋ช SET dname = 'SALES TEAM' // ์ ๋ฐ์ดํธ ์ปฌ๋ผ = ์ ๋ฐ์ดํธ๊ฐ๊ฐ , loc = 'TEXAS'
TRUNCATE
TRUNECATE TABLE [์คํค๋ง๋ช
].[ํ
์ด๋ธ๋ช
]
- ํ ์ด๋ธ ๋ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์ฟผ๋ฆฌ
- ๋ค๋ง ํ ์ด๋ธ์ ์ญ์ ํ๋ ๊ฒ์ด ์๋ ํ ์ด๋ธ ๋ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ฌ ์์ ํ ์ด๋ธ ๊ป๋ฐ๊ธฐ๋ ๋จ์ ์์
- AUTO COMMIT์ด์ฌ์ ํ๋ฒ ์ญ์ ํ๋ฉด ๋ณต๊ตฌ X
DROP
DROP TABLE [์คํค๋ง๋ช
].[ํ
์ด๋ธ๋ช
]
- ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ญ์ ํ๋ ์ฟผ๋ฆฌ
- AUTO COMMIT์ด์ฌ์ ํ๋ฒ ์ญ์ ํ๋ฉด ๋ณต๊ตฌ X
๊ธฐํ ํจ์
- 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
์ฐ์ฐ์ ์ฐ์ ์์
- ๋ชจ๋ ๋น๊ต ์ฐ์ฐ์
- NOT
- AND
- OR
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.์ด;
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.์ด;
RIGHT OUTER JOIN
โ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ชจ๋ ํโ๊ณผ โ์ผ์ชฝ ํ
์ด๋ธ์์ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ๊ณผ ๊ณตํต๋ ๊ฐโ์ ๊ฐ์ง๊ณ ์๋ ํ๋ค์ ๋ฐํ
SELECT * FROM ํ ์ด๋ธ1 RIGHT JOIN ํ ์ด๋ธ2 ON ํ ์ด๋ธ1.์ด = ํ ์ด๋ธ2.์ด;
FULL OUTER JOIN
๋ ํ
์ด๋ธ์์ โ๋ชจ๋ ๊ฐโ์ ๋ฐํ
SELECT * FROM ํ ์ด๋ธ1 FULL OUTER JOIN ํ ์ด๋ธ2 ON ํ ์ด๋ธ1.์ด = ํ ์ด๋ธ2.์ด;
JOIN ์ ๋ฆฌ๋ณธ
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์ ํ์ํฉ๋๋ค.
- ํ ์ด๋ธ ๋ฐํ ํจ์๋ฅผ ํ ์ด๋ธ์ฒ๋ผ ์ฌ์ฉํด ์กฐ์ธ ๊ฐ๋ฅ
- ์กฐ์ธ ์กฐ๊ฑด์ ON์ด ์๋ ๋ด๋ถ ํ ์ด๋ธ์ WHERE ๋ฌธ์ผ๋ก ์ค์ ๊ฐ๋ฅ
- outer apply ์์ select ๋ฌธ์ ์ง๊ณํจ์๋ฅผ ์ธ ๋ group by๋ฅผ ๋ฐ๋์ ์ฌ์ฉํ์ง ์์๋ ๋จ
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)
์๊ณ ์ ๊ฑฐ ๋ฐฉ๋ฒ
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
PIVOT
ํ์ผ๋ก ๋์ด์๋ ๋ฐ์ดํฐ๋ค์ ์ด๋ก ๋ณํํด์ ๋ณด์ฌ์ฃผ๋ ํจ์
SELECT [PIVOT์ด1], [PIVOT์ด2], ...FROM ํ ์ด๋ธ๋ช PIVOT (๋ํ๋ด๊ณ ์ํ๋ ๊ฐ, FOR ํ->์ด๋ก ๋ฐ๊ฟ ์ด IN ([PIVOT์ด1], [PIVOT์ด2], ...)) as ๋ณ์นญ // UNPIVOT์ ๋ฐ๋
CASE WHEN
CASE WHEN ์กฐ๊ฑด์ THEN ์ฐธ์ผ๋ ๊ฐ ELSE ๊ฑฐ์ง์ผ๋ ๊ฐ END ์ปฌ๋ผ๋ช --MSSQL ๋ค์ค CASE WHEN ์ฌ์ฉ ๋ฐฉ๋ฒย CASE WHEN [์กฐ๊ฑด์ 1] THEN [์ฐธ์ผ ๋ ๊ฐ] WHEN [์กฐ๊ฑด์ 2] THEN [์ฐธ์ผ ๋ ๊ฐ] WHEN [์กฐ๊ฑด์ 3] 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 ์ ์ฅ ํ๋ก์์
์ผ๋ฐ ์ฟผ๋ฆฌ๋ฌธ ์๋ ๋ฐฉ์
๊ตฌ๋ฌธ๋ถ์ โ ๊ฐ์ฒด ์ด๋ฆ ํ์ธ โ ์ฌ์ฉ๊ถํ ํ์ธ โ ์ต์ ํ โ ์ปดํ์ผ ๋ฐ ์คํ๊ณํ ๋ฑ๋ก(๋ฉ๋ชจ๋ฆฌ(์บ์)) โ ์คํ
- ๊ตฌ๋ฌธ๋ถ์ : ๊ตฌ๋ฌธ ์์ฒด์ ์ค๋ฅ๊ฐ ์๋์ง ๋ถ์
- ๊ฐ์ฒด ์ด๋ฆ ํ์ธ : ํ ์ด๋ธ์ด ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋์ง ํ์ธ
- ์ฌ์ฉ๊ถํ ํ์ธ : ํ์ฌ ํ ์ด๋ธ์ ์ ๊ทผ์ค์ธ ์ฌ์ฉ์๊ฐ ๊ถํ์ด ์๋์ง ํ์ธ
- ์ต์ ํ : ํด๋น ์ฟผ๋ฆฌ๋ฌธ์ด ๊ฐ์ฅ์ข์ ์ฑ๋ฅ์ ๋ผ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์
- ์ปดํ์ผ ๋ฐ ์คํ ๊ณํ ๋ฑ๋ก : ํด๋น ์คํ๊ณํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ(์บ์)์ ๋ฑ๋ก
์ ์ฅ ํ๋ก์์ ์๋ ๋ฐฉ์
- ์ ์ฅํ๋ก์์ ์ ์ ๋จ๊ณ
- ๊ตฌ๋ฌธ๋ถ์ : ๊ตฌ๋ฌธ์ ์ค๋ฅ ํ์
์ง์ฐ๋ ์ด๋ฆ ํ์ธ
: ์ ์ฅ ํ๋ก์์ ๋ฅผ ์ ํ๋ ์์ ์์ ํด๋น ๊ฐ์ฒด(ํ ์ด๋ธ)๊ฐ ์กด์ฌํ์ง ์์๋ ์๊ด์๋ค. ํ๋ก์์ ์คํ ๋น์์ ํ ์ด๋ธ ์กด์ฌ ์ฌ๋ถ ํ์ธํจ(๊ฐ์ฒด์ด๋ฆ ํ์ธ)- ์์ฑ๊ถํ ํ์ธ : ํ์ฌ ์ฌ์ฉ์๊ฐ ์ ์ฅ ํ๋ก์์ ๋ฅผ ์์ฑํ ๊ถํ์ด ์๋์ง ํ์ธ
- ์์คํ ํ ์ด๋ธ ๋ฑ๋ก : ์ ์ฅ ํ๋ก์์ ์ ์ด๋ฆ ๋ฐ ์ฝ๋๊ฐ ์์คํ ํ ์ด๋ธ์ ๋ฑ๋ก
Create Procedure โ ๊ตฌ๋ฌธ ๋ถ์โ ์ง์ฐ๋ ์ด๋ฆ ํ์ธ โ ์์ฑ๊ถํ ํ์ธ โ ์์คํ
ํ
์ด๋ธ์ ๋ฑ๋ก
- ์ฒ์ ์ ์ฅ ํ๋ก์์ ์คํ
- ์ ์ ๋จ๊ณ์์ ์ง์ฐ๋ ์ด๋ฆํ์ธ์์ ๋ฏธ๋ฃจ์ด๋์๋ ํด๋น ๊ฐ์ฒด ์กด์ฌ ์ ๋ฌด๋ฅผ ๊ฐ์ฒด ์ด๋ฆ ํ์ธ์ ํตํด ์ํํ๋ค.
๊ตฌ๋ฌธ๋ถ์ ๋จ๊ณ ๋น ์ง ์ผ๋ฐ ์ฟผ๋ฆฌ๋ฌธ ์๋ ๋ฐฉ์๊ณผ ๋์ผ
- ์ดํ ์ ์ฅ ํ๋ก์์ ์คํ
- ๋ฉ๋ชจ๋ฆฌ(์บ์)์ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ฌ์ฌ์ฉํ๊ฒ ๋์ด ์ํ์๊ฐ์ ๋จ์ถ
์ ์ฅ ํ๋ก์์ ๋๋ฒ์งธ ์คํ โ ๋ฉ๋ชจ๋ฆฌ(์บ์)ํ์ธ โ ์คํ
๋ช ๋ น์ด
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) -- ์์ 1๊ฐ ํ๋ง ๋ฐํํ๊ณ ํด๋น ํ์ ๋ํด ์ ์ 1 ์ฆ, true ์กฐ๊ฑด์ด๋ฉด 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 ๋์์ ์ง์
- ์ถ๊ฐ ๊ฒ์ ์กฐ๊ฑด์ ๋์ ํ ์ด๋ธ์ ์ด๋ง ์ฐธ์กฐํ ์ ์๋ค.
EXITS, NOT EXITS
EXITS
์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฒดํฌํ๊ณ ์กด์ฌํ ๊ฒฝ์ฐTRUE
๋ฅผ ๋ฐํ
NOT EXITS
์ฐ์ฐ์๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐTRUE
๋ฅผ ๋ฐํ
SELECT ์ปฌ๋ผ ๊ฐ ๋ณ์๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ
declare @name varchar(100); declare @age int; select @name = NAME, @age = AGE from Student where seq = 10;
dbo
dbo
(database owner)์ ์ฝ์๋ก ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋๋ ์คํค๋ง ์ด๋ฆ์
๋๋ค.์คํค๋ง
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฒด(ํ
์ด๋ธ, ๋ทฐ ๋ฑ)๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋
ผ๋ฆฌ์ ์ธ ์ปจํ
์ด๋์
๋๋ค.dbo์ ์คํค๋ง ์ฐจ์ด
- TEST๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด ์์ ์(dbo)๊ฐ test์ผ์ง๋ผ๋, table์ด๋ผ๋ ํ ์ด๋ธ์ test.table๋ก ์ฐธ์กฐํ ์ ์๋ค.
- ํ ์ด๋ธ๋ช ์์ ๋ถ๋ ๋ช ์นญ์ ์คํค๋ง ์ด๋ฆ
Trigger
ํน์ ํ
์ด๋ธ์ INSERT, DELETE, UPDATE ๋ฑ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋์ผ๋ก ์คํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ INSERT, DELETE, UPDATE ๋ฑ์ ์์
์ด ๋ฐ์ํ ๋ ํน์ ์์
์ ์๋์ผ๋ก ์คํํ๋ค.
- ํ์ด๋จธ ๋๋ ์ค์ผ์ค๋ง ํธ๋ฆฌ๊ฑฐ
์ ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณต๋๋ ์์
์ ์์ฝํ์ฌ ์ง์ ๋ ์๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํํ ์ ์๋ค.
- ์ด๋ฉ์ผ ๋๋ ๋ฉ์์ง ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ
์ด๋ฉ์ผ ๋์ฐฉ, ๋ฉ์์ง ์์ ๋ฑ๊ณผ ๊ฐ์ ์ธ๋ถ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ํด๋น ์ด๋ฒคํธ์ ๋ํด ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ๊ฐ๋ฅ
- ํ์ผ ์์คํ ํธ๋ฆฌ๊ฑฐ
ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ์ ์์ฑ, ์์ ๋๋ ์ญ์ ์ ๊ฐ์ ํ์ผ ์์คํ
๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ์ฐ๊ด๋ ์์
์ ์คํํ ์ ์๋ค.
- ์ธ๋ถ API ํธ์ถ ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ
์ธ๋ถ ์๋น์ค๋ 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()
์ฌ๋ฌ ํ์ ์ปฌ๋ผ ๊ฐ์ ํ๋์ ์ปฌ๋ผ์ผ๋ก ํฉ์น ๋
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
Partition by
๋ฐ์ดํฐ์ ์งํฉ(ํ
์ด๋ธ)์์ ์ด๋ค ํญ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ํ
์ด๋ธ์ ๋ถ๋ฆฌํ์ฌ ์์๋ ์์๋ฅผ ๋ํ๋ผ ๋ ์ฌ์ฉ
SELECT ์์ํจ์() OVER(PARTITION BY ์ปฌ๋ผ๋ช ORDER BY ์ปฌ๋ผ๋ช ) FROM ํ ์ด๋ธ๋ช
- ์์ํจ์ : ROW_NUMBER, RANK, DENSE_RANK
example
SELECT empno , ename , job , sal , SUM(sal) OVER(PARTITION BY job) FROM emp WHERE job IN ('MANAGER', 'SALESMAN') ORDER BY job
Paging Query
DECLARE @PAGE_NO INT = 1 -- ํ์ด์ง๋ฒํธ DECLARE @PAGE_SIZE INT = 5 -- ํ ํ์ด์ง์ ๋ณด์ฌ์ค row ์ SELECT rownum, name, age, totalCnt from ( SELECT ROW_NUMBER() OVER(ORDER BY age) AS rownum, name, age, COUNT(*) OVER() AS totalCnt from [ํ ์ด๋ธ] ) A WHERE rownum BETWEEN ((@PAGE_NO-1)*@PAGE_SIZE)+1 AND (@PAGE_NO * @PAGE_SIZE) SELECT t1.* FROM ํ ์ด๋ธ๋ช AS t1 WITH(NOLOCK) INNER JOIN ( SELECT id FROM ํ ์ด๋ธ๋ช WITH(NOLOCK) ORDER BY reg_date DESC OFFSET (@PAGE_NO) * @PAGE_SIZE ROWS FETCH NEXT (@PAGE_SIZE) ROWS ONLY ) AS t2 ON t1.id = t2.id ORDER BY reg_date DESC;
OFFSET ROWS FETCH
ORDER BY ์ปฌ๋ผ OFFEST ์ซ์ {ROW | ROWS} FETCH {FIRST | NEXT} ์ซ์ {ROW | ROWS} ONLY
OFFSET ์ซ์ {ROW | ROWS}
: ํด๋น ์ซ์ ์ดํ์ ํ๋ถํฐ ์ถ๋ ฅ
FETCH {FIRST | NEXT} ์ซ์ {ROW|ROWS} ONLY
: ์ซ์์ ๊ฐ์๋งํผ ์ถ๋ ฅ
์กฐํ ์๋ฒ ๋งค๊ธฐ๊ธฐ
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum
- ROW_NUMBER ํจ์๋ฅผ ์ฌ์ฉํ ๋๋
ORDER BY
ํ์
๋ถ์ํจ์
:ํ(row)์ ๋ํด ํน์ ๊ทธ๋ฃน๋ณ๋ก ์ง๊ณ๊ฐ์ ์ฐ์ถํ ๋ ์ฃผ๋ก ์ฌ์ฉ
over()
SELECT employee_id, salary, avg(salary) over() ์ ์ฒดํ๊ท FROM employees;
over()
๋ถ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ์ ์ฒด๋ฅผ ์ง๊ณover(ORDER BY ์ปฌ๋ผ)
ํด๋น ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ ๋ ฌ
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ ์ฒด๋ฅผ ์ง๊ณ
over(partition by ์ปฌ๋ผ)
ํด๋น ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ธฐ์กด์ ๋ฐ์ดํฐ์ ์ง๊ณ๋ ๊ฐ์ ํจ๊ป ๋๋ํ ๋ณผ ์ ์๋ค
over(partition by ์ปฌ๋ผ1 ORDER BY ์ปฌ๋ผ2)
์ปฌ๋ผ1์ ๊ธฐ์ค์ผ๋ก ๊ธฐ์กด์ ๋ฐ์ดํฐ์ ์ง๊ณ๋ ๊ฐ์ ํจ๊ป ๋๋ํ ๋ณด๊ณ ์ปฌ๋ผ2๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ ๋ ฌ
Select ๋ฌธ ๋๊ฐ ํฉ์น๊ธฐ
select (select * from Table1) as A, (select * from Table2) as B -- | A B -----|------- -- 1 | 3 4 -- 2 | 2 8
count( ) ํจ์
( ) ๋ด์ ์๋ ํญ๋ชฉ์ ์๋ฅผ ์ถ๋ ฅ
count(name)
: name์ด๋ผ๋ ์ปฌ๋ผ์ ๊ฐ์, null ๊ฐ ํฌํจ X
count(*)
: ์ ์ฒด ํ์ ๊ฐ์, null ๊ฐ ํฌํจ
count(1)
: ์ ์ฒด ํ์ ๊ฐ์, null ๊ฐ ํฌํจ
DATE(๋ ์ง๊ด๋ จ)
https://chachahoya.tistory.com/74 (๋ ์ง ๋ณํํ)
date_add
๋ฐ์ดํฐ ์กฐํ์ ํ๋ฌ์ด๋ด, ์ผ์ฃผ์ผ์ด๋ด ๋ฑ ๋ฐ์ดํฐ ๊ธฐ๊ฐ ์กฐํ
SELECT * FROM cordinghero.test where date > date_add(now(),interval -1 month);
- date > date_add ๋ผ๋ฉด ๋ค์ชฝ์ -1 month์ด๋ฏ๋ก ํ ๋ฌ์ด๋ด
- date < date_add ๋ผ๋ฉด ํ ๋ฌ์ด ์ง๋ ๋ฐ์ดํฐ
ํน์ ๋ ์ง 1์ผ๋ถํฐ ํน์ ๋ ์ง๊น์ง
B.BaseDate between DATEADD(DAY, 1 - DAY(@BaseDate), @BaseDate) AND @BaseDate
๋ , ๋ฌ, ์ผ (์กฐํ)
DATENAME(yy,@BaseDate) + '๋ ' + DATENAME(MM, @BaseDate) + '์ ' + DATENAME(dd, @BaseDate) + '์ผ ' + DATENAME(WEEKDAY, @BaseDate)
ํน์ ๋ฌ๊น์ง ์กฐํ
select * from where DATEADD(MONTH,0,[๋ ์ง]) <= @EndDate
dense_rank()
ํจ์๋ ๋์ผํ ๊ฐ์ด๋ฉด ์ค๋ณต ์์๋ฅผ ๋ถ์ฌํ๊ณ ๋ค์ ์์๋ ์ค๋ณต ์์์ ์๊ด์์ด ์์ฐจ์ ์ผ๋ก ๋ฐํ
ex) 1 โ 1 โ 2 โ 3 โ 4 โ 5 โ 5 โ 6
ROW NUMBER()
ROW_NUMBER() OVER(ORDER BY ๊ธฐ์ค)
๊ฐ ๋ก์ฐ๋ง๋ค ์์๋ฅผ ๋ฐ์
WITH (NOLOCK)
- ์ปค๋ฐ๋์ง ์์ ์ฝ๊ธฐ๋ฅผ ํ์ฉํ๊ฒ ๋ค.
- ์ฝ๊ธฐ ์์ ์ ์กฐํํ๋ ํ ์ด๋ธ์ด ์ ๊ฒจ์์ด๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ฒ ๋ค.
- ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๊ฑฐ๋ ๊ต์ฐฉ์ํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
select * from test_table WITH (LOCK)
์์ํ ์ด๋ธ ์ปฌ๋ผ๋ช ๊ฐ์ ธ์ค๊ธฐ
select name from tempdb.sys.columns where object_id = object_id('tempdb..#js_WeightingTable') -- #js_WeightingTable = ์์ํ ์ด๋ธ๋ช -- name = ์ปฌ๋ผ๋ช
ํ ์ด๋ธ ์ปฌ๋ผ๋ช ๊ฐ์ ธ์ค๊ธฐ
select * from syscolumns where id = object_id('ํ ์ด๋ธ๋ช ')
SQL ๋ก๊ทธ ํ์ผ
1. ๋ก๊ทธ ํ์ผ ํ์ธ
DBCC SQLPERF(LOGSPACE) -- 1 EXEC SP_HELPFILE -- 2
2. ๋ก๊ทธ ํ์ผ ์ฉ๋ ์ค์ด๊ธฐ
BACKUP LOG [Database] WITH TRUNCATE_ONLY -- ์ถ์์์ BACKUP LOG [Database] WITH NO_LOG --๋ก๊ทธ์ญSQ์
SQL ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋ ํ์ธ
SET STATISTICS TIME ON [์คํํ ์ฟผ๋ฆฌ๋ฌธ] SET STATISTICS TIME OFF
IN, NOT IN ์ฐ์ฐ์
IN
select * from emp where ename IN ('JONES', 'SCOTT', 'Bob')
IN ์ฐ์ฐ์์ ์
๋ ฅ๋ ๊ฐ ์ค์์ ํ๋๋ผ๋ ์ผ์นํ๋ ๊ฒ์ด ์์ผ๋ฉด ๋ฆฌ์คํธ์ ์กฐํ
NOT IN, ์ฃผ์์ฌํญ
SELECT * FROM emp WHERE ename NOT IN ('JONES', 'SCOTT', 'MILLER') SELECT * FROM emp WHERE ISNULL(ename.'test') NOT IN ('JONES', 'SCOTT', 'MILLER')
NOT IN
์ ์ฌ์ฉํ ๋๋ ํด๋น ์นผ๋ผ์NULL
์ด ์กด์ฌํ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ด ์กฐํ๋์ด์ผ ํ๋ค๋ฉด, ๊ผญISNULL
ํจ์๋ก ์นํํด์ผ ํด๋น ๊ฐ์ด ๋๋ฝ๋์ง ์๊ณ ์กฐํ
์ฌ์ฉ์ ์ ์ ํจ์(User-defined Fuction, UDF)
- ํด๋น ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ผ๋ก ๋ฐํ
- ๋ฐ๋์ ํ๋์ ๋ฐํ ๊ฐ์ด ์์ด์ผ ํจ
- ๋ฐํ ๊ฐ์ ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ด๋ ๊ฒฐ๊ณผ ์งํฉ
- ๋จ์ผ ์ค์นผ๋ผ ๊ฐ : ๋จ์ผ ๋ฐ์ดํฐ ๊ฐ์ ์๋ฏธ
- ๊ฒฐ๊ณผ ์งํฉ : ์ด ๋๋ ํ์ ์ผ๋ถ
์ด์
- ๋ชจ๋์ ํ๋ก๊ทธ๋๋ฐ
- ํจ์๋ฅผ ํ ๋ฒ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ํ ์ฌ๋ฌ ๋ฒ ํธ์ถ ๊ฐ๋ฅ
- ๋น ๋ฅธ ์คํ
- ์ฌ์ฉ์ ์ฌ๋ถ์ ๋ฐ ๋ค์ ์ต์ ํํ ํ์ X
- ๋คํธ์ํฌ ํธ๋ํฝ ๊ฐ์
- ํํฐ๋ง์ ํ์๋ก ํ๋ ์์ ์ ๊ฒฝ์ฐ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ ์ก๋๋ ํ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ค์ผ ์ ์์
์ค์นผ๋ผ ํจ์ (Scalar User-defined Fuction, scalar UDF)
- RETURNS์ ์ ์ ์๋ ์ ํ์ ๋จ์ผ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐํ
- ๋จ์ผ ์ค์นผ๋ผ ํจ์ : ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ๋ ํจ์
- ๋จ์ํ ์ํ์์ ์ฌ์ฉ, ๋ด์ฅ ํจ์์ ์ฌ์ฉํ์ฌ ์ ์
- ๋ค์ค ์ค์นผ๋ผ ํจ์ : ๋จ์ผ ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํ๊ณ ์ฌ๋ฌ๊ฐ์ SQL ๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋ ํจ์
- ๋ฐํ ํ์ : text, ntext, image, cursor, timestamp๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฐ์ดํฐ ํ์
- ์ข ๋ ๋ณต์กํ ์ฐ์ฐ์ ํ
ํ ์ด๋ธ ๋ฐํ ํจ์ (Table-valued Fuction, TVF)
- ํ ์ด๋ธ ๋ฐ์ดํฐ ํ์์ ๋ฐํ
- ํ ์ด๋ธ์ ๋จ์ผ SELECT ๋ฌธ์ ๊ฒฐ๊ณผ ์งํฉ
- SELECT๋ฌธ, JOIN์ ๋๋ ํ์ ์ฟผ๋ฆฌ์์ ํ ์ด๋ธ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
์์คํ ํจ์ (System Fuction)
- ์ฌ์ฉ ํ ์ ์๋ ๋ง์ ์์คํ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์์ ๋ถ๊ฐ
Fuction ์์ฑ
CREATE FUNCTION FN_TEST(@P_MSG VARCHAR(10)) RETURNS VARCHAR AS BEGIN DECLARE @V_RETURN VARCHAR(100); DECLARE @V_STR VARCHAR(10); SET @V_STR = 'abc'; SET @V_RETURN = concat(@V_STR, @P_MSG); RETURN @V_RETURN; END
Function ์คํ
SELECT DBO.FN_TEST(โZZZโ) RET_MSG
Function ์์
ALTER FUNCTION โฆ
Function ์ญ์
DROP FUNCTION FN_TEST
MSSQL , 0์ผ๋ก ๋๋๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ต๋๋ค ๊ด๋ จ ์ฒ๋ฆฌ
-- ๋ฐฉ๋ฒ 1 select case when isnull(data1,0) = 0 then 0 else data2 end as 'test' from A -- ๋ฐฉ๋ฒ 2 ์ค๋ฅ๊ฐ์ด null๊ฐ์ผ๋ก ๋ฐํ SET ANSI_WARNINGS OFF SET ARITHIGNORE ON SET ARITHABORT OFF
group by(์ง๊ณํจ์) vs partition by(์๋์ฐํจ์)
group by
group by
๋ ํ๋๋ก ํ
์ด๋ธ์ ์๋ฅด๊ณ , ์๋ผ์ง ์กฐ๊ฐ ๊ฐ์ ๋งํผ์ ๋ ์ฝ๋ ์์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅselect address, count(*) from Address group by address; --Result address | count ---------------- ์์ธ์ | 3 ์ธ์ฒ์ | 2 ๋ถ์ฐ์ | 1
partition by
partition by
๋ ์๋ ค์ง ๋ ์ฝ๋์ ์ข
๋ฅ๋ณ๋ก ์์
์ด ์ฒ๋ฆฌ๋๋, ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์ง์ฝ๋์ง ์์ผ๋ฏ๋ก ๊ธฐ์กด ๋ ์ฝ๋ ๊ฐ์๋งํผ ์ถ๋ ฅselect address, count(*) over(partition by address) from Address; --Result address | count ---------------- ์์ธ์ | 3 ์์ธ์ | 3 ์์ธ์ | 3 ์ธ์ฒ์ | 2 ์ธ์ฒ์ | 2 ๋ถ์ฐ์ | 1
๋น์จ ๊ด๋ จ ํจ์
- CUME_DIST
- ํํฐ์ ๋ด ์ ์ฒด ๊ฑด์ ์ค์์ ํ์ฌ ํ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑด์์ ๋ํ ๋์ ๋ฐฑ๋ถ์จ
- PERCENT_RANK
- ํํฐ์ ์์ ๊ฐ์ฅ ์ฒ์ ๊ฐ์ 0 ๊ฐ์ฅ ๋์ค์ ๊ฐ์ 1์ผ๋ก ํ์ ์์๋ณ ๋ฐฑ๋ถ์จ ์กฐํ
- NTILE
- ํํฐ์ ๋ณ๋ก ์ ์ฒด ํ์ N๋ฑ๋ถํ ๊ฒฐ๊ณผ๋ฅผ ์กฐํ
- RATIO_TO_REPORT
- ํํฐ์ ๋ด ์ ์ฒด SUM(์ปฌ๋ผ)์ ๋ํ ํ๋ณ ์ปฌ๋ผ๊ฐ์ ๋ฐฑ๋ถ์จ์ ์์์ ๊น์ง ์กฐํ
# PERCENT_RANK ์์ : ๋ถ์ ๋ด ๊ธ์ฌ ํผ์ผํธ(๋ฑ์) ์กฐํ selct deptino, ename, sal, -- ๋ถ์๋ณ๋ก ํํฐ์ , ๊ธ์ฌ ๋ด๋ฆผ์ฐจ์ PERCENT_RANK() OVER (partition by depno order by sal desc) as per_sal from emp; #NTILE ์์ : ๊ธ์ฌ ๋์ ์์๋ก 4๋ฑ๋ถ select deptno, ename, sal -- 4๋ฑ๋ถ >> 1,2,3,4 ํ ๋น NTILE(4) OVER (order byt sal desc) as n_title from emp;
OUTER JOIN VS INNER JOIN ์ฑ๋ฅ
- ๋น ๋ฅธ ์๊ฐ๋ด์ ํด์ผํ ๊ฒฝ์ฐ left outer join ๋จ๋ฐ
- ๋์ ์ฑ๋ฅ์ด ์ ์ข์์ง
inner join
์๊ฐ ๋ณต์ก๋ O(n)
outer join
์๊ฐ ๋ณต์ก๋ O(n^2)
์ฟผ๋ฆฌ๋ฌธ ๋นจ๊ฐ์ค ํ์ ํด๊ฒฐ
ํธ์ง โ IntelliSense โ ๋ก์ปฌ ์บ์ ์๋ก๊ณ ์นจ
SQL ๋ค์ฌ์๊ธฐ ์ค๋ฅ
์ฟผ๋ฆฌ โ ์ฟผ๋ฆฌ์ต์
โ alt + = โ ํ์ธ
ํธ๋์ญ์ (Transaction)
- ํ๋ ํน์ ๋๊ฐ ์ด์์ SQL๋ฌธ๋ค๋ก ์ด๋ฃจ์ด์ง ์์ ์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์
- ํ๋์ ํธ๋์ญ์ ์์ ๋ชจ๋ SQL์ ๋์ผํ ํจ๊ณผ
- ์ฑ๊ณตํ๋ฉด ์ ๋ถ ์ฑ๊ณต ์คํจํ๋ฉด ์ ๋ถ ์คํจ
- ํ๋์ ํธ๋์ญ์ ์ ์ปค๋ฐ๋ ์๋ ์๊ณ ๋กค๋ฐฑ ๋ ์๋ ์๋ค.
์ปค๋ฐ
: ํ๋์ ํธ๋์ญ์ ์์ ๋ชจ๋ ๋ณํ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ตฌ์ ์ผ๋ก ๋ฐ์์ํค๋ ์์๋กค๋ฐฑ
: ํ๋์ ํธ๋์ญ์ ์์ ๋ชจ๋ ๋ณํ๋ค์ ์ทจ์
์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ๊ธฐ ์ ์ํ
- ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ณํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒํผ์ ์ ์ฅ๋๋ค.
- ํ์ฌ์ ์ฌ์ฉ์๋ ์์ ์ด ๋ณํ์ํจ ๋ฐ์ดํฐ๋ฅผ SELECT๋ฌธ์ ํตํด์ ๋ณผ ์ ์์ง๋ง ์์ ์ด์ธ์ ์ฌ์ฉ์๋ ๊ทธ ๋ณํ๋ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
- ์์ ์ด ๋ณํ์ํจ Row์ ๋ํด์๋ ๋ก(Lock)์ด ๊ฑธ๋ฆฐ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํด๋น Row๋ฅผ ๋ณํ์ํค์ง ๋ชปํ๋ค. ( Row Level Locking Mechanism )
- ํ ์ด๋ธ์ row๋ง๋ค ๊ฑธ๋ฆฌ๋ lock
์ปค๋ฐ ํ ํ ์ํ
- ํธ๋์ญ์ ๋ด๋ถ์์ ๋ณํ๋ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ตฌ์ ์ผ๋ก ๋ฐ์
- ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ณํ๋ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
- ํด๋น Row์ ๋ํ ๋ก(Lock)์ด ์ ๊ฑฐ๋๋ค.
์ธ๋ฑ์ค(INDEX)
๊ฒ์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋์ ๊ธฐ์
- ํ๋ ํน์ ๋๊ฐ ์ด์์ ์ปฌ๋ผ๊ณผ ROWID๋ก ๊ตฌ์ฑ
- index๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ๊ฐ์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ ๋ชจ๋ ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ ROWID๋ก ์ ๋ ฌ๋์ด ์๋ค.
- ํ ์ด๋ธ๊ณผ๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ค๋ฅธ ์ ์ฅ์ฅ์์ ์ ์ฅ๋๋ค.
ํ ์ด๋ธ ์ก์ธ์ค ๋ฐฉ๋ฒ
- BY ROWID : ํ ์ด๋ธ์ ํน์ Row์ ๋ํ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ง์ ํ ์ด๋ธ์ ์ก์ธ์ค
- Full-table-Scan : ํ ์ด๋ธ์ ์กด์ฌํ๋ ๋ชจ๋ Row์ ๋ํด์ ์์ฐจ์ ์ผ๋ก ์ก์ธ์ค
- By INDEX : ๋จผ์ INDEX๋ฅผ ์ฝ๊ณ ์ INDEX์ ROWID๋ฅผ ๊ฐ์ง๊ณ ํ ์ด๋ธ์ Random ์ก์ธ์ค
์ธ๋ฑ์ค ์์ฑ
-- ๊ธฐ๋ณธ ์์ฑ create index [index_name] on [table_name] (column_name); -- Unique index ์์ฑ create unique index [index_name] on [table_name] (column_name); -- primary key, unique ์ ์ฝ์กฐ๊ฑด์ ์ฃผ๋ฉด unique index๋ ์๋์ ์ผ๋ก ๋ง๋ค์ด์ง
์ธ๋ฑ์ค ์ญ์
DROP INDEX [์ธ๋ฑ์ค๋ช ] ON [ํ ์ด๋ธ๋ช ]
ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค
create clustered index [index_name] on [table_name] (column_name);
์คํ ๊ณํ ๋ ผ๋ฆฌ ๋ฐ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ฐธ์กฐ
Compute Scalar
์์ ํ๊ฐํ์ฌ ๊ณ์ฐ๋ ์ค์นผ๋ผ ๊ฐ์ ์์ฑ
- ๊ทธ๋ฌ๋ฉด ์ฌ์ฉ์์๊ฒ ๋ฐํ๋๊ฑฐ๋. ์ฟผ๋ฆฌ์ ๋ค๋ฅธ ์์น์์ ์ฐธ์กฐ๋๊ฑฐ๋, ๋ ๋ค ๋ฐ์ํ ์ ์์ต๋๋ค.
Stream Aggregate
ํ๋ ์ด์์ ์ด์ ๊ธฐ์ค์ผ๋ก ํ์ ๊ทธ๋ฃนํํ ๋ค์ ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ํ๋ ์ด์์ ์ง๊ณ ์์ ๊ณ์ฐ
- ๊ทธ๋ฃน ๋ด์ ์ด์ ๋ฐ๋ผ ์ ๋ ฅ์ ์ ๋ ฌํด์ผ ํจ
- ์ด์ Sort ์ฐ์ฐ์, ์ ๋ ฌ๋ ์ธ๋ฑ์ค ์ฐพ๊ธฐ ๋๋ ์ค์บ์ผ๋ก ์ธํด ๋ฐ์ดํฐ๊ฐ ์์ง ์ ๋ ฌ๋์ง ์์ ๊ฒฝ์ฐ ์ต์ ํ ํ๋ก๊ทธ๋จ์ ์ด ์ฐ์ฐ์ ์์ Sort ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ
๋ฌผ๋ฆฌ ์ฐ์ฐ์
์ฌ๊ท์ ๊ณตํต ํ ์ด๋ธ ํํ์ (CTE)
์ต์ปค ๋ฉค๋ฒ(Anchor Member)
์ฌ๊ท ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ์ด๊ธฐ ์ฟผ๋ฆฌ
์ฌ๊ท ๋ฉค๋ฒ(Recursive Member)
์ต์ปค ๋ฉค๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ ์ฟผ๋ฆฌ
์คํ ๊ณผ์
- ์ต์ปค ๋ฉค๋ฒ ์คํ
- ์ต์ปค ๋ฉค๋ฒ ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์คํ๋์ด ์ด๊ธฐ ๊ฒฐํฉ ์งํฉ์ ์์ฑ
- ์ฌ๊ท ๋ฉค๋ฒ ์คํ
- ์ฌ๊ท ๋ฉค๋ฒ ์ฟผ๋ฆฌ๊ฐ ์ต์ปค ๋ฉค๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑ
- ๋ฐ๋ณต ์คํ
- ์ฌ๊ท ๋ฉค๋ฒ ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋์ด ๊ฐ ๋ฐ๋ณต์์ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ
- ์ข ๋ฃ ์กฐ๊ฑด ํ์ธ
- ์ฌ๊ท ๋ฉค๋ฒ์ ์ข ๋ฃ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ๋ฐ๋ณต์ด ์ค๋จ
with ์ ์ ๋์ ๋ฐฉ์
Inline View
with ์ ์ ํฌํจ๋ ์ฟผ๋ฆฌ์ ๋ํด ๋ฌผ๋ฆฌ์ ์ผ๋ก ์์ ํ
์ด๋ธ์ ์์ฑํ์ง ์๊ณ ์ฟผ๋ฆฌ ๊ทธ ์์ฒด๋ก ์ ์ฅํด๋๋ ๋ฐฉ์
- with ์ ๋ก ์ ์๋ ํ ์ด๋ธ์ด ์ฐธ์กฐ๋ ํ์๋งํผ ๋ฐ๋ณต ์ํ
- with์ ์ด ๋ณธ์ ์์ 1๋ฒ ์ฌ์ฉ๋ ๋ ํ์ฉํ๋ ๋ฐฉ์
- ์๋ธ์ฟผ๋ฆฌ์ ๋ค๋ฅผ ๊ฒ ์๋ ์ฑ๋ฅ
Materialize
๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ
์ด๋ธ์ ์์ฑํจ์ผ๋ก์จ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๊ณ , ๋ฐ๋ณตํด์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์
- with ์ ๋ก ์ ์๋ ํ ์ด๋ธ์ด 2๋ฒ ์ด์ ์ฌ์ฉ๋ ๋ ํ์ฉ
- with์ ์ ํตํด ์ ์ฅ๋ ๊ฒฐ๊ณผ๊ฐ์ ๋ถ๋ฌ์ ์คํ ํ์๋ฅผ ์ค์ฌ์ค์ผ๋ก์จ ์ฑ๋ฅ์ ๊ฐ์
Bulk Insert
CSV ํ์ผ์ ์ด์ฉํด์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ์ INSERT ํ ๋ ํธ๋ฆฌ
BULK INSERT A ํ ์ด๋ธ FROM 'ํ์ผ๊ฒฝ๋ก' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', BATCHSIZE = 100)
- FIRSTROW : ์์ํ ํ
- FIELDTERMINATOR : ๊ตฌ๋ถ์
- ROWTERMINATOR : ํ ๊ตฌ๋ถ์
- BATCHSIZE : ์ผ๊ด ์ฒ๋ฆฌ ํ ์
REPLICATE
์กฐ์ธ์ ์ผ์ชฝ์ ์๋ ํ
์ด๋ธ์์ ์กฐ์ธ ์ด์ ๊ฐ์ ๋ชจ๋ ๋
ธ๋๋ก ๋ณต์
์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ณต์ ๋ ๋ฒ์ ์ ํด๋น ์ด๊ณผ ์กฐ์ธ๋ฉ๋๋ค.
OUTPUT ์
INSERT, UPDATE, DELETE ๋๋ MERGE ๋ฌธ์ ์ํฅ์ ๋ฐ๋ ๊ฐ ํ์ ์ ๋ณด ๋๋ ๊ฐ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์์ ๋ฐํํฉ๋๋ค.
- output ๊ตฌ๋ฌธ์๋ ์๋ธ์ฟผ๋ฆฌ X
insert into Customer (BusinessCode, CustomerName) output inserted.* values ('0006','๋์ฐ') DELETE Sales.ShoppingCartItem OUTPUT DELETED.*;
declare @ProductID nvarchar(4) = '5006' declare @ProductName nvarchar(50) = '๋ฐฐํฐ๋ฆฌ3' declare @Standard int = 50 merge Product as T -- Target using ( select @ProductID as ProductID, @ProductName as ProductName, @Standard as Standard ) as S on -- Source T.ProductID = S.ProductID when matched and S.Standard != 0 then update set ProductName = S.ProductName, Standard = S.Standard when matched and S.Standard = 0 then delete when not matched then insert (ProductID, ProductName, Standard) values (S.ProductID, S.ProductName, S.Standard) output inserted.*, deleted.* ;
declare @ProductID nvarchar(4) = '5006' declare @ProductName nvarchar(50) = '๋ฐฐํฐ๋ฆฌ3' declare @Standard int = 50 if(@ProductID != '' and @ProductName != '' and @Standard != 0) begin insert into Product (ProductID, ProductName, Standard) values(@ProductID, @ProductName, @Standard) select * from Product where ProductID != @ProductID and ProductName != @ProductName and Standard != @Standard and exists (select 1 from Product where ProductID = @ProductID) end
Emergency ๋ฐฑ์
1. ๋น์๋ก๊ทธ ๋ฐฑ์ (Tail-Log Backup)
ํด๋น DB์ ๋ง์ง๋ง ํธ๋์ญ์
๋ก๊ทธ ๋ฐฑ์
์ดํ ์์ ์ ๊ธฐ์ค์ผ๋ก ์ง๊ธ๊น์ง์ ๋ชจ๋ ํธ๋์ญ์
๋ก๊ทธ๋ฅผ ๋ฐฑ์
ํ๋ ๊ฒ
-- ๋น์๋ก๊ทธ ๋ฐฑ์ -- ์ ๋ ๊ธฐ์กด์ ํธ๋์ญ์ ๋ก๊ทธ ๋ฐฑ์ ๊ณผ ๊ฐ์ ํ์ผ๋ช ์ผ๋ก ๋ฐฑ์ ์ํค์ง ๋ง ๊ฒ BACKUP LOG [DB์ด๋ฆ] TO DISK = '๋น์๋ก๊ทธ ๋ฐฑ์ ์ ์ ์ฅ์ํฌ ๋๋ ํ ๋ฆฌ' WITH NO_TRUNCATE, FORMAT -- FORMAT ์ต์ ์ ๋ง์ฝ ์ด์ ์ ๋น์๋ก๊ทธ ๋ฐฑ์ ์ด ๊ฐ์ ํ์ผ๋ช ์ผ๋ก ์กด์ฌํ๋ค๋ฉด ํด๋น ๋ฐฑ์ ์ธํธ ์ ๊ฑฐ
2. DB ๋ฐฑ์ ๋ณธ ๋ถ๋ฌ์์ ๋ถ์ด๊ธฐ
[Object Explorer] - [Databases] - [Restore Database] ํด๋ฆญ
๋ถ์ผ DB ๋ฐฑ์
๋ณธ Add
๋ณต์์ํฌ DB์ ์ด๋ฆ ๋ณ๋ ์ง์
Restore ์ต์
์ง์
3. ๋ณต์ ์ํฌ ์์ ์ฐพ๊ธฐ
select top 100 QS.creatino_time, -- SQL SUBSTRING(ST.text, (QS.statement_start_offset/2)+1, ((CASE QS.statemnet_end_offeset when -1 then DATELENGTH(st.text) else QS.statement_end_offset end - QS.statement_start_offset)/2) + 1 ) as statement_text, ST.text, -- ์คํ๊ณํ QS.total_worker_time, QS.last_worker_time, QS.max_worker_time, QS.min_worker_time from sys.dm_exec_query_stats QS -- sys.dm_exec_query_stats : ์คํ๋ ์ฟผ๋ฆฌ์ ๋ํ ํต๊ณ ํ ์ด๋ธ cross apply sys.dm_exec_sql_text(QS.sql_handle) ST -- ๋ณต์ํด์ผ ๋ ์์ where creation_time between '2022-06-29 11:00:00' and '์๊ฐ' order by QS.creation_time desc
4. Restore ์งํ ๋ฐ Recovery State๋ฅผ โRECOVERYโ๋ก ๋ฐ๊พธ๊ธฐ
-- ๋น์๋ก๊ทธ ๋ฐฑ์ ๋ณธ์์ ํด๋น ์์ ์ ์ฐพ์ ๋ณต์ RESTORE LOG AdventureWorks2019_dummy from DISK = 'E:\SQL Server BackUp\EmergencyTrnBak.bak' WITH MOVE 'AdventureWorks2017' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\AdventureWorks2019_Dummy.mdf', MOVE 'AdventureWorks2017_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\AdventureWorks2019_Dummy_Log.ldf', NORECOVERY, STOPAT = '2022-06-29 11:19:35.946', STATS=10 -- ์ค์ํ 'UPDATE ํธ๋์ญ์ '์ ์์ ์๊ฐ -0.001์ด ์ง์ ์ผ๋ก ๋กค๋ฐฑ -- ๋ณต์์ด ๋๋ ํ DB์ 'Restoring...' ์ํ๋ฅผ ํด์ . RESTORE DATABASE AdventureWorks2019_Dummy WITH RECOVERY
5. ๋ณต์ํ Dummy DB๋ฅผ ํตํด ์๋ DB์ ๋ฐ๋ ๋ถ๋ถ ์๋ณตํ๊ธฐ
'E:\SQL Server BackUp\EmergencyTrnBak.bak' WITH MOVE 'AdventureWorks2017' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\AdventureWorks2019_Dummy.mdf', MOVE 'AdventureWorks2017_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\AdventureWorks2019_Dummy_Log.ldf', NORECOVERY, STOPAT = '2022-06-29 11:19:35.946', STATS=10 -- ์ค์ํ 'UPDATE ํธ๋์ญ์ '์ ์์ ์๊ฐ -0.001์ด ์ง์ ์ผ๋ก ๋กค๋ฐฑ -- ๋ณต์์ด ๋๋ ํ DB์ 'Restoring...' ์ํ๋ฅผ ํด์ . RESTORE DATABASE AdventureWorks2019_Dummy WITH RECOVERY
๋ณ๊ฒฝ ๋ด์ฉ ์ถ์
1. ์ธํ
-- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ๋ด์ฉ ์ถ์ ์ค์ alter database BusinessDB set change_tracking = on (change_retention = 2 days, auto_cleanup = on) -- ์ถ์ ์ ๋ณด๊ฐ ์ ์ง๋๋ ๊ธฐ๊ฐ์ ์ง์ --์ด ๊ธฐ๊ฐ๋ณด๋ค ์ค๋๋ ๋ณ๊ฒฝ ๋ด์ฉ ์ถ์ ์ ๋ณด๋ ์ ๊ธฐ์ ์ผ๋ก ์ ๊ฑฐ -- ํ ์ด๋ธ์ ๋ํ ๋ณ๊ฒฝ ๋ด์ฉ ์ถ์ ์ค์ alter table BusinessDB.dbo.Product enable change_tracking with (TRACK_COLUMNS_UPDATED = on)
2. ๋ณ๊ฒฝ ๋ด์ฉ ๊ฐ์ ธ์ค๊ธฐ
declare @last_synchronization_version bigint; SELECT CT.ProductID, ProductName, Standard , CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT FROM BusinessDB.dbo.Product AS P RIGHT OUTER JOIN CHANGETABLE(CHANGES BusinessDB.dbo.Product, @last_synchronization_version) AS CT on P.ProductID = CT.ProductID;
ย