''
=> ์ฌ์ฉํ๊ณณ์ ''
์๋ตํ์ง๋ง๊ณ ๊ทธ๋ฅ ''
๋ก ๊ฐ์ธ์ ์ ๊ธฐmysql์์๋ DB์ ๋ํ ๊ถํ์ ์ ์ ์๊ฒ ๋ถ์ฌํ๋ ๋ฐฉ์์ด๋ผ์
DB๋จผ์ ์์ฑ ํ ์ ์ ์์ฑํ๊ณ ๊ถํ๋ถ์ฌํ๋ ์์๋ก ์คํํด์ผ ํ๋ค.
SHOW VARIABLES LIKE '%time_zone%';
SET time_zone = 'system';`... `'Asia/Seoul'
๊ธฐ๋ณธ์ ์ผ๋ก DB์ ์ ์ํ๋ฉด DB์์ ์ธ์ ์ ํ๋ ์์ฑํจ, ์ฆ ์ฐ๊ฒฐ ํ๋๋น ์ธ์ ์ด ํ๋์ฉ ์๊ธด๋ค.
// ์ธ์
์์ด๋ ๋ฆฌ์คํธ ์ถ๋ ฅํ๊ธฐ
SHOW processlist;
๋ฐ์ดํฐ ์ ์ ์ธ์ด
๋ฐ์ดํฐ๋ฒ ์ด์ค or ํ
์ด๋ธ ๊ตฌ์กฐ๋ ๊ด๊ณ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ
CREATE
DROP
TRUNCATE
ALTER
๋ฐ์ดํฐ ์ ์ด ์ธ์ด
์ ์ ์๊ฒ ๊ถํ์ ๋ถ์ฌํ ๋ ์ฌ์ฉ
GRANT
REVOKE
์ถํ์ ๊ณต๋ถ ํ ์ ๋ฆฌ
๋ฐ์ดํฐ ์กฐ์ ์ธ์ด
ํ
์ด๋ธ์ ๋ฐ์ดํฐ ์กฐํ, ์์ฑ, ์์ , ์ญ์ ์ ์ฌ์ฉ
SELECT
INSERT
UPDATE
DELETE
CREATE DATABASE <database-name> DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
๊ธฐ๋ณธ์ ์ผ๋ก column
๋ค์ table
์ค์ ์ ๋ฐ๋ผ๊ฐ๊ณ ํ
์ด๋ธ์ DataBase
์ค์ ์ ๋ฐ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์
์ ์ด์ DataBase
์์ ๋ฌธ์ ์ค์ ์ ํด์ฃผ๋ฉด table
๊ณผ column
์ ์ค์ ํ ํ์๊ฐ ์๋ค
DROP DATABASE <database-name>;
// ํ์.. host์๋ฆฌ์ ํธ์คํธ ์ ์ด์ค์ผํจ ( ex)'localhost', '%' )
CREATE user <user-name>[@'<host>' IDENTIFIED BY <db-password>];
// ์ฌ์ฉ
CREATE user testUser@'localhost' IDENTIFIED BY '1234';
testUser
๋ ์ด๋ฆ์ ๊ฐ์ง ์ ์ ๋ฅผ ์์ฑํ๊ณ , ์ ๊ทผ ๊ฐ๋ฅํ IP์ localhost
์ด๋ฉฐ, ๋น๋ฐ๋ฒํธ๋ 1234
์
// ํ์
drop user <user-name>@'<host>';
// ์ฌ์ฉ
DROP user testUser@'localhost';
use mysql;
SELECT host, user FROM user;
host
: ์ ๊ทผ ๊ฐ๋ฅํ ํด๋ผ์ด์ธํธ์ IP๋ฅผ ์๋ฏธ ( %
, localhost
)user
: ํด๋น ์ ์ ๋ฅผ ์๋ฏธ// ํ์
GRANT ALL PRIVILEGES ON <db-name>.<table-name> TO <user-name>@'<host-name>' [IDENTIFIED BY '<password>'];
// ์ฌ์ฉ
GRANT ALL PRIVILEGES ON testDB.* TO 'testUser'@'localhost' [IDENTIFIED BY '๋น๋ฐ๋ฒํธ'];
localhost
๋ก ์ ๊ทผํtestUser
์๊ฒ testDB
๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํ
์ด๋ธ์ ๋ชจ๋ ๊ถํ์ ์ค
*
์ฌ์ฉ์ ๋ชจ๋ ๊ฒ์ ๊ถํ๋ถ์ฌhost
๋ง๋ค ๋ค๋ฅธ ๊ถํ์ ๋ถ์ฌ๋ฐ์ ์ ์์flush privileges;
// ํ์
REVOKE ALL PRIVILEGES ON <db-name>.* FROM <user-name>@'<host-name>';
// ์ฌ์ฉ
REVOKE ALL PRIVILEGES ON testDB.* FROM testUser@'%';
// ํ์
SHOW GRANTS FOR <user-name>[@'<host-name>'];
// ์ฌ์ฉ
SHOW GRANTS FOR testUser@'localhost'; // localhost๋ก ์ ๊ทผํ์ ๋ ๊ถํ ๋ณด๊ธฐ
SHOW GRANTS FOR testUser; // ๋ชจ๋ ํธ์คํธ์ ๋ํ ๊ถํ ๋ณด๊ธฐ
// ํ์ฌ์ํธ ํ์ธ์ธ๋ฐ ์ํธํ๋์ด์์ด์ ํด์๋ถ๊ฐ๋ฅ...
SELECT host, user, authentication_string FROM user;
// ๋น๋ฐ๋ฒํธ๋ณ๊ฒฝํ์
ALTER user <user-name>@'<host-name>' IDENTIFIED WITH mysql_native_password BY '๋ณ๊ฒฝํ ๋น๋ฐ๋ฒํธ';
// ๋น๋ฐ๋ฒํธ๋ณ๊ฒฝ์ธ๋ฐ ์๋จ
ALTER user 'testUser'@'host' IDENTIFIED WITH mysql_native_password BY '12345';
VARCHAR()
๋ก ์ง์ ํ๋ฉด ํฌ๊ธฐ์ ๋ง๊ฒ ์์์ TINYTEXT
ํ์๋ค ์ค์ ํ๋๋ก ๋ณํ๋๋ค.
๊ณ ์ ํ ๋ฌธ์
๊ฐ๋ณํ ๋ฌธ์
๊ฐ๋ณํ ๋ฌธ์
๊ฐ๋ณํ ๋ฌธ์
...๋๋จธ์ง ๋ ์์ง๋ง ๋๋ฌด ์ปค์ ์๋ต
4byte
์๊ฐ ๊ฐ์ด ์ซ์๋ก ๋ณํ๋ผ์ ๋ค์ด๊ฐ๋ค. ( 1970/01/01 ์ดํ )
8byte
์
๋ ฅ๋ ์๊ฐ์์ time_zone์ ์์กดํด์ ์๊ฐ์ด ๋ง์ถฐ์ง
DEFAULT CURRENT_TIMESTAMP [ON UPDATE CURRENT_TIMESTAMP]
์์ฑ๋ ํ์ฌ์๊ฐ์ ํ
์ด๋ธ์ ๋ฃ๊ณ
ON UPDATE๋ ์
๋ฐ์ดํธ ๋ ๋ ๋ง๋ค ์๊ฐ์ ๋ฃ์
// ํ์
CREATE TABLE ํ
์ด๋ธ๋ช
[IF NOT EXISTS] ( column์ ์ );
// ์ฌ์ฉ
CREATE TABLE testTable (
_id INTEGER NOT NULL COMMENT '์๋ณ์',
name VARCHAR(20) NOT NULL COMMENT '์ด๋ฆ',
createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '์์ฑ์๊ฐ',
updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '์์ ์๊ฐ',
PRIMARY KEY (id),
UNIQUE KEY uk_id_name (id, name)
)ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8;
// ํ
์ด๋ธ ํํ๋ง ๊ฒ์ ํ์
DESC <table-name>;
// ์ฌ์ฉ
DESC testTable;
// ํ
์ด๋ธ ์ ์ ๊ฒ์
SHOW CREATE TABLE <table-name>;
// ์ฌ์ฉ
SHOW CREATE TABLE testTable;
// ์์
ALTER TABLE `<database-name>`.`<table-name>` CHARACTER SET = <๋ฌธ์ํํ>, COLLATE = <๋ฌธ์ํํ>
// ์ฌ์ฉ
ALTER TABLE `testDB`.`testTable` CHARACTER SET = utf8, COLLATE = utf8_general_ci
// ํ์
ALTER TABLE <current-table-name> RENAME <change-table-name>;
// ์ฌ์ฉ
ALTER TABLE testTable RENAME test;
show table status;
create table ๋ฐฑ์
ํ
์ด๋ธ๋ช
like ๋ฐฑ์
ํ ํ
์ด๋ธ๋ช
; // ( ๋ช
์ธ๋ง ๋ณต์ฌ๋จ )
insert into ๋ฐฑ์
ํ
์ด๋ธ๋ช
select * from ๋ฐฑ์
ํ ํ
์ด๋ธ๋ช
; // ( ๊ฐ๊น์ง ๋ณต์ฌ )
// ํ์
ALTER TABLE <table-name> [ADD | MODIFY | CHANGE | DROP] COLUMN column๋ช
// ์ฌ์ฉ
ALTER TABLE testTable ADD COLUMN age VARCHAR(10); // ์ถ๊ฐ
ALTER TABLE testTable MODIFY COLUMN age INTEGER; // ์์
ALTER TABLE testTable CHANGE COLUMN age birth VARCHAR(40); // ์ด๋ฆ๊ณผ ์ปฌ๋ผ๋ด์ฉ ์์
ALTER TABLE testTable DROP COLUMN birth; // ์ปฌ๋ผ์ญ์
๋จ ์ปฌ๋ผ์ ์์ ํ ๋๋ ์ฐ๊ด๋์ด์๋์ง, ์๋ฃํ์ด ๋ง๋์ง, ๊ธฐ๋ณธ๊ฐ์ ๋ฌด์ ๋ฐ๋ผ์ ํ์คํ๊ฒ ์์ ํด์ค์ผํจ
// ํ์
ALTER TABLE <table-name> ADD <column-name> [<data-type> <options>];
// ์ฌ์ฉ
ALTER TABLE testTable ADD COLUMN age VARCHAR(10) NOT NULL;
// ํ์
ALTER TABLE <table-name> DROP COLUMN <column-name>
// ์ฌ์ฉ
ALTER TABLE testTable DROP COLUMN birth;
// ํ์
ALTER TABLE <table-name> MODIFY <column-name> <type>;
// ์ฌ์ฉ
ALTER TABLE testTable MODIFY name VARCHAR(100); // ๊ธฐ์กด ๋ํดํธ๊ฐ์ ์ฌ๋ผ์ง
// ํ์
ALTER TABLE <table-name> ALTER COLUMN <column-name> set default <default-value>;
// ์ฌ์ฉ
ALTER TABLE testTable ALTER COLUMN name set default '๋ฌด๋ช
';
// ํ์
ALTER TABLE <table-name> MODIFY <column-name> <type> AFTER <front-column-name>;
// ์ฌ์ฉ
ALTER TABLE testTable MODIFY id integer AFTER name;
๊ธฐ์กด ํ
์ด๋ธ ์์๊ฐ id
, name
์ด๋ผ๋ฉด ์ดํ์ name
, id
์์ผ๋ก ๋ฐ๋
// ํ์
ALTER TABLE <table-name> CHANGE <๊ธฐ์กด-column-name> <๋ฐ๊ฟ-column-name> <type>;
// ์ฌ์ฉ
ALTER TABLE testTable CHANGE name fullname varchar(100);
ALTER TABLE <table-name> [ENGINE | AUTO_INCREMENT | COMMENT | RENAME]
// ๊ธฐ๋ณธ์์ง, ์์์ซ์, ์ฃผ์, ์ด๋ฆ
// ํ์
INSERT INTO <table-name>(<column-list>) VALUES(<data-list>);
// ์ฌ์ฉ
INSERT INTO testTable(_id, name) VALUES(1, 'john');
// ํ์
UPDATE <table-name> SET <change-data> WHERE <condition>;
// ์ฌ์ฉ
UPDATE testTable SET name = 'blue' WHERE _id = 1;
testTable
์์ _id
๊ฐ 1
์ธ ์ปฌ๋ผ์ name
์ blue
๋ก ๋ณ๊ฒฝํจ
# ํ์
SELECT * FROM <table-name>;
# ์ฌ์ฉ
SELECT * FROM testTable;
# ๋ฐ์ดํฐ๋ง ๋ชจ๋ or ์กฐ๊ฑด์ผ๋ก ์ง์
DELETE FROM TABLE <table-name> [WHERE <condition>]
# ๋ฐ์ดํฐ์ ํ
์ด๋ธ์ ์ธํ
๊ฐ์ ๋ชจ๋ ์ด๊ธฐํ ( auto_increment )
TRUNCATE TABLE <table-name>;
# update์ select๋ฅผ ๊ฐ์ด ์ฌ์ฉ
# ๋ฐ๋ก ์์ User.name, Student.name์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์
UPDATE User SET name = (SELECT name FROM Student WHERE id = 1) WHERE id = 1;
# 1๋ฒ Student์ name์ 1๋ฒ User์ name์ ๋ฃ์
# insert์ select๋ฅผ ๊ฐ์ด ์ฌ์ฉ
# ๋ฐ๋ก ์์ User.name, Student.name์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์
INSERT INTO User(name) SELECT name FROM WHERE id < 5;
# 1~5๋ฒ์ Student.name์ User.name์ ๋ฃ์
# %๋ ์๋ค๋ก ๋ช ๊ธ์๊ฐ ์๋ ์๊ด์์
# _๋ ํ ๊ธ์๋ง ์ธ์ ํจ
SELECT * FROM Student WHERE name [NOT] LIKE '%์ฃผ%';
SELECT * FROM Student WHERE name [NOT] LIKE '_์ฃผ_';
# name์ด ์ฃผ๋ฏผ์ฑ, ๋ฐฐ์ฃผ์ฑ์ธ ์ฌ๋ ์ฐพ๊ธฐ
SELECT * FROM Student WHERE name [NOT] IN ('์ฃผ๋ฏผ์ฑ', '๋ฐฐ์ฃผ์ฑ');
# (name = '์ฃผ๋ฏผ์ฑ' or name = '๋ฐฐ์ฃผ์ฑ' ๊ณผ ๊ฐ์)
# id๊ฐ 10~20์ธ ์ฌ๋ ์ฐพ๊ธฐ
SELECT * FROM Student WHRER id [NOT] BETWEEN 10 and 20;
# (id >= 10 and id <= 20 ๊ณผ ๊ฐ์)
# ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
SELECT DISTINCT(addr) FROM Student;
# addr์ด ์ค๋ณต๋๋ ๋ฐ์ดํฐ๋ ์ ๋ถ ํ๋๋ก ํํํจ
# ์์ธํน๋ณ์์ ์ฌ๋ ์ฌ๋๋ค์ด ๋ช ๋ช
์ธ์ง ๊ณ์ฐ
SELECT COUNT(addr) FROM Student WHERE addr = '์์ธ ํน๋ณ์';
# addr ๊ธฐ์ค์ผ๋ก ๋จผ์ ์ ๋ ฌํ๊ณ ์ดํ์ ๊ฐ์ addr์ ๊ฐ์ง ์ฌ๋์ด ์๋ค๋ฉด name์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
SELECT * FROM Student ORDER BY addr, name [DESC];
# ๊ธฐ์ค ์์ด ๋๋ค์ผ๋ก ์ ๋ ฌ
SELECT * FROM Student ORDER BY RAND();
# 0 ~ N๋ฒ์งธ ๊น์ง ์ถ๋ ฅ๋จ
SELECT * FROM Student LIMIT N;
# X๋ฒ์งธ๋ถํฐ Y๊ฐ ์ถ๋ ฅ๋จ
SELECT * FROM Student LIMIT X, Y;
column
์ด ๊ฐ์ ๊ฐ๋ผ๋ฆฌ ํ๋์ ๊ทธ๋ฃน์ ๋ง๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
# addr์ด ๊ฐ์ ํ์๋ผ๋ฆฌ ๋ฌถ์ด์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ง๋ค๊ณ count()ํจ์๋ก ๊ฐ์๋ฅผ ์ผ๋ค.
SELECT addr AS '์ง์ญ', COUNT(addr) AS 'ํ์์' FROM Student GROUP BY addr;
# ์ ์์์์๋ addr์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์์ผ๋ฏ๋ก addr์์ฒด๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์๊ด์์ง๋ง,
# ๋ค๋ฅธ ์ปฌ๋ผ์ธ id, name๊ฐ์ ๊ฒ์ addr์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ฌ์์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ ์ ์๊ฒ ๋๋ค.
# ์ฆ ์๋์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์๋ฌ๊ฐ ๋๊ฒ ๋๋ค.
SELECT name FROM Student GROUP BY addr;
# ํ์ง๋ง ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๊ฒ์ ํน์ํ ์ฐ์ฐ๋ค์ ํ๋ฉด ์ค๋ฅ์์ด ์ถ๋ ฅ์ด ๋๋ค.
SELECT AVG(id), COUNT(name) FROM Student GROUP BY addr;
# ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ธ ๊ฒ๋ค์ idํ๊ท ๊ณผ name์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์๋ฏธํ๋ ์์ด๋ค.
GROUP BY
์์ ์กฐ๊ฑด์ ๊ฑธ ๋ ์ฌ์ฉํ๋ค.
# addr์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ๊ณ ๊ทธ๊ฒ์ ์นด์ดํ
ํ ๊ฐ์ด 25๊ฐ ์ด์์ธ ๊ฒ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ผ๋ ์๋ฏธ์ด๋ค.
SELECT addr AS '์ง์ญ', COUNT(addr) AS cnt FROM Student GROUP BY addr HAVING cnt > 25 ORDER BY cnt DESC;
# cnt๋ฅผ ํ๊ธ๋ก ์์ฑํ๋ฉด HAVING์ด๋ ORDER BY์์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
if ~ else ๊ตฌ๋ฌธ๊ณผ ์ ์ฌํจ
# addr์ด ๊ฒฝ๊ธฐ๋๋ฉด 1, ๊ฒฝ์๋จ๋๋ฉด 2, ๋๋จธ์ง๋ 3
select distinct(addr),
(case when addr like '๊ฒฝ๊ธฐ๋%' then '1'
when addr like '๊ฒฝ์๋จ๋%' then '2'
else '3' end)
from Student;
# ์๋์ฒ๋ผ ๊ฐ์ ์กฐ๊ฑด ์์ด ๋ฐ๋ก ๋น๊ตํ ๋๋ ์ฒซ ๋ฒ์งธ when๋ณด๋ค ์์ ์ฌ์ฉํด์ ๋ค์ ๋ฐ๋ณต์ ์ธ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค.
select distinct(addr),
(case addr when '๊ฒฝ๊ธฐ๋ ์ฉ์ธ์' then '1'
when '๊ฒฝ์๋จ๋ ์ง์ฃผ์' then '2'
else '3' end)
from Student;
์๋ฅผ ๋ค๋ฉด ๊ตญ๊ฐ์ ๋ํต๋ น์ ๊ด๊ณ๊ฐ 1:1
๊ด๊ณ๋ค. ( ๋ฑํ ์์๊ฐ ๋ ์ค๋ฅด๋ ๊ฒ ์๋ค์... )
๊ตญ๊ฐ๋ ๋ฐ๋์ ํ๋์ ๋ํต๋ น์ด ์์ด์ผ ํ๊ณ , ๋ํต๋ น๋ ๋ฐ๋์ ํ๋์ ๊ตญ๊ฐ์ ์ํด์ผ ํ๋ค.
1:1
๊ด๊ณ์์๋ ๋ ๊ฐ์ ํ
์ด๋ธ ์ค์ ํ๋์ ํ
์ด๋ธ์๋ง ๋ค๋ฅธ ํ
์ด๋ธ์ ์ฐธ์กฐํ๋ ํค๋ฅผ ๊ฐ์ง๋ฉด ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์ ์ ์ ๊ฒ์๊ธ์ ๊ด๊ณ๊ฐ 1:N
๊ด๊ณ๋ค.
๊ณต๋์์
์ด ์๋ค๋ ๊ฐ์ ํ์ ์ ์ ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒ์๊ธ์ ์์ฑํ ์ ์์ง๋ง, ๊ฒ์๊ธ์ ํ๋์ ์ ์ ์ ์ข
์์ ์ด๋ค.
1:N
๊ด๊ณ์์๋ 1
์์ N
์ ํ
์ด๋ธ์ ์ฐธ์กฐํ๋ ํค๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
์๋ฅผ ๋ค๋ฉด ์ ์ ์ ๊ฒ์๊ธ์ ์ข์์ ๊ด๊ณ๊ฐ N:M
๊ด๊ณ๋ค.
์ ์ ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒ์๊ธ์ ์ข์์๋ฅผ ๋๋ฅผ ์ ์๊ณ , ๊ฒ์๊ธ๋ ์ฌ๋ฌ ๋ช
์ ์ ์ ์๊ฒ ์ข์์๋ฅผ ๋ฐ์ ์ ์๋ค.
N:M
๊ด๊ณ์์๋ ์ค๊ฐ ํ
์ด๋ธ์ด ํ์ฐ์ ์ผ๋ก ์๊ธฐ๊ฒ ๋๋ค.
๋ง์ฝ ์ค๊ฐ ํ
์ด๋ธ์ด ์๋ค๋ฉด ๊ฐ ํ
์ด๋ธ์ ๊ฐ ํ
์ด๋ธ์ ์ฐธ์กฐํ๋ ํค๋ฅผ ๊ฐ์ ธ์ผ ํ๋๋ฐ ๋ ๊ฐ ์ด์์ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ํ ์ปฌ๋ผ์ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๋ฃ๊ฑฐ๋ ์ค๋ณต๋๋ ์ปฌ๋ผ์ ์์ฑํด์ผ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
( ์ ์ ๊ฐ ๋ ๊ฐ์ ๊ฒ์๊ธ์ ์ข์์๋ฅผ ๋๋ฅผ ๊ฒฝ์ฐ ์ ์ ์ ๊ฒ์๊ธ์์ด๋์ปฌ๋ผ์ ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฃ๊ฑฐ๋, ๊ฐ์ ์ ์ ๋ฅผ ๋๊ฐ์ ์ปฌ๋ผ์ผ๋ก ๋๋ ์ ๊ฐ๊ฐ ๊ฒ์๊ธ ์์ด๋๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค. DB์ ๊ท์น์ ์ด๊ธฐ๊ฑฐ๋, ๋ถํ์ํ๊ฒ ๋ฐ๋ณต์ ์ธ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ ํํ๊ฐ ๋๋ค. )
์ด๋ฐ ๋ถํ์ํ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ค๊ฐ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ํด๋น ํ ์ด๋ธ์ ๊ฐ ํ ์ด๋ธ์ ์ฐธ์กฐํ๋ ํค๋ฅผ ๋งตํํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํด์ผ ํ๋ค.
์ธ๋ฑ์ค๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๋ ๊ฐ์ด๋ค. ( ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์์ผ๋ฏ๋ก ๊ฒ์์๋โ )
mysql
๊ธฐ์ค์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ๋์ ํ์ด์ง ๋จ์๋ก ์ ์ฅํ๋ค.
ํ๋์ ํ์ด์ง์ ํฌ๊ธฐ๋ 16KB(16 * 1024BYTE)
์ด๋ค.
ํ์ด์ง์ ์ ์ฅ๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌ, ํน์ ๊ฐ๋ง ๊ฒ์ํ๋ฏ๋ก ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
๋ง์ฝ์ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก SELECT
๋ฅผ ํ๋ ๊ฒฝ์ฐ ํด๋น ํ
์ด๋ธ์ full scan
ํด์ผ ํ๋ฏ๋ก ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ณ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ ์ธ๋ฑ์ค๋ฅผ ๋จ๋ฐํ๋ฉด ์ธ๋ฑ์ค ํ์ด์ง์์ ๊ฒ์ํ ์์ด ๋์ด๋๋ฏ๋ก ๋นํจ์จ์ ์ธ ์ฐ์ฐ์ด ๋์ด๋ ์ ์์ผ๋ฏ๋ก ์ ๋นํ๊ฒ ์กฐ์ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
primary key
, foregin key
, unique key
๋ ์๋์ ์ผ๋ก ์ธ๋ฑ์ค๋ก ๋ฑ๋ก๋๋ค.SHOW INDEX FROM <table-name>;
ALTER TABLE <table-name> ADD INDEX <index-name> (<column-name> <์ ๋ ฌ๋ฐฉ๋ฒ(ASC, DESC)>);
ALTER TABLE <table-name> DROP INDEX <index-name>;
select * from information_schema.table_constraints where table_name = '<table-name>';
๋ค๋ฅธ ํ ์ด๋ธ๊ณผ์ ๊ด๊ณ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
author.id
์ book.author_id
์ ๊ด๊ณ๋ฅผ ์ค์ book.author_id
๊ฐ author.id
๋ฅผ ์ฐธ์กฐํ๋ค.# ํ์
[CONSTRAINT] [<index-name>] FOREIGN KEY (<์ฐธ์กฐํ -column-name>) REFERENCES <์ฐธ์กฐ๋นํ -table-name>(<์ฐธ์กฐ๋นํ -column-name>) [ON (DELETE | UPDATE) (RESTRICT | CASCADE | SET NULL | NOACTION | SET DEFAULT)];
# ์ฌ์ฉ
# book์ ๋ง๋ค ๋ ์ฌ์ฉ... book์ด author๋ฅผ ์ฐธ์กฐํ๋ ํ์์ด๋ผ์
# author๋ฅผ ๋จผ์ ๋ง๋ค๊ณ ์ดํ์ book์ ๋ง๋ค ๋ foreign key๋ฅผ ์ง์ ํด์ผํ๋ค.
CONSTRAINT fk_author_book FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE CASCADE;
# ํ์
ALTER TABLE <์ฐธ์กฐํ -table-name> ADD CONSTRAINT [<index-name>] FOREIGN KEY(<์ฐธ์กฐํ -column--name>) REFERENCES <์ฐธ์กฐ๋นํ -table-name>(<์ฐธ์กฐ๋นํ -column-name>) [ON (DELETE | UPDATE) (RESTRICT | CASCADE | SET NULL | NOACTION | SET DEFAULT)];
# ์ฌ์ฉ
ALTER TABLE book ADD CONSTRAINT pk_author_book FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE CASCADE;
๊ธฐ๋ณธ์ ์ผ๋ก ON DELETE๋ฅผ ์์ฃผ์ฌ์ฉํ๋ฏ๋ก DELETE๊ธฐ์ค์ผ๋ก ์ค๋ช
ํจ
1. RESTRICT
: ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ ์๋ฌํ์
2. CASCADE
: ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ ๊ฐ์ด ์ญ์
4. SET NULL
: ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ NULL๋ก ๋์ฒด
5. NO ACTION
: ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๊ทธ๋๋ก ๋๋
6. SET DEFAULT
: ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ DEFAULT๋ก ๋์ฒด
์๋ณ์๊ฐ์ ์ด์ฉํด์ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ํฉ์ณ์ง ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
foreign key
)bookํ ์ด๋ธ | authorํ ์ด๋ธ | |||||
---|---|---|---|---|---|---|
id | name | authorId | id | name | age | |
1 | ๋ฐ์ง์ ์ ์ | 1 | 1 | J.R.R. ํจํจ | 21 | |
2 | ํด๋ฆฌํฌํฐ | 2 | 2 | JK ๋กค๋ง | 33 | |
3 | ํธ๋น | 1 | 3 | ์๊ฐ์ฌ ํฌ๋ฆฌ์คํฐ | 31 | |
4 | ๋์ ์ด๋ฆ์. | 4 | 5 | ํ๊ฐ์๋ ธ ๊ฒ์ด๊ณ | 55 |
๋ ๋ค ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฐ๊ด๋ง ๋ณด์์ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด๋ค.
# ํํ
SELECT * FROM <table-name> JOIN <table-name> on <condition>;
# ์์
SELECT a.name as '์ ์๋ช
', b.name as '๋์๋ช
' FROM author AS a [INNER] JOIN book AS b on a.id = b.authorId;
์ ์๋ช | ๋์๋ช |
---|---|
J.R.R. ํจํจ | ๋ฐ์ง์ ์ ์ |
J.R.R. ํจํจ | ํธ๋น |
JK ๋กค๋ง | ํด๋ฆฌํฌํฐ |
[OUTER]
JOIN์ข์ธก์ ์ ์ ๊ฐ ์ฆ, ๋จผ์ ์ ์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ๊ฐ์ ํฉ์ณ์ ๋ณด์ฌ์ฃผ๊ณ ์์ผ๋ฉด ๋งค์นญ๋๋ ์๋๊ฐ ์์ผ๋ฉด NULL
๋ก ์ฑ์์ ๋ณด์ฌ์ค๋ค.
# ํํ
SELECT * FROM <table-name> LEFT [OUTER] JOIN <table-name> on <condition>;
# ์์
SELECT a.name as '์ ์๋ช
', b.name as '๋์๋ช
' FROM author AS a LEFT JOIN book AS b on a.id = b.authorId;
์ ์๋ช | ๋์๋ช |
---|---|
J.R.R. ํจํจ | ๋ฐ์ง์ ์ ์ |
J.R.R. ํจํจ | ํธ๋น |
JK ๋กค๋ง | ํด๋ฆฌํฌํฐ |
์๊ฐ์ฌ ํฌ๋ฆฌ์คํฐ | NULL |
ํ๊ฐ์๋ ธ ๊ฒ์ด๊ณ | NULL |
[OUTER]
JOINLEFT JOIN
์์ ๊ธฐ์ค์ ๋ง ๋ฐ๋ ์ฐ์ฐ์
๋๋ค.
# ํํ
SELECT * FROM <table-name> RIGHT [OUTER] JOIN <table-name> on <condition>;
# ์์
SELECT a.name as '์ ์๋ช
', b.name as '๋์๋ช
' FROM author AS a RIGHT JOIN book AS b on a.id = b.authorId;
์ ์๋ช | ๋์๋ช |
---|---|
J.R.R. ํจํจ | ๋ฐ์ง์ ์ ์ |
J.R.R. ํจํจ | ํธ๋น |
JK ๋กค๋ง | ํด๋ฆฌํฌํฐ |
NULL | ๋์ ์ด๋ฆ์. |
sum, avg, mod, count, max, min, stdev, var_samp, cast, convert, now, str_to_date, concat, concat_ws, group_concat, if
๋ฏผ๊ฐํ๊ฑฐ๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๊ฒฝ์ฐ์ ์ธ์ด๋ธํฌ์ธํธ๋ฅผ ๋ง๋ค์ด์ ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ
# auto commit ์์์ ์ผ๋ก ์ทจ์
start TRANSACTION;
# ๊ฐ์ข
์์
( ๋ฐ์ดํฐ ๊ฐ๊ณต ์ฒ๋ฆฌ )
# ์ ์์ ์ผ๋ก ๋๋ฌ์ ๊ฒฝ์ฐ ์ ์ฉ
COMMIT;
# ๋ฌธ์ ๊ฐ ๋ฐ์ํด์ ์ต์ ์ปค๋ฐ์ผ๋ก ๋์๊ฐ๊ธฐ
ROLLBACK;
์ถ๊ฐ๋ก ๊ณต๋ถํ๋ฉด ๊ณ์ ์ถ๊ฐํ ์์