Database/SQL

[Effective SQL] ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„ ไธŠ

soogoori 2024. 9. 25. 20:49

โœจ ์ข‹์€ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ์„ค๊ณ„ํ•˜๊ธฐ 

 

1. ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ 

ํ•œ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ํŠน์ • row์™€ ๋‚˜๋จธ์ง€ row๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ํ…Œ์ด๋ธ”์—๋Š” ์ปฌ๋Ÿผ ํ•œ ๊ฐœ ์ด์ƒ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ธฐ๋ณธํ‚ค(PK)๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. 
  • PK๋Š” row๋งˆ๋‹ค ์œ ์ผํ•ด์•ผํ•˜๋ฏ€๋กœ null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ
  • ์•ˆ์ •์ ์ธ ๊ฐ’์ด์–ด์•ผ ํ•จ(๊ฐ’์„ ๊ฐฑ์‹ ํ•  ํ•„์š” X)
  • ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์—ฌ์•ผ ํ•จ 

๐Ÿ‘‰ ์ด๋Ÿฐ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• = ์˜๋ฏธ ์—†๋Š” ์ˆซ์ž ๋ฐ์ดํ„ฐ๋กœ ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ปฌ๋Ÿผ 

 

  • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์ค€์ˆ˜ํ•œ๋‹ค = null์ด ์•„๋‹Œ ์™ธ๋ž˜ํ‚ค(FK)๊ฐ€ ์„ค์ •๋œ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ๊ฐ ๋ ˆ์ฝ”๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•จ
  • ๋ณตํ•ฉ ๊ธฐ๋ณธํ‚ค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ
    • PK๋ฅผ ์ •์˜ํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ํ•ด๋‹น ์ปฌ๋Ÿผ์— ์œ ์ผ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ™์ด ๋งŒ๋“ ๋‹ค. ์ปฌ๋Ÿผ ๋‘ ๊ฐœ ์ด์ƒ์— ์œ ์ผ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ํ• ์ผ๋งŒ ๋” ๋งŽ์•„์ง
    • ์ผ๋ฐ˜์ ์œผ๋กœ PK๋กœ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, PK๊ฐ€ ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ์ข€ ๋” ๋ณต์žกํ•ด์ง€๊ณ  ๋Š๋ ค์ง

๐Ÿ‘‰ ๋ณตํ•ฉ ๊ธฐ๋ณธํ‚ค์˜ ์žฅ์ ์€ ์ถ”ํ›„์— ์ •๋ฆฌ ..!

 

 

2. ์ค‘๋ณต์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์ œ๊ฑฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๊ทœํ™”์˜ ๋ชฉํ‘œ = ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ œ๊ฑฐํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ž์› ์ตœ์†Œํ™”
์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๊ตฐ๋ฐ ์ด์ƒ์—์„œ ์ž…๋ ฅํ•˜์ง€ ์•Š๋„๋ก ํ•จ
  • ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋น„์ •์ƒ์ ์ธ ์‚ฝ์ž…, ๊ฐฑ์‹ , ์‚ญ์ œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
  • ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ

 

 

3. ๋ฐ˜๋ณต ๊ทธ๋ฃน ์ œ๊ฑฐ 

๋ฐ˜๋ณต ๊ทธ๋ฃน์„ ์ฒ˜๋ฆฌํ•  ๋•Œ UNION ์ฟผ๋ฆฌ ์‚ฌ์šฉ ๐Ÿ‘‰ ์ฝ๊ธฐ ์ „์šฉ ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ ์ •๊ทœํ™” 

 

 

 

4. ์ปฌ๋Ÿผ๋‹น ํ•˜๋‚˜์˜ ํŠน์„ฑ๋งŒ ์ €์žฅ

๊ฒ€์ƒ‰์„ ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ์ง‘๊ณ„ํ•  ๋•Œ ํŠน์„ฑ ๊ฐ’์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ !

 

  • ์ฃผ์†Œ๋‚˜ ์ „ํ™”๋ฒˆํ˜ธ ๊ฐ™์€ ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋ ค๋ฉด ์ตœ์†Œ ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ•  
  • ๋ณด๊ณ ์„œ๋‚˜ ๋ชฉ๋ก์„ ๋ฝ‘์œผ๋ ค๊ณ  ํŠน์„ฑ๋“ค์„ ์žฌ๊ฒฐํ•ฉํ•  ๋•Œ๋Š” SQL์˜ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ

 

5. ๊ณ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์™œ ์ข‹์ง€ ์•Š์€์ง€ ์ดํ•ด 

CREATE TABLE Orders(
	OrderNumber int NOT NULL,
    OrderDate date NULL,
    ShipDate date NULL,
    CustomerID int NULL,
    EmployeeID int NULL,
    OrderTotal decimal(15, 2) NULL
);

๐Ÿ‘‰ OrderTotal ์ปฌ๋Ÿผ์„ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฑธ๊นŒ...?

 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ ๋ฏธ์นจ
  • ํ…Œ์ด๋ธ”์˜ row๊ฐ€ ๋ณ€๊ฒฝ, ์‚ฝ์ž…, ์‚ญ์ œ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ์žฌ๊ณ„์‚ฐํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์›€

โœด๏ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • AS ํ‚ค์›Œ๋“œ ๋‹ค์Œ์— ์ˆ˜ํ–‰ํ•  ๊ณ„์‚ฐ ์ •์˜ํ•ด์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
CREATE FUNCTION dbo.getOrderTotal(@orderId int)
RETURNS money
AS 
BEGIN
	DECLARE @r money
    SELECT @r = SUM(Quantity * Price)
    FROM Order_Details WHERE OrderNumber = @orderId
    RETURN @r;
END;
GO

CREATE TABLE Orders(
	OrderNumber int NOT NULL,
    OrderDate date NULL,
    ShipDate date NULL,
    CustomerID int NULL,
    EmployeeID int NULL,
    OrderTotal money AS dbo.getOrderTotal(OrderNumber)
);
  • GENERATED ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
-- ํ…Œ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  INTEGRITY ์˜ต์…˜์„ ๋”
SET INTEGRITY FOR Order_Details OFF;

-- ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ๊ณ„์‚ฐ ์ปฌ๋Ÿผ์„ ์ƒ์„ฑํ•จ
ALTER TABLE Order_Details
	ADD COLUMN ExtendedPrice decimal(15, 2)
    	GENERATED ALWAYS AS (QuantityOrdered * QuotedPrice);

-- INTEGRITY ์˜ต์…˜์„ ๋‹ค์‹œ ์ผฌ
SET INTEGRITY FOR Order_Details
IMMEDIATE CHECKED FORCE GENERATED;

-- ๊ณ„์‚ฐ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ์ƒ์„ฑ
CREATE INDEX Order_Details_ExtendedPrice
	ON Order_Details(ExtendedPrice);
CREATE TABLE Order_Details(
	OrderNumber int NOT NULL,
   	ProductNumber int NOT NULL,
   	QuotedPrice decimal(15, 2) DEFAULT 0 NULL,
    QuantityOrdered smallint DEFAULT 0 NULL,
    ExtendedPrice decimal(15, 2)
    	GENERATED ALWAYS AS (QuotedPrice * QuantityOrdered)
);

๐Ÿ‘‰ ๊ณ„์‚ฐ ์ปฌ๋Ÿผ์— ๋งŒ๋“  ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๊ธฐ๋„ ํ•จ

๐Ÿ‘‰ ์ธ๋ฑ์Šค ์ ์šฉ์ด ์–ด๋ ค์šธ ๋•Œ๋Š” ํ…Œ์ด๋ธ”์— ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋†“๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹  ๋ทฐ๋ฅผ ์ด์šฉํ•ด ์ˆ˜ํ–‰ํ•  ๊ณ„์‚ฐ ์ •์˜