DevLog

SQL ๊ธฐ๋ณธ๋ฌธ๋ฒ• ๋ณธ๋ฌธ

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ/Database

SQL ๊ธฐ๋ณธ๋ฌธ๋ฒ•

Seungjae Lee 2021. 10. 8. 13:39

๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฌธ ์•Œ์•„๋ณด๊ธฐ

๋‹ค์Œ์€ SQL์„ ์‚ฌ์šฉ์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Select
  • Where
  • And, Or, Not
  • Order By
  • Insert Into
  • Null Values
  • Update
  • Delete
  • Count
  • Like
  • Wildcards
  • Aliases
  • Joins
    • Inner Join
    • Left Join
    • Right Join
  • Group By
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์šฉ์–ด
  • SQL Create DB
  • SQL Drop DB
  • SQL Create Table
  • SQL Drop Table
  • SQL Alter Table
  • SQL Not Null
  • SQL Unique
  • SQL Primary Key
  • SQL Foreign Key
  • SQL Default
  • SQL Auto Increment
  • SQL Dates

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ช…๋ น์–ด

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

CREATE DATABASE ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค_์ด๋ฆ„;

[์ฝ”๋“œ] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•˜๋ ค๋ฉด, ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋ช…๋ น์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

USE ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค_์ด๋ฆ„;

[์ฝ”๋“œ] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑ

USE ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋ฉด, ์ด์ œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ user๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์€ ํ•„๋“œ(ํ‘œ์˜ ์—ด)์™€ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•„๋“œ ์กฐ๊ฑด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์ด๋ฆ„ ํ•„๋“œ ํƒ€์ž… ๊ทธ ์™ธ์˜ ์†์„ฑ
id ์ˆซ์ž Primary key์ด๋ฉด์„œ ์ž๋™ ์ฆ๊ฐ€ํ•˜๋„๋ก ์„ค์ • (์ดํ›„์— ์ฒœ์ฒœํžˆ ๋ฐฐ์›๋‹ˆ๋‹ค)
name ๋ฌธ์ž์—ด (์ตœ๋Œ€ 255๊ฐœ์˜ ๋ฌธ์ž)  
email ๋ฌธ์ž์—ด (์ตœ๋Œ€ 255๊ฐœ์˜ ๋ฌธ์ž)  

[ํ‘œ] user ํ…Œ์ด๋ธ” ์˜ˆ์‹œ

CREATE TABLE user (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(255),
  email varchar(255)
);

[์ฝ”๋“œ] user ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

SQL ์ฝ˜์†”์—์„œ Enter ํ‚ค๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๊ณ , ๋‹ค์Œ์—์„œ ์„ค๋ช…ํ•  DESCRIBE ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ” ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ •๋ณด ํ™•์ธ

๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ” ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DESCRIBE user;

[์ฝ”๋“œ] user ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด user ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

[์˜ˆ์‹œ] user ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

SQL ๋ช…๋ น์–ด ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ

MySQL์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด ๋ช‡ ๊ฐ€์ง€๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

SELECT

  • SELECT๋Š” ๋ฐ์ดํ„ฐ์…‹์— ํฌํ•จ๋  ํŠน์„ฑ์„ ํŠน์ •ํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ์ผ๋ฐ˜ ๋ฌธ์ž์—ด[์ฝ”๋“œ] ์ˆซ์ž[์ฝ”๋“œ] ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ
  • SELECT 15 + 3
  • SELECT 2
  • SELECT 'hello world'

FROM

  • ํ…Œ์ด๋ธ”๊ณผ ๊ด€๋ จํ•œ ์ž‘์—…์„ ํ•  ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FROM ๋’ค์—๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•ด๋‚ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ํŠน์ • ํŠน์„ฑ์„ ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉ[์ฝ”๋“œ] ๋ช‡ ๊ฐ€์ง€์˜ ํŠน์„ฑ์„ ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ์šฉ[์ฝ”๋“œ] ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํŠน์„ฑ์„ ์„ ํƒ
  • * ๋Š” ์™€์ผ๋“œ์นด๋“œ (wildcard) ๋กœ ์ „๋ถ€ ์„ ํƒํ•  ๋•Œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„
  • SELECT ํŠน์„ฑ_1 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„

WHERE

  • ํ•„ํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ž…๋‹ˆ๋‹ค. WHERE์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.[์ฝ”๋“œ] ํŠน์ • ๊ฐ’๊ณผ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ[์ฝ”๋“œ] ํŠน์ • ๊ฐ’์„ ์ œ์™ธํ•œ ๊ฐ’์„ ์ฐพ๊ธฐ[์ฝ”๋“œ] ํŠน์ • ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐํ•  ๋•Œ์—๋Š” '<', '>', ๋น„๊ตํ•˜๋Š” ๊ฐ’์„ ํฌํ•จํ•˜๋Š” '์ด์ƒ', '์ดํ•˜' ๊ฐ’์€ '<=', '>=' ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๊ฐ’๊ณผ ๋น„์Šทํ•œ ๊ฐ’๋“ค์„ ํ•„ํ„ฐํ•  ๋•Œ์—๋Š” 'LIKE'์™€ '%' ํ˜น์€ '*' ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋“ค๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐํ•  ๋•Œ์—๋Š” 'IN' ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ 'NULL' ์„ ์ฐพ์„ ๋•Œ์—๋Š” 'IS' ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•  ๋•Œ์—๋Š” 'NOT' ์„ ์ถ”๊ฐ€ํ•ด ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_1 IS NOT NULL
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_1 IS NULL
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_2 IN ("ํŠน์ •๊ฐ’_1", "ํŠน์ •๊ฐ’_2")
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_2 LIKE "%ํŠน์ • ๋ฌธ์ž์—ด%"
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_1 > "ํŠน์ • ๊ฐ’" SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_1 <= "ํŠน์ • ๊ฐ’"
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_2 <> "ํŠน์ • ๊ฐ’"
  • SELECT ํŠน์„ฑ_1, ํŠน์„ฑ_2 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ WHERE ํŠน์„ฑ_1 = "ํŠน์ • ๊ฐ’"

ORDER BY

  • ๋Œ๋ ค๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ORDER BY๋Š” ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๊ธฐ๋ณธ ์ •๋ ฌ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์ž…๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ๋„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ ORDER BY ํŠน์„ฑ_1 DESC
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ ORDER BY ํŠน์„ฑ_1

LIMIT

  • ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LIMIT์€ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ 200๊ฐœ๋งŒ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„ LIMIT 200

DISTINCT

  • ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” SELECT DISTINCT ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.[์ฝ”๋“œ] ํŠน์„ฑ_1์„ ๊ธฐ์ค€์œผ๋กœ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋“ค๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] ํŠน์„ฑ_1, ํŠน์„ฑ_2, ํŠน์„ฑ_3์˜ ์œ ๋‹ˆํฌํ•œ '์กฐํ•ฉ' ๊ฐ’๋“ค์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • SELECT DISTINCT ํŠน์„ฑ_1 ,ํŠน์„ฑ_2 ,ํŠน์„ฑ_3 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„
  • SELECT DISTINCT ํŠน์„ฑ_1 FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„

INNER JOIN

  • INNER JOIN ์ด๋‚˜ JOIN ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.[์ฝ”๋“œ] ๋‘˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์„œ๋กœ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.[๊ทธ๋ฆผ] Inner Join์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ์˜ˆ์‹œ
  • image
  • SELECT * FROM ํ…Œ์ด๋ธ”_1 JOIN ํ…Œ์ด๋ธ”_2 ON ํ…Œ์ด๋ธ”_1.ํŠน์„ฑ_A = ํ…Œ์ด๋ธ”_2.ํŠน์„ฑ_B

OUTER JOIN

  • Outer JOIN ์€ ๋‹ค์–‘ํ•œ ์„ ํƒ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.[์ฝ”๋“œ] 'LEFT OUTER JOIN'์œผ๋กœ LEFT INCLUSIVE์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.[์ฝ”๋“œ] 'RIGHT OUTER JOIN'์œผ๋กœ RIGHT INCLUSIVE์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • SELECT * FROM ํ…Œ์ด๋ธ”_1 RIGHT OUTER JOIN ํ…Œ์ด๋ธ”_2 ON ํ…Œ์ด๋ธ”_1.ํŠน์„ฑ_A = ํ…Œ์ด๋ธ”_2.ํŠน์„ฑ_B
  • SELECT * FROM ํ…Œ์ด๋ธ”_1 LEFT OUTER JOIN ํ…Œ์ด๋ธ”_2 ON ํ…Œ์ด๋ธ”_1.ํŠน์„ฑ_A = ํ…Œ์ด๋ธ”_2.ํŠน์„ฑ_B

์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•œ ๋ฒˆ์— ์จ๋ณด๊ธฐ

  • ๋‹ค์Œ์€ Brazil์—์„œ ์˜จ ๊ณ ๊ฐ์„ ๋„์‹œ๋ณ„๋กœ ๋ฌถ์€ ๋’ค์—, ๊ฐ ๋„์‹œ ์ˆ˜์— ๋”ฐ๋ผ ๋‚ด๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  CustomerId์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ 3๊ฐœ์˜ ๊ฒฐ๊ณผ๋งŒ ์š”์ฒญํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
    SELECT c.CustomerId, c.FirstName, count(c.City) as 'City Count'
    FROM customers AS c
    JOIN employees AS e ON c.SupportRepId = e.EmployeeId
    WHERE c.Country = 'Brazil'
    GROUP BY c.City
    ORDER BY 3 DESC, c.CustomerId ASC
    LIMIT 3
    [์ฝ”๋“œ] ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•œ ๋ฒˆ์— ์จ๋ณด๊ธฐ
  • ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Comments