๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/SQL

[SQL] MYSQL ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

by vodkassi 2021. 7. 17.
728x90

โœจ SQL์ด๋ž€?

Structured Query Language ์˜ ์•ฝ์ž๋กœ, RDBMS(Relational Database Management System) ๊ณผ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์–ธ์–ด์ด๋‹ค. SQL ๋‚ด ํ•˜๋‚˜์˜ Database ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ table (๋˜๋Š” entity)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ table ์€ ํ–‰(record), ์—ด(field), ๋ฐ์ดํ„ฐ ๊ฐ’(value) ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

 

 

 

SQL ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ํ…Œ์ด๋ธ”์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. ๊ฐ€๋ น, users ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ „๋ถ€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

 

SELECT *
FROM users;

 

์ฟผ๋ฆฌ๋Š” Case-sensitive ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‚˜, ์ž‘์—… ์ปจ๋ฒค์…˜์— ๋งž์ถฐ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋˜ํ•œ, ๋งค ์ฟผ๋ฆฌ๊ฐ€ ๋๋‚˜๋Š” ์ง€์ ์— ์„ธ๋ฏธ์ฝœ๋ก  ( ; ) ์„ ๋ถ™์—ฌ์„œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ๋ ค์•ผ ํ•œ๋‹ค. ์ฃผ์„์€ -- (single line) ๋˜๋Š” /* */ (multiline) ์œผ๋กœ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

SQL ๋ช…๋ น๋ฌธ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/ํ…Œ์ด๋ธ” ๋ช…์ด ์•„๋‹Œ ๋ฌธ์ž์—ด ๊ฐ’์„ ์ฟผ๋ฆฌ์— ํฌํ•จํ•  ๊ฒฝ์šฐ ๋”ฐ์˜ดํ‘œ๋กœ ํ‘œํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

SELECT *
FROM users
WHERE name = 'Haeun';

 

โœจ DDL, DML, DCL 

SQL ๋ช…๋ น์–ด๋“ค์€ DDL, DML, DCL ์˜ ๊ด€์ ์—์„œ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

DDL: Data Definition Language (๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด)

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์ด๋‹ค. 

- ํ…Œ์ด๋ธ” ์ƒ์„ฑ, ๋ณ€๊ฒฝ, ์‚ญ์ œ ๋“ฑ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ๋ช…๋ น์–ด๋“ค์„ ๋งํ•œ๋‹ค. 

- CREATE, ALTER, DROP, TRUNCATE ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

 

DML: Data Manipulation Language (๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด)

- ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์–ธ์–ด์ด๋‹ค.

- ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ์•ˆ์˜ ๋ฐ์ดํ„ฐ์— ๋ณ€ํ˜•์„ ๊ฐ€ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ ๋งํ•œ๋‹ค. 

- SELECT, INSERT, UPDATE, DELETE ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

 

DCL: Data Control Language (๋ฐ์ดํ„ฐ ์ œ์–ด ์–ธ์–ด)

- ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ์‚ฌ์šฉ์ž๋ณ„ ๊ถŒํ•œ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ, ๊ฐ์ฒด ์‚ฌ์šฉ ๋“ฑ)์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์–ธ์–ด์ด๋‹ค. 

- GRANT, REVOKE ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ• ๋ง๊ณ ๋„ CRUD (Create, Read, Update, Delete) ์˜ ๊ด€์ ์—์„œ ๋‹ค์‹œ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 

โœจ ๋ฌธ๋ฒ• ๊ธฐ์ดˆ ์ •๋ฆฌ 

 

โœจ DDL

 

CREATE

 

database ์— table ์„ ์ƒ์„ฑํ•œ๋‹ค. table ๋ช…์„ ์ง€์ •ํ•ด์ค€ ๋’ค ๊ด„ํ˜ธ ์•ˆ์— field ๋ช…๊ณผ field ์˜ datatype, ๊ทธ๋ฆฌ๊ณ  constraints (์ œ์•ฝ ์กฐ๊ฑด) ์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

CREATE TABLE users(
    id int PRIMARY KEY,
    name varchar(255)
);

/*
ํ…Œ์ด๋ธ”๋ช…: users
field ๋ช…: id, name
field datatype: int, varchar(255)
options: primary key
*/

-- database ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 
CREATE DATABASE database_name;

 

ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ์กฐ๊ฑด (constraint) ๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 

 

-- constraints

PRIMARY KEY -- ํ…Œ์ด๋ธ”๋งˆ๋‹ค ํ•œ ๊ฐœ์”ฉ์€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ณ ์œ ๊ฐ’์ด๋‹ค
FOREIGN KEY -- ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค์ด๋‹ค
AUTO_INCREMENT -- datatype ๊ฐ€ int ์ธ ๊ฒฝ์šฐ, ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
NOT NULL -- null ๊ฐ’์ด ์‚ฝ์ž…๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค 
UNIQUE -- ๋™์ผ ํ…Œ์ด๋ธ”์— ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์ด๋ฉด ์ค‘๋ณต ์ž…๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค
DEFAULT -- ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ถ€์—ฌํ•  ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค
CHECK -- ์ผ์ • ์กฐ๊ฑด์— ๋งŒ์กฑํ•  ๊ฒฝ์šฐ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค

 

๋˜ํ•œ int, varchar ์ด์™ธ์— ์ž์ฃผ ํ™œ์šฉํ•˜๋Š” datatype ๋“ค๋„ ์กด์žฌํ•œ๋‹ค. 

 

-- Date types
DATE -- format: YYYY-MM-DD
DATETIME -- format: YYYY-MM-DD HH:MI:SS
TIMESTAMP -- format: YYYY-MM-DD HH:MI:SS
YEAR -- format: YYYY or YY

 

ALTER

 

table ๋‚ด์— ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ํ•„๋“œ๋ฅผ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

ALTER TABLE table_name
ADD column_name datatype;
-- ํ•„๋“œ ์ถ”๊ฐ€

ALTER TABLE table_name
DROP COLUMN column_name;
-- ํ•„๋“œ ์‚ญ์ œ (constraint ๋„ ์‚ญ์ œ ๊ฐ€๋Šฅ)

ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
-- ํ•„๋“œ ์ˆ˜์ •

 

DROP

 

table (๋˜๋Š” database) ์„ ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด๋‹ค. 

 

DROP TABLE table_name;

DROP DATABASE database_name;

 

TRUNCATE 

 

table ๋‚ด์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

TRUNCATE TABLE users;

 

โœจ DML

 

 

SELECT

 

table ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ช…๋ น์–ด์ด๋ฉฐ, FROM ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  table ์„ ์ง€์ •ํ•œ๋‹ค.

 

SELECT 'hello'
SELECT 2 + 5 // or 2

SELECT Column_1, Column_2; -- ๋ณต์ˆ˜ ์—ด ์„ ํƒ
SELECT * FROM table_1; -- * ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์—ด์„ ์„ ํƒํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

DISTINCT ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒํ•˜๊ณ ์ž ํ•˜๋Š” ํ•„๋“œ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฐ’๋“ค๋งŒ ์„ ํƒํ•œ๋‹ค.

 

SELECT DISTINCT name 
FROM users

SELECT DISTINCT name, age
FROM users
-- age + name ์˜ ์œ ์ผํ•œ ์กฐํ•ฉ๋งŒ ๋‚จ๊น€

 

AS ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋ฉด ์กฐํšŒํ•˜๊ณ ์ž ํ•˜๋Š” ํ•„๋“œ๋ช…์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

-- ํ•„๋“œ ์ด๋ฆ„์ด name ์ด ์•„๋‹ˆ๋ผ n ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค 
SELECT name AS n
FROM users

-- ์—ฌ๋Ÿฌ ์„ ํƒ์ง€๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น  ์ˆ˜๋„ ์žˆ๋‹ค
SELECT CustomerName, Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS Address
FROM Customers;

SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID;

 

WHERE ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋ฉด ํŠน์ • ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SELECT age
FROM users
WHERE age >= 20
-- WHERE age = 20, <, >, >=, <= ๋‹ค ๊ฐ€๋Šฅ
-- WHERE age != 20  ํŠน์ • ๊ฐ’๋งŒ ์ œ์™ธ

SELECT name 
FROM users
WHERE price BETWEEN 10 AND 20
-- ๋‘ ๊ฐ’์˜ ์‚ฌ์ด์— ๋†“์ธ ๊ฐ’๋งŒ ์ถ”์ถœํ•œ๋‹ค
-- NOT BETWEEN ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

SELECT name 
FROM users
WHERE name LIKE '%haeun%' 
-- ํŠน์ • ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ์ถ”์ถœํ•œ๋‹ค
-- NOT LIKE ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

SELECT name 
FROM users
WHERE name IN ('haeun', 'kang')
-- ์ถ”์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”์ถœํ•œ๋‹ค
-- NOT IN ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

SELECT * FROM users
WHERE city = 'Berlin' AND city = 'London'
-- ๊ฐ’์ด ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑํ•  ๋•Œ ์ถ”์ถœํ•œ๋‹ค
-- OR ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑํ•  ๋•Œ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค 
-- city IS NULL ๋˜๋Š” city IS NOT NULL ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

 

INSERT

 

table ์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. INTO ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

 

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
-- PK ๊ฐ€ auto-increment ๋ผ๋ฉด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค
-- ๋ช…์‹œํ•˜์ง€ ์•Š์€ ์—ด์˜ ๊ฒฝ์šฐ, null ๋˜๋Š” default ๊ฐ’์ด ์‚ฝ์ž…๋œ๋‹ค
-- column ์ˆœ์„œ์™€ value ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋„๋ก ์‚ฝ์ž…ํ•ด์•ผ ํ•œ๋‹ค

-- ๋ชจ๋“  ์—ด์— ๋Œ€ํ•ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด:
INSERT INTO table_name
VALUES (value1, value2, value3, ...);

 

UPDATE

 

table ์— ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’๋“ค์„ ์ˆ˜์ •ํ•œ๋‹ค. SET ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. 

 

UPDATE Customers
SET City = 'Oslo'
-- ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์˜ City ๊ฐ’์„ Oslo ๋กœ ๋ฐ”๊ฟˆ

UPDATE Customers
SET City = 'Oslo', ContactName = 'Haeun'
WHERE City = 'London'
-- City ๊ฐ’์ด London ์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด City ๊ฐ’์„ Oslo ๋กœ ๋ณ€ํ™˜

 

DELETE 

 

table ์˜ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ์‚ญ์ œํ•œ๋‹ค. 

 

DELETE FROM Customers 
WHERE Country = 'Norway'
-- WHERE ์—†์ด DELETE FROM ๋งŒ ํ•œ๋‹ค๋ฉด ๋ ˆ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์‚ญ์ œํ•œ๋‹ค (TRUNCATE ์™€ ๋™์ผ)

 

โœจ ๋งˆ๋ฌด๋ฆฌ 

SQL ์€ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์–ธ์–ด์ด๊ธด ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค๋„, ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์ง๊ตฐ ์ข…์‚ฌ์ž๋“ค๋„ ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์ด๋‹ค. ๋ฐ์ดํ„ฐ ์‹œ๋Œ€์— ์ ‘์–ด๋“ค๋ฉฐ SQL ์„ ๋‹ค๋ฃจ๋Š” ๋Šฅ๋ ฅ์ด ์ ์ฐจ ๋” ๊ฐ•์กฐ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘์š”์„ฑ ๋˜ํ•œ ๋Œ€๋‘๋˜๊ณ  ์žˆ๋‹ค. ์‹ฌํ™” ํ•™์Šต์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด SQLD ์ž๊ฒฉ์ฆ์„ ๋ชฉํ‘œํ•˜์—ฌ ๊ณต๋ถ€ํ•ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. 

 

 

โœจ์ฐธ๊ณ ์ž๋ฃŒ

 

'๐Ÿ’ป DEV > SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Real MySQL] 02_์„ค์น˜์™€ ์„ค์ •  (0) 2021.10.13

๋Œ“๊ธ€