๐ก SELECT ์ฟผ๋ฆฌ๋ฌธ์ ์ ์ฅํ ๊ฐ์ฒด๋ก ๊ฐ์ํ ์ด๋ธ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅํ๊ณ ์์ง ์๊ณ ์ฟผ๋ฆฌ๋ง ์ ์ฅํ์ง๋ง ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.VIEW๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์๋๋ก ๋๋ ๋์์, ์๋ณธ ๋ฐ์ดํฐ์ ๋ณด์์ ์ ์งํ๋๋ฐ ๋์์ด ๋๋ค.
VIEW ์์ฑ ํ ์กฐํ
SELECT * FROM tbl_menu;
-- VIEW ์์ฑ
CREATE VIEW hansik AS
SELECT
menu_code
, menu_name
, menu_price
, category_code
, orderable_status
FROM tbl_menu
WHERE category_code = 4;
-- ์์ฑ๋ VIEW ์กฐํ
SELECT * FROM hansik;
์คํ๊ฒฐ๊ณผ
๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ฉด VIEW์ ๊ฒฐ๊ณผ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
INSERT
INTO tbl_menu
VALUES (null, '์ํ๋ง๊ตญ๋ฐฅ', 5500, 4, 'Y');
SELECT * FROM hansik;
์คํ๊ฒฐ๊ณผ
-- INSERT INTO hansik VALUES (null, '์ํ๋ง๊ตญ๋ฐฅ', 5500, 4, 'Y'); -- ์๋ฌ ๋ฐ์
INSERT
INTO hansik
VALUES (99, '์์ ๊ณผ๋ง๊ตญ๋ฐฅ', 5500, 4, 'Y');
SELECT * FROM hansik;
SELECT * FROM tbl_menu;
์คํ๊ฒฐ๊ณผ
UPDATE hansik
SET menu_name = '๋ฒํฐ๋ง๊ตญ๋ฐฅ', menu_price = 5700
WHERE menu_code = 99;
SELECT * FROM hansik;
SELECT * FROM tbl_menu;
์คํ๊ฒฐ๊ณผ
DELETE FROM hansik WHERE menu_code = 99;
SELECT * FROM hansik;
SELECT * FROM tbl_menu;
์คํ๊ฒฐ๊ณผ
VIEW์ ์ฐ์ธ SUBQUERY ์์ ์ฐ์ฐ ๊ฒฐ๊ณผ ์ปฌ๋ผ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
DROP VIEW hansik;
์คํ๊ฒฐ๊ณผ
OR REPLACE ์ต์
ํ ์ด๋ธ์ DROPํ์ง ์๊ณ ๊ธฐ์กด์ VIEW๋ฅผ ์๋ก์ด VIEW๋ก ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ค.
CREATE OR REPLACE VIEW hansik AS
SELECT
menu_code AS '๋ฉ๋ด์ฝ๋'
, menu_name '๋ฉ๋ด๋ช
'
, category_name '์นดํ
๊ณ ๋ฆฌ๋ช
'
FROM tbl_menu a
JOIN tbl_category b ON a.category_code = b.category_code
WHERE b.category_name = 'ํ์';
SELECT * FROM hansik;
์คํ๊ฒฐ๊ณผ
๐ก ์ธ๋ฑ์ค(Index)๋ ๋ฐ์ดํฐ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋ ํฌ์ธํฐ๋ฅผ ์ ๊ณตํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์ ์ฒด ํ ์ด๋ธ์ ๊ฒ์ํ๋ ๋์ ์ธ๋ฑ์ค๋ฅผ ํตํด ๊ฒ์์ ํ๋ฏ๋ก ์๋๊ฐ ๋ ๋นจ๋ผ์ง๊ฒ ๋๋ค.
์ธ๋ฑ์ค๋ ์ฃผ๋ก WHERE์ ์ ์กฐ๊ฑด์ด๋ JOIN ์ฐ์ฐ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์์ฑํ๋ค.
๋ค๋ง ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ธ๋ฑ์ค ์ญ์ ๊ฐฑ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ง๋ ์ ์คํ ๊ฒฐ์ ํด์ผ ํ๋ค.
PRIMARY KEY ์ ์ฝ์กฐ๊ฑด์ ์ง๋ ๊ธฐ๋ณธ ํ ์ด๋ธ ์์ฑ ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ INSERT ํ ์กฐํ
CREATE TABLE phone (
phone_code INT PRIMARY KEY,
phone_name VARCHAR(100),
phone_price DECIMAL(10, 2)
);
INSERT
INTO phone (phone_code , phone_name , phone_price )
VALUES
(1, 'galaxyS23', 1200000),
(2, 'iPhone14pro', 1433000),
(3, 'galaxyZfold3', 1730000);
SELECT * FROM phone;
์คํ๊ฒฐ๊ณผ
์ธ๋ฑ์ค๊ฐ ์๋ ์ปฌ๋ผ์ WHERE์ ์ ์กฐ๊ฑด์ผ๋ก ํ์ฉํ ์กฐํ ์งํ ์ EXPLAIN์ผ๋ก ์ฟผ๋ฆฌ ์คํ ๊ณํ ํ์ธ
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS23';
์คํ๊ฒฐ๊ณผ
phone_name ์ปฌ๋ผ์ idx_name์ด๋ผ๋ ์ด๋ฆ์ ์ธ๋ฑ์ค ์์ฑ ํ ํ์ธ
CREATE INDEX idx_name ON phone (phone_name);
์คํ๊ฒฐ๊ณผ
2๊ฐ ์ด์์ ์ปฌ๋ผ์ ํ๋ฒ์ ํ๋์ ์ธ๋ฑ์ค๋ก ์ค์ ํด์ ์์ฑํ ์ ์๋ค.
๋ณตํฉ ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX idx_name_price ON phone (phone_name, phone_price);
SHOW INDEX FROM phone;
์คํ๊ฒฐ๊ณผ
ํ ์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ ์ค์ ๋ ์ปฌ๋ผ์ ํ์ฉํด ์กฐํ๋ฅผ ์งํ
SELECT * FROM phone WHERE phone_name = 'iPhone14pro';
์คํ๊ฒฐ๊ณผ
EXPLAIN ๋ช ๋ น์ด๋ก ์ฟผ๋ฆฌ ์คํ ๊ณํ ํ์ธ(์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ ๋ฐ ์ฌ์ฉ ์ปฌ๋ผ ํ์ธ)
EXPLAIN SELECT * FROM phone WHERE phone_name = 'iPhone14pro';
์คํ๊ฒฐ๊ณผ
์ธ๋ฑ์ค ์ต์ ํ(์ฌ๊ตฌ์ฑ)
์ธ๋ฑ์ค ์ต์ ํ(์ฌ๊ตฌ์ฑ)์ ์ธ๋ฑ์ค๊ฐ ํํธํ๋์๊ฑฐ๋, ๋ฐ์ดํฐ์ ๋๋ถ๋ถ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
์ด๋ ์ธ๋ฑ์ค์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ๋์คํฌ ๊ณต๊ฐ์ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ํด์ค๋ค.
๋จ, ์ธ๋ฑ์ค๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๋์ ํด๋น ํ ์ด๋ธ์ ์ ๊ธธ ์ ์์ผ๋ฏ๋ก, ์ด ์์ ์ ์ฃผ์ํด์ ์ํํด์ผ ํ๋ค.
'ALTER TABLE' ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ฌ๊ตฌ์ฑํ๋ค.
ALTER TABLE phone DROP INDEX idx_name;
ALTER TABLE phone ADD INDEX idx_name(phone_name);
์คํ๊ฒฐ๊ณผ
๋ํ, MySQL์ InnoDB ์์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ OPTIMIZE TABLE ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ๊ณผ ์ธ๋ฑ์ค๋ฅผ ์ต์ ํํ ์๋ ์๋ค.
OPTIMIZE TABLE phone;
์คํ๊ฒฐ๊ณผ
DROP INDEX idx_name ON phone;
SHOW INDEX FROM phone;
์คํ๊ฒฐ๊ณผ
๐ก ํธ๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ ๋ฐ์ํ๋ ํน์ ์ด๋ฒคํธ(INSERT, UPDATE, DELETE)๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ์คํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์ด๋ค.
์ฃผ์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ณ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ค.
๋ค๋ง ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋จ์ฉํ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋ณต์ก์ฑ ์ฆ๊ฐ์ ๊ฐ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์ ์๋ค.
DELIMITER //
CREATE OR REPLACE TRIGGER [ํธ๋ฆฌ๊ฑฐ๋ช
]
BEFORE|AFTER [์ด๋ฒคํธ ํ์
]
ON [ํ
์ด๋ธ๋ช
]
FOR EACH ROW
BEGIN
END//
DELIMITER ;
DELIMITER //
CREATE OR REPLACE TRIGGER after_order_menu_insert
AFTER INSERT
ON tbl_order_menu
FOR EACH ROW
BEGIN
UPDATE tbl_order
SET total_order_price = total_order_price + NEW.order_amount * (SELECT menu_price FROM tbl_menu WHERE menu_code = NEW.menu_code)
WHERE order_code = NEW.order_code;
END//
DELIMITER ;
-- ์ฃผ๋ฌธ ํ
์ด๋ธ INSERT
INSERT
INTO tbl_order
(
order_code
, order_date
, order_time
, total_order_price
)
VALUES
(
NULL
, CONCAT(CAST(YEAR(NOW()) AS VARCHAR(4))
, CAST(LPAD(MONTH(NOW()), 2, 0) AS VARCHAR(2))
, CAST(LPAD(DAY(NOW()), 2, 0) AS VARCHAR(2)))
, CONCAT(CAST(LPAD(HOUR(NOW()), 2, 0) AS VARCHAR(2))
, CAST(LPAD(MINUTE(NOW()), 2, 0) AS VARCHAR(2))
, CAST(LPAD(SECOND(NOW()), 2, 0) AS VARCHAR(2)))
, 0
);
-- ์ฃผ๋ฌธ ๋ฉ๋ด ํ
์ด๋ธ INSERT 1
INSERT
INTO tbl_order_menu
(
order_code
, menu_code
, order_amount
)
VALUES
(
1
, 3
, 2
);
-- ์ฃผ๋ฌธ ๋ฉ๋ด ํ
์ด๋ธ INSERT 2
INSERT
INTO tbl_order_menu
(
order_code
, menu_code
, order_amount
)
VALUES
(
1
, 6
, 3
);
SELECT * FROM tbl_order;
SELECT * FROM tbl_order_menu;
-- ๋ค์ ๋๋๋ ค ํ
์คํธ ํด๋ณด๊ณ ์ ํ ๊ฒฝ์ฐ
-- 1) rollbackํ๊ธฐ
ROLLBACK;
-- 2) ๊ธฐ์กด ๋ฐ์ดํฐ ์ง์ฐ๊ธฐ
DELETE FROM tbl_order WHERE 1 = 1;
DELETE FROM tbl_order_menu WHERE 1 = 1;
-- ์ดํ AUTO_INCREMENT๋ ๋ค์ ์ด๊ธฐํ ํด ์ค๋ค.
ALTER TABLE tbl_order AUTO_INCREMENT = 1;