์์ค! ๋ ์จ ๊ฐ์ถฅ๋ค ใ ใ .. ํ์ดํ ํด์ ์ ์ด๋ด ์๋ค.
SQL(Structured Query Language)
SQL์
Structured Query Language
๋ฆฌ๋ ๋ง์ ๋ง๊ฒ ํด๋ผ์ด์ธํธ์ ์์ฒญ(Query)๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์ธ์ด์ ๋๋ค. ์ฝ๊ฒ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค๋ฅธ ์ธ์ด์ธ Java, c++ ๋ฑ์ SQL ๋ฌธ์ ์ฝ์ ํ์ฌQuery
๋ฅผ ์ฒ๋ฆฌํ๊ณ DB๋ฅผ ์กฐ์ํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋๋ฐ ์์ด ํ์์ ์ธ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค.โ
SQL
๊ณผC
์ธ์ด์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๊ฐ๋ฐ์ ๋ชฉ์ ์์ฒด๊ฐ ๋ค๋ฆ ๋๋ค. C์ธ์ด์ ๊ฐ์ ํ๋ก๊ทธ๋จ ์ธ์ด๋ ์์คํ ์ํํธ์จ์ด๋ ์์ฉ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ง ์ธ์ด์ด๋ SQL์ ์ฃผ๋ก Query๋ฅผ ํตํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๋ชฉ์ ์ ๊ฐ๊ฐ์ ์ธ์ด๊ฐ ๊ฐ์ง๊ณ ์์ต๋๋ค.
CREATE TABLE ์ ํ (
์ ํ๋ฒํธ CHAR(30) NOT NULL,
์ ํ๋ช
VARCHAR(20),
์ฌ๊ณ ๋ INT,
๋จ๊ฐ INT,
์ ์กฐ์
์ฒด VARCHAR(20),
PRIMARY KEY(์ ํ๋ฒํธ),
CHECK (์ฌ๊ณ ๋ ใ= 0 AND ์ฌ๊ณ ๋ ใ= 1000)
);
CREATE TABLE ์ฃผ๋ฌธ (
์ฃผ๋ฌธ๋ฒํธ CHAR(30) NOT NULL,
์ฃผ๋ฌธ๊ณ ๊ฐ VARCHAR(20),
์ฃผ๋ฌธ์ ํ CHAR(30),
์๋ INT,
๋ฐฐ์ก์ง VARCHAR(30),
์ฃผ๋ฌธ์ผ์ DATETIME,
PRIMARY KEY(์ฃผ๋ฌธ๋ฒํธ),
FOREIGN KEY(์ฃผ๋ฌธ๊ณ ๊ฐ) REFERENCES ๊ณ ๊ฐ(๊ณ ๊ฐ์์ด๋),
FOREIGN KEY(์ฃผ๋ฌธ์ ํ) REFERENCES ์ ํ(์ ํ๋ฒํธ)
);
ALTER TABLE ํ
์ด๋ธ_์ด๋ฆ
ADD ์์ฑ_์ด๋ฆ ๋ฐ์ดํฐ_ํ์
[NOT NULL] [DEFAULT ๊ธฐ๋ณธ_๊ฐ];
ALTER TABLE ๊ณ ๊ฐ ADD ๊ฐ์
๋ ์ง DATETIME;
ALTER TABLE ํ
์ด๋ธ_์ด๋ฆ DROP ์์ฑ_์ด๋ฆ CASCADE | RESTRICT;
ALTER TABLE ๊ณ ๊ฐ DROP ๋ฑ๊ธ CASCADE;
์์ Cascade์ Restrict์ ์ฐจ์ด๋ ๊ด๋ จ ์ฐธ์กฐํ๋ ์์ฑ ํน์ ์ ์ฝ์กฐ๊ฑด ๊น์ง ๊ฐ์ด ์ญ์ ํ๋์ง ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ฐ๋ฆฌ๊ฐ ๊ธฐํธ์ ๋ง๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ALTER TABLE ํ
์ด๋ธ_์ด๋ฆ ADD CONSTRAINT ์ ์ฝ์กฐ๊ฑด_์ด๋ฆ ์ ์ฝ์กฐ๊ฑด_๋ด์ฉ;
ALTER TABLE ๊ณ ๊ฐ ADD CONSTRAINT CHK_AGE CHECK(๋์ด ใ= 20);
ALTER TABLE ํ
์ด๋ธ_์ด๋ฆ DROP CONSTRAINT ์ ์ฝ์กฐ๊ฑด_์ด๋ฆ;
ALTER TABLE ๊ณ ๊ฐ DROP CONSTRAINT CHK_AGE;
DROP TABLE ํ
์ด๋ธ_์ด๋ฆ CASCADE | RESTRICT;
DROP TABLE ๊ณ ๊ฐ RESTRICT;
๋ณธ๊ฒฉ์ ์ผ๋ก ๋๋ฒ์งธ ์ธ๋ฒ์งธ ์ง๋ฌธ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ด์ ์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ์กฐ์ ๊ธฐ๋ฅ์ ๋ํด์ ์ค๋ช ํ๊ณ ๋ค์์ผ๋ก ๋์ด ๊ฐ๊ฒ ์ต๋๋ค!
๐๐ป ๋ฐ์ดํฐ์ ๊ฒ์ (SELECT)
SELECT
๋ฌธ์ ๋ค์ํ ๊ฒ์ ์ ํ์ ์ง์ํ๋ฉฐ, ์ผ๋ฐ ์ฌ์ฉ์๋ค์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ฏ๋ก ๊ผผ๊ผผํ ์ดํ๋ณด์์ผ ํฉ๋๋ค!
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒ์์ ์ํ SELECT์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
SELECT [ALL|DISTINCT] ์์ฑ_๋ฆฌ์คํธ FROM ํ
์ด๋ธ_๋ฆฌ์คํธ;
SELECT ๊ณ ๊ฐ์์ด๋, ๊ณ ๊ฐ์ด๋ฆ, ๋ฑ๊ธ FROM ๊ณ ๊ฐ;
SELECT * FROM ๊ณ ๊ฐ;
๋ชจ๋ ์์ฑ ๊ฒ์
ํน์ ์์ฑ๋ง ๊ฒ์
๋๋ฒ์งธ SQL๋ฌธ์์ ์ ์ ์๋ ๋ด์ฉ์ ๊ณ ๊ฐ์ด๋ผ๋ ํฐ ํ
์ด๋ธ์์ ๊ณ ๊ฐ ์์ด๋, ๊ณ ๊ฐ ์ด๋ฆ, ๋ฑ๊ธ์ด๋ผ๋ Attribute ๊ฐ์ ๊ฒ์ํ ๊ฒ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์์ผ๋ก ์ค๋ Query์์๋ *
๋ฅผ ๋ฃ์๋๋ฐ ์ด ๊ฒ์ ๊ณ ๊ฐ์ด๋ผ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์์ฑ ๊ฐ์ ๊ฒ์ํ๋ ๊ฒ์
๋๋ค. ๋๋ฒ์งธ ํน์ ์์ฑ๋ง ๊ฒ์ ํ์ ๊ฒฝ์ฐ ์ ์ ์๋ ์ฐจ์ด๋ ์ผ๋ฐ ๋ฆด๋ ์ด์
๊ณผ๋ ๋ค๋ฅด๊ฒ ์ค๋ณต๊ฐ์ด ๋ง์ด ๋์ค๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ SELECT
๋ฅผ ์ฌ์ฉํ์๋ ์ค๋ณต๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
๋ง์ฝ ์ ๊ฐ์ ์ค๋ณต์ ์์ ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ DISTINCT
๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค.
SELECT DISTINCT ์ ์กฐ์
์ฒด FROM ์ ํ;
์ค๋ณต ์ ๊ฑฐ ํ
์ด๋ธ
์์ `DISTINCT`๋ ์ค์ ํด๋น ์์น์ ๊ฐ์ด ๋ณํ๋ ๊ฒ์ด ์๋ ์์ํ๊ฒ ์ค๋ณต์ด ์ ๊ฑฐ๋ ํ์ ๋จ์ ๊ฐ๋ค์ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
SELECT ์ ํ๋ช
, ๋จ๊ฐ AS ๊ฐ๊ฒฉ FROM ์ ํ;
์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ํฐ๋ฅผ ๋๋ฅด๊ฒ ๋ ๊ฒฝ์ฐ ๋จ๊ฐ๋ผ๋ ์์ฑ๊ฐ์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ๋ ํ์ ํ ์ด๋ธ์ ๊ฒ์ํด์ ๋ณผ ์ ์์ต๋๋ค.
INSERT INTO ํ
์ด๋ธ_์ด๋ฆ[(์์ฑ_๋ฆฌ์คํธ)] VALUES (์์ฑ๊ฐ_๋ฆฌ์คํธ);
INSERT
INTO ๊ณ ๊ฐ(๊ณ ๊ฐ์์ด๋, ๊ณ ๊ฐ์ด๋ฆ, ๋์ด, ๋ฑ๊ธ, ์ง์
, ์ ๋ฆฝ๊ธ)
VALUES ('strawberry', '์ต์ ๊ฒฝ', 30, 'vip', '๊ณต๋ฌด์', 100);
SELECT * FROM ๊ณ ๊ฐ;
Insert with value query
์์ ์ฌ์ง์์ ๋ณด์ด๋ฏ์ด ๋ฆด๋ ์ด์
์ธ์คํด์ค๋ฅผ ์ถ๊ฐ ํ ์ ์๋๋ก ํ๋ sql ๋ฌธ์ด INSERT [TABLE NAME](Attributes) VALUES(Relation Attributes and instance);
์ด๋ค.
โ๏ธNULL ๊ฐ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐ
INSERT
INTO ๊ณ ๊ฐ(๊ณ ๊ฐ์์ด๋, ๊ณ ๊ฐ์ด๋ฆ, ๋์ด, ๋ฑ๊ธ, ์ ๋ฆฝ๊ธ)
VALUES ('tomato', '์ ์์ฌ', 36, 'gold', 4);
SELECT * FROM ๊ณ ๊ฐ;
ํด๋น ํ ์ด๋ธ์ ์ ์ธํ๋ ๋จ๊ณ์์ ์ ๋ ฅ๊ฐ์ Not Null์ด๋ผ๋ ๊ฒ์ ๊ฐ์ด ์ ์ธํ์ง ์์ Attribute์ ๋ํด์๋ null ๊ฐ์ด ๋ค์ด๊ฐ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ค.
UPDATE [TABLE_NAME] SET ATTRIBUTE_NAME1 = VAL1, ATTRIBUTE_NAME2 = VAL2, [WHERE];
Update๋ฌธ์ ๋ฐ์ด๋ธ์ ์ ์ฅ๋ ํํ์์ ํน์ ์์ฑ์ ๊ฐ์ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์์ ํ ์ง์ ๋ํ ์ ๋ณด๋ SET ๋ค์ ์
๋ ฅํ ๋ด์ฉ์ผ๋ก ์์ ์ ์งํํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ง์ฝ WHERE
๋ฌธ์ ์๋ตํ๊ฒ ๋๋ค๋ฉด ๋ชจ๋ ํํ์ ๋ํด์ ๋ด์ฉ์ด ์์ ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
UPDATE ์ฃผ๋ฌธ
SET ์๋ = 5
WHERE ์ฃผ๋ฌธ๊ณ ๊ฐ IN (SELECT ๊ณ ๊ฐ์์ด๋
FROM ๊ณ ๊ฐ
WHERE ๊ณ ๊ฐ์ด๋ฆ = '์ ์ํ');
SELECT * FROM ์ฃผ๋ฌธ;
DELETE FROM [TABLE_NAME] [WHERE];
DELETE
FROM ์ฃผ๋ฌธ
WHERE ์ฃผ๋ฌธ์ผ์ = '2013-05-22';
SELECT * FROM ์ฃผ๋ฌธ;
์ด DELETE
๋ฌธ๋ ๊ทธ ์ ์ UPDATE
์ ๊ฐ์ด WHERE
๋ฌธ์ ์๋ตํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ
์ด๋ธ์ ๊ฐ์ ๋ํด ์งํ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ํด์ผํ๋ค.
โ
์์ฑํ SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๊ณผ์
์ ํฌ๊ฒ ํ์ฑ(parse), ์ปดํ์ผ, ์ต์ ํ(execute), ์คํ(fetch)์ผ๋ก ๋๋ฉ๋๋ค. ์ฐ์ ์ฌ์ฉ์๊ฐ ์์ฑํ ์ฟผ๋ฆฌ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ถ์๋๊ณ , ๊ทธ ํ ์ปดํ์ผ๋ฌ์ ์ํด ๊ธฐ๊ณ์์ ๊ฐ๊น์ด ํํ๋ก ๋ณํ ๋ฉ๋๋ค. ์ต์ ํ๋ ์คํ ๊ณํ์ ํจ์จ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ๋จ๊ณ์ด๋ฉฐ, ๋ง์ง๋ง์ผ๋ก ์ต์ ํ๋ ๊ณํ์ ๋ฐ๋ผ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
โ What is
SQL
Parsing?
SQL Parsing
์ SQL ์คํ ๊ณผ์ ์ ํ๋๋ก์จ, ๊ฐ๊ฐ์ ๋ค๋ฅธ ๋ฃจํด์์ ์คํ์ด ๋ ์ ์๊ฒ SQL๋ฌธ์ ์กฐ๊ฐ ์กฐ๊ฐ ๋๋๋ ๋จ๊ณ๋ฅผ ๋งํฉ๋๋ค. ์ค์ง์ ์ผ๋ก SQL Statement๊ฐ ์คํ์ด ๋๋๊ฒ์ ๊ทธ๋ ๊ฒ ํ์ฑ๊ณผ์ ์์ ์ชผ๊ฐ์ง๊ณ ์ ์ก๋ Application์์ ์งํ์ด ๋ฉ๋๋ค.
- Application ์์ SQL ๋ฐํ
- Parse Call to Database for statement excution
โก๏ธ Parse call์ ํ์ฑ๋ SQL statement์ ๋ค๋ฅธ ์ฒ๋ฆฌ์ค์ธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋private SQL
์์ญ์ ๋ค์ด๊ฐ ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ํด๋น ์์ญ์ ์ปค์๋ฅผ ํ์ฑํ๋ค.
โก๏ธ ์ด๋ฌํ Parse Call์ ํตํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Statement ์คํ์ ์ ๋ฐ๊ฒฌ ๋ ์ ์๋ ์ค๋ฅ๋ค์ ์๋ฒฝํ๋ ํ์ธ์ ์ํํฉ๋๋ค.
โ What is Syntax Check & Sementic Check & Shared Pool Check?
- Syntax Check๋ ๋จ์ํ๊ฒ ๋ด๊ฐ ์ ๋ ฅํ SQL Statement์ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธ ํ๋ ์์ ์ ๋งํฉ๋๋ค.
- Sementic Check๋ ๋ด๊ฐ ์ ๋ ฅํ SQL Statement๊ฐ ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์ง ํด์ํ๋ ์์ ์ ๋๋ค. ์๋ฅผ๋ค์ด ์ ๊ฐ ์ ์๋์ด ์์ง ์์ ํ ์ด๋ธ์ ์ค์๋ก
SELECT
๋ฅผ ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ ์ด๋ ๊ฒ ๋ฌธ๋ฒ์ ์ธ ์ค์๊ฐ ์๋ ์ ๊ฐ ์ ๋ ฅํ ๊ทธ Statement๊ฐ ์คํ๋๊ธฐ ์ํด์ ์๋ฏธ๋ฅผ ํด์ํ๋ ๊ณผ์ ์ ์์ด ๋ฌธ์ ๊ฐ ์๋์ง ํ์ ์ ํฉ๋๋ค.- Shared pool check๋ ํ์ฑํ๋ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฌ์ฉํ๋(์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ์ด์ง๋) ๋จ๊ณ์ ๋ํด์ ์คํต์ด ๊ฐ๋ฅํ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํ ํ์ธ ๋จ๊ณ๋ฅผ ์ค์ํฉ๋๋ค.
- ์ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฒ ์์ค๋ ๋ชจ๋ SQL Statement์ ๋ํ์ฌ Hash ๊ฐ์ ๋ง๋๋ Hashing ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ์น๋ฉด ํด๋น SQL์ ID๊ฐ ๋ถ์ฌ๋ฉ๋๋ค. ๋ค์ ์๋ก์ด ๋ฐ์ดํฐ์ ๋ํ SQL Statement๊ฐ ์ ๋ ฅ์ด ๋ ๋ ์์ ๊ณผ์ ์ ๋ ๊ฑฐ์น๋ฉด์ ๊ธฐ์กด์ ์ ์ฅ๋์๋ SQL ID์ ์ ๋ฌด๋ฅผ ํ์ธํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฒ ๋ฉ๋๋ค.
โ DML์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ์ธ์ด์ ๋๋ค. ์ฃผ์ ๊ตฌ๋ฌธ์ผ๋ก๋ SELECT, INSERT, UPDATE, DELETE๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ ์กฐ์์ด(DML)์ ํตํด์ ๋ฐ์ดํฐ์ ๊ฒ์, ์ฝ์ , ์์ , ์ญ์ ์ ์์ ์ ์ํํฉ๋๋ค.
โ DDL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ธ์ด์ ๋๋ค. ์ฃผ์ ๊ตฌ๋ฌธ์ผ๋ก๋ CREATE, ALTER,DROP๋ฑ์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ์์ด๋ ํ ์ด๋ธ์ ์์ฑํ๊ฑฐ๋, ์์ , ์ญ์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โ DCL์ ๋ฐ์ดํ ๋ฒ ์ด์ค ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ๊ฑฐ๋ ํ์ํ๊ธฐ ์ํ ์ธ์ด์ ๋๋ค. ์ฃผ๋ก GRANT, REVOKE ๋ฑ์ ์ด์ฉํด ํน์ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ์ฃผ๊ฑฐ๋ ํ์ํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค.
โ Hard Parse & Soft Parse
์์SQL PROCESSING
์ฌ์ง์ ๋ณด๋ฉด Parsingํ๋ ๊ณผ์ ์ดHard parse
์Soft parse
๋ก ๋๋๋ ๊ฒ์ ์ ์ ์๋ค.
Hard Parse
๋ผ๊ณ ํ๋ค. ์ด๋ ๊ฒ ํ๋ ํ์ฑ์ ํ๋ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์บ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ดํฐ ๋์
๋๋ฆฌ๋ฅผ ํ์ธํ ์๋ง์ ์บ์๋ฐ์ดํฐ์ ์ ๊ทผํฉ๋๋ค. ์ด๋, ํด๋น ์ ์๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํ์ ๊ฐ์ฒด(required object)์ ๋ํ ๋์น(Latch)๋ผ๋ ์ง๋ ฌํ ์ฅ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋์น ๊ฒฝํฉ(Latch Contention)์ ๋ช
๋ น๋ฌธ ์คํ ์๊ฐ์ ๋๋ฆฌ๊ณ ๋์์ฑ์ ๊ฐ์์ํต๋๋ค.๐ก What is a
Latch
?๋์น๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์ ์ก์ธ์ค๋ฅผ ์ ์ดํ๊ณ ์ํธ๋ฐฐ์ ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ฌ๋ฌ ํธ๋์ ์ ์ด๋ ์ค๋ ๋๊ฐ ๋์์ ๊ณต์ ์์์ ์ ๊ทผํ๋ฉด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋์น๋ ์ด๋ฌํ ๊ณต์ ์์์ ์ ๊ทผ์ ์ ์ดํ์ฌ ๋์ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ๋ง๋ญ๋๋ค.
๐ก What is a
Latch Contention
?๋์น ๊ฒฝํฉ์ ์ฌ๋ฌ ํธ๋์ ์ ์ด๋ผ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ์์์ ๋ํด ์ก์ธ์ค ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ํธ๋์ ์ ์ ๋ฒ์๋ฅผ ์ต์ํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์์ธ์ ์ต์ ํํ์ฌ ์์ ๊ณต์ ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
โ
Referential Integrity
๋ RDBMS์์ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ ๋ ํ ์ด๋ธ ๊ฐ์ ์ผ๊ด๋ ๊ด๊ณ๊ฐ ์ ์ง๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๊ฐ๋ ์ ๋๋ค. ์ด๋ฌํ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ธ๋ํค๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ ์๊ฐ ๋๋ฉฐ ๋ถ๋ชจํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ์์ ํ ์ด๋ธ์ ์ธ๋ ํค ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ ํ๋ ์ญํ ์ ํ๊ฒ๋ ๊ตฌํ์ด ๋ฉ๋๋ค.
CREATE TABLE Students = (
Students_Id int,
name VARCHAR(30),
Department_Id VARCHAR(30),
PRIMARY KEY(Students_Id),
FOREIGN KEY(Department_Id) REFERENCES Departments(Department_Id)
);
CREATE TABLE Departments = (
Department_Id int,
department VARCHAR(30),
PRIMARY KEY(Students_Id)
);
๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด: ์๋ฅผ ๋ค์ด, "ํ๊ณผ" ํ ์ด๋ธ์ ์ด๋ค ํ๊ณผID ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, ์ด์ ๊ด๋ จ๋ "ํ์" ํ ์ด๋ธ์ ๋ชจ๋ ํด๋น ํ๊ณผID๋ ํจ๊ป ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค.
๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค ๊ฐ์ด ์ญ์ ๋๋ฉด: "ํ๊ณผ" ํ ์ด๋ธ์์ ์ด๋ค ํ๊ณผ๊ฐ ์ญ์ ๋๋ฉด, ํด๋น ํ๊ณผ์ ์ํ ๋ชจ๋ ํ์ ๋ฐ์ดํฐ๋ ํจ๊ป ์ญ์ ๋์ด์ผ ํฉ๋๋ค.
โ CASCADE ์ค์ ์ ๋ถ๋ชจ ํ ์ด๋ธ์์ ์ํํ ์ ๋ฐ์ดํธ๋ ์ญ์ ์์ ์ด ์์ ํ ์ด๋ธ์๋ ์ ์ฉ๋๋๋ก ํ๋ ์ต์ ์ ๋๋ค. ๊ทธ๋์
CASCADE
๋ก ์ค์ ์ ํ๊ณDELETE
ํน์INSERT
๋ฅผ ํ๋ฉด, ๊ตฌ๋ถ ์์ด ๋ฐ์ดํฐ๊ฐ ๋ถ๋ชจ, ์์ ํ ์ด๋ธ ๋ชจ๋ ๋ฐ๋๊ณ ์ฐธ์กฐ์ ๋ํ ๋ด์ฉ๋ ์ฌ๋ผ์ ธ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฃผ์ ํด์ผ ํฉ๋๋ค.
View๋ฅผ ๋ฌ์ฌํ๋ ์ค๋ช ์ฌ์งโ VIEW๋ ํ๋ ์ด์์ ํ ์ด๋ธ์์ ์ ๋๋ ๊ฐ์ ํ ์ด๋ธ์ ๋๋ค. ์ ์ฅ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค. ์ฃผ๋ก ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถํ๊ฑฐ๋ ํน์ ํํ๋ก ์กฐ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์ด์ ์ ์์ด์ ๋ทฐ์์ ๋ฐ์ดํฐ์ ์์ ์ด๋ ์ญ์ ๋ ์์ฃผ ์ ํ์ ์ผ๋ก ์ด๋ค์ง๋๋ค.
CREATE VIEW ์ฐ์๊ณ ๊ฐ(๊ณ ๊ฐ์์ด๋, ๊ณ ๊ฐ์ด๋ฆ, ๋์ด)
AS SELECT ๊ณ ๊ฐ์์ด๋, ๊ณ ๊ฐ์ด๋ฆ, ๋์ด
FROM ๊ณ ๊ฐ
WHERE ๋ฑ๊ธ = 'vip'
WITH CHECK OPTION;
SELECT * FROM ์ฐ์๊ณ ๊ฐ;
์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ฉด ์ฐ์๊ณ ๊ฐ์ด๋ผ๋ ๋ทฐ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๋ทฐ์ ๊ณ ๊ฐ ์์ด๋๋ฅผ AS ๋ค์ SELET์ ๊ฐ์ด ๋ง๋ค๊ณ ๊ฐ์ค์ ๋ฑ๊ธ์ด vip์ธ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์๋์ ๊ฐ๋ค. ์ฌ๊ธฐ์ WITH CHECK. OPTIONS
๋ฅผ ํตํด ๋ทฐ ์์ฑ ํ vip ๋ฑ๊ธ์ด ์๋ ์ธ์คํด์ค์ ๋ํด ์ฝ์
๋ฐ ์ฐ์ฐ ๋ฑ์ ์ ํํ๋ค.
SELECT ์ฐ์ฐ ์ฒ๋ฆฌ ์์โ SELECT ์ ์ ์ฒ๋ฆฌ ์์๋ FROM, WHERE, GROUP BY, HAVING, SELECT,ORDER BY ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ํ ํ ์ด๋ธ์ ์ฐพ์ ๊ฒฐํฉํ๊ณ , ์กฐ๊ฑด์ ์ ์ฉํ๋ฉฐ, ๊ทธ๋ฃนํํ๊ณ , ํ์ํ ์ด์ ์ ํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํฉ๋๋ค. ์ด ๊ฐ์ ์คํ ์์๋ฅผ ์ ์๊ณ ์์ด์ผ ์ฟผ๋ฆฌ๋ฅผ ์คํํจ์ ์์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์์ธกํ ์ ์๋ค!
SELECT ~ UPDATE ์ค๋ช ์ ์ํ ์์ ํ ์ด๋ธโ ์ ํ๋ ํ๋ค์ ๋ํด ๋ฐฐํ์ ์ธ
LOCK
์ ์ค์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค.SELECT FOR UPDATE
๋ฌธ์ ํตํด ์ปค์ ๊ฒฐ๊ณผ ์งํฉ์ ๋ ์ฝ๋๋ฅผ ์ ๊ธ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๋ ์์ต๋๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ธ LOCK์ ํํ๋SELECT SHARED LOCK
์ ํํ๋ฅผ ๊ฐ์ง๋๋ค. ์ฌ์ด ๋ง๋ก "SELECT ~ FOR UPDATE ๊ตฌ๋ฌธ์ "๋ฐ์ดํฐ ์์ ํ๋ ค๊ณ SELECT ํ๋ ์ค์ด์ผ~ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ฐ์ดํฐ์ ์ ๋์ง ๋ง!" ๋ผ๊ณ ํ ์ ์์ต๋๋ค."๋ผ๊ณ ํฉ๋๋ค :)
๋น ๋ฅธ ์ดํด๋ฅผ ์ํด์ ํ ๋ธ๋ก๊ทธ์์ ๋ค์๋ ์์๋ฅผ ๋ค์ด ์ฌ๊ธฐ์ ๋์์ ๋ ์ฌ๋์ด ๊ฐ์ ์ํ๋ฅผ ์๋งคํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค!
๋ ์ฌ๋์ด ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ SELECT
ํ๊ณ ์๋งค๋ฅผ ์๋ฃ๋ฅผ ํ๋ฉด์ ์ข์์ด ์ค์ด๋ค๊ฒ ๋๋๋ฐ ์ด๋ ๊ฐ์ด ์๋งคํ๋ ๋ค๋ฅธ ์ฌ๋๋ ๋๊ฐ์ด SELECT
๋ฅผ ํ์ฌ ์ํ ์๋งค๋ฅผ ํ๊ฒ ๋์ด ๊ฒฐ๊ณผ์ ์ผ๋ก๋ 10 ์๋ฆฌ๊ฐ ๋จ์์ผํ๋, 11์๋ฆฌ๊ฐ ๋จ์๋ค๊ณ ๋์ค๊ฒ ๋ฉ๋๋ค.
โ๏ธ์ด๋ฐ ์ํฉ์ ๋๋นํ๊ธฐ ์ํด์! SELECT ~ FOR UPDATE
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์
๋๋ค. SELECT ~ FOR UPDATE
๊ฐ์ ๊ฒฝ์ฐ์๋ ๋์์ ๊ฐ์ ๋ฐ์ดํฐ์ ์ ์ํ์ฌ ์์ ํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ์ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ ๋ค๋ฅธ ์ฟผ๋ฆฌ์ ์ํ์ ์ ํํ๋ ๊ฒ ์
๋๋ค!
๊ทธ๋์ ๋ฐฉ๊ธ ์์์ ์ํฉ์ผ๋ก ๋ค์ ๋์๊ฐ ๋ณด๋ฉด ๋์์ ๋์ฌ๋์ด ์ํ๋ฅผ ์๋งค๋ฅผ ํ๋ ๊ฒฝ์ฐ๋ ํ ์ฌ๋์ด ์ํํ๋ฅผ ๊ตฌ๋งคํ ๊ฒ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ๊ทธ๋ ๋ค๋ฅธ ์ฌ๋์ด ์์ ๊ฐ์ ๊ณผ์ ์ ํ๋ฒ ๋ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
GROUP BY
&ORDER BY
๋ ๋จ์ด๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ๋ฐ์ดํฐ, ์ฟผ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ํน์ ํ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ฑฐ๋ ๋ฌถ๋๋ฐ ์ฌ์ฉํ๋ MySQL ์ฟผ๋ฆฌ์ธ์ด ์ ๋๋ค.
SELECT movie_num, seat, name AS movie_name
FROM CGV GROUP BY seat, movie_name;
์ ์ฝ๋๋ GCV๋ผ๋ ํ
์ด๋ธ์์ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๋๋ฐ ๊ฐ ์ค name
์ด๋ผ๋ attribute๋ฅผ movie_name
์ผ๋ก ํธ์ถํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค์ seat์ movie_name์ ๊ทธ๋ฃนํํ์ฌ ๊ฐ ์ํ๋น ์์ฌ์ข์์ด ์ผ๋ง๋ ์๋์ง ์ฝ๊ฒ ๋ณผ ์ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.SELECT movie_num, seat, name AS movie_name
FROM CGV ORDER BY seat DSC;
๋ผ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ ์ข์์ด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋๊ฒ ๋ฉ๋๋ค. ์ฆ ๊ฐ์ฅ ๋์ ๊ฒ์ด ๋จผ์ ์ค๊ณ ๋ด๋ ค ๊ฐ ์๋ก ์์ฌ์ข์์ด ์ ์ ๊ฒ์ผ๋ก ๋ฐฐ์น๋ฉ๋๋ค.
INNER JOIN
์ ์ผ์นํ๋ ํ๋ง ๋ฐํ์ ํฉ๋๋ค. ์ฆ, ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ์ ๊ฒฝ์ฐ์ ํ๋ง ๊ฒฐํฉ๋๊ฒ ๋ฉ๋๋ค.SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
์์ ์ฝ๋๋ธ๋ญ์ ๋ณด๋ฉด
INNER JOIN table2 ON table1.column - table2.column;
์ด๋ฐ ๋ถ๋ถ์ด ์๋๋ฐON
๋ค์ ๋์ค๋ ์กฐ๊ฑด์ด TRU๊ฐ ๋์ผ์ง๋ง JOIN์ด ๋๋ ์ฟผ๋ฆฌ์ ๋๋ค.
- ๊ทธ์ ๋ฐ์ OUTER JOIN์ ์กฐ๊ฑด์ด ๋ถํฉํ๊ธฐ ์๋ ํ๋ ํฌํจํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ๋จ์ํ๊ฒ ์ด์ ์ฝ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ
OUTER JOIN
์LEFT OUTER JOIN
,RIGHT OUTER JOIN
์ด ์์ต๋๋ค.
SELECT * FROM table1 LEFT OUTER JOIN table2
ON table1.column = table2.column;
LEFT OUTER JOIN
๊ณผ๋ ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ ํ
์ด๋ธ(table2)์ ๋ชจ๋ ํ์ ์ ํํ๊ณ (๊ธฐ์ค์ผ๋ก ์๊ฐํ๊ณ ), ์ผ์ชฝ ํ
์ด๋ธ(table1)๊ณผ ์ผ์นํ๋ ํ์ด ์์ผ๋ฉด(ON ๋ค์ ์กฐ๊ฑด) ๊ฒฐํฉํฉ๋๋ค.SELECT * FROM table1 RIGHT OUTER JOIN table2
ON table1.column = table2.column;
SELECT * FROM table1 CROSS JOIN table2;
CROSS JOIN
์ ์์์ ์ธ๊ธํ OUTER JOIN
๊ณผ ๊ฐ์ฅ ์ ์ฌํ ๊ฐ๋
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํน์ํ ์กฐ๊ฑด์์ด table2๋ฅผ table1๊ณผ ๊ฒฐํฉํ๊ฒ ํ๋ ์ฟผ๋ฆฌ ์
๋๋ค.
์๋ธ์ฟผ๋ฆฌ
๋ผ๋ ๊ฒ์ ํ๋์ SQL Statement์ ํฌํจ๋์ด ์๋ ๋๋ค๋ฅธ Statement๋ฅผ ๋งํฉ๋๋ค.
ํฌ๊ฒ ์๋ธ์ฟผ๋ฆฌ๋ 4๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค
SELECT * FROM CGV WHERE seat =
(SELECT seat FROM MEGABOX WHERE seat = '8')
ORDER BY *;
์ด๋ ๊ฒ ์กฐ๊ฑด์ ๊ฑธ์์ ๋ MEGEBOX
๋ผ๋ ํ
์ด๋ธ์ seat
๊ฐ 8๊ณผ ๊ฐ์ ๊ฐ์ด 2๊ฐ ์ด์ ์์ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ๊ทธ๋ฃน ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฃน ์์ฒด๊ฐ ํ ๊ฑด์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ๋ก์จ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
SELECT * FROM CGV WHERE seat =
(SELECT seat FROM MEGABOX WHERE seat = '8')
GROUP BY *;
SELECT * FROM CGV WHERE seat =
(SELECT seat,movie_num FROM MEGABOX WHERE seat,movie_num = '8')
ORDER BY *;
SELECT * FROM CGV CGV WHERE IN seat =
(SELECT CGV.seat,CGV.movie_num FROM MEGABOX MEGABOX WHERE MEGABOX.seat,MEGABOX.movie_num = '8')
ORDER BY *;
- ๊ทธ ๋ฐ์ ์ฟผ๋ฆฌ๋ค
1.SELECT
์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ : ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ๋ ํ๋ฉฐ, ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ ํ ํ, ํ ์ปฌ๋ผ๋ง์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ ์ ๋๋ค!
- FROM ์ ์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ : ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก FROM ์ ์๋ ํ ์ด๋ธ ๋ช ์ด ์ค๋๋ก ๋์ด ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ FROM์ ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋ฉด ๋์ ์ผ๋ก ์์ฑ๋ ํ ์ด๋ธ์ธ ๊ฒ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
SELECT T1.C1, T2.C1, T2.C2 FROM T1 T1, (SELECT C1, C2 FROM T2) T2 WHERE T1.C1 = T2.C1;
- HAVING ์ ์์ ์ฌ์ฉํ๋ ์๋ธ์ฟผ๋ฆฌ : ๊ทธ๋ฃนํจ์์ ํจ๊ป ์ฌ์ฉ๋ ๋ ๊ทธ๋ฃน์นญ๋ ๊ฒฐ๊ณผ์ ๋ํด ๋ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ์ฃผ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
- UPDATE ๋ฌธ์ SET์ ์์์ ์๋ธ์ฟผ๋ฆฌ, INSERT๋ฌธ์ VALUES ์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ HAVING ์ ์์ ์ฌ์ฉํ ๋ ๋ชฉ์ ๊ณผ ๊ฐ์ต๋๋ค.
DROP
: ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ญ์ ํ๊ณ ํด๋น ํ ์ด๋ธ์ ๊ตฌ์กฐ ์์ฒด๋ฅผ ํ๊ดดํฉ๋๋ค.TRUNCATE
: ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ญ์ ํ์ง๋ง ํ ์ด๋ธ ๊ตฌ์กฐ๋ ์ ์งํฉ๋๋ค.DELETE
: ํ ์ด๋ธ์ ์ผ๋ถ ๋๋ ๋ชจ๋ ํ์ ์ญ์ ํฉ๋๋ค. ํ ์ด๋ธ ๊ตฌ์กฐ๋ ์ ์ง ๋ฉ๋๋ค.
TRUNCATE์ DELETE๋ ๊ตฌ์กฐ๊ฐ ์ ์ง๊ฐ ๋๋ ์ ์ด ์๊ธฐ ๋๋ฌธ์ Rollback์ด ๊ฐ๋ฅํ์ง๋ง, DROP ๊ฐ์ ๊ฒฝ์ฐ์๋ Table structure๊น์ง ํ๊ดดํ๊ธฐ ๋๋ฌธ์ Rollback์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
-- DROP
DROP TABLE employees;
-- TRUNCATE
TRUNCATE TABLE employees;
-- DELETE
DELETE FROM employees WHERE department_id = 1;
DISTINCT
๋ ์ค๋ณต๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฑฐํ์ฌ ๊ณ ์ ํ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋ ํค์๋ ์ ๋๋ค. ์ฃผ๋ก ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง ์ด์ด ์์ ๋ ์ฌ์ฉ๋๊ณ , ํนํ ๋ฐ์ดํฐ ๋ถ์์ด๋ ๋ณด๊ณ ์ ์์ฑ ์์ ์ค๋ณต๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
SQL Injection
์ ์ ์์ ์ธ ์ฌ์ฉ์ ์ ๋ ฅ๋์ SQL ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต๊ฒฉํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ํต์ฌ์ ํด๋ผ์ด์ธํธ ์ธก์์ SQL ์ฟผ๋ฆฌ์ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์์ ๋, ๋ฐ์ดํฐ๊ฐ ์ฟผ๋ฆฌ ๋ก์ง์ ์ผ๋ถ๋ก ํด์๋์ด DB์์ ์คํ๋ ๋ ๋ฐ์ํฉ๋๋ค.
SELECT * FROM USERTABLE WHERE username='your_user_input' AND password='your_password_input';
SELECT * FROM USERTABLE WHERE username='random_input'
OR 1=1 -- 'AND password='random_password';
์ฌ๊ธฐ์ "--"๋ ์ฃผ์์ ์๋ฏธํ๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์๋ฏธ์๋ ๋ฌธ์์ด๋ก ๋ง๋ค์ด ๋ฒ๋ฆฌ๊ฒ ๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ์๋ฐฉํ๊ธฐ ์ํด์๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ํ๊ณ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
// ์๋ฐฉ ๋ฐฉ๋ฒ: Prepared Statements ์ฌ์ฉ
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
SQL Antipattern
์ด๋ผ๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๋ ํํ ๋ฐ์ํ๋ ๋ถ์ ์ ํ ์ฟผ๋ฆฌ๋ ์ค๊ณ ๋ฑ์ ํจํด์ ์๋ฏธํฉ๋๋ค. ์ด๋ฌํ ์ํฐํจํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ํ, ์ ์ง๋ณด์์ ์ด๋ ค์๋ฑ์ ์ด๋ ํ ์ ์์ด ์ ์ํด์ผ ํฉ๋๋ค.
"ํ์ง๋ค์ด์ "์ด๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋, ํ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋์ ์ผ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋๋์ด ๋ณด์ฌ์ฃผ๋ ๊ธฐ์ ์ ๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด ์น์ ๋ก๋ฉ ์๋๋ฅผ ๋จ์ถ ์ํค๋ ๋ฑ์ ์ผ์ ํ ์ ์์ต๋๋ค.
reference :
1. What is Query?
2. Velog ์บก์ ๋ฃ๊ธฐ!
3. SQL processing logic
4. Entirely information about SQL with pictures
5. Definition of Latch contention
6. SQL Query
7. Comprehension about SELECT FOR UPDATE
8.Details about sub-query, More examples
9. SQL Injection