Sam Baek, The Dev's Corner

๐Ÿ“ƒ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹ค๋ฃจ๊ธฐ

19 Jul 2023

SQL ๊ธฐ๋ณธ๋ฌธ


CRUD์™€ ๊ด€๋ จํ•ด ๋…ธ๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์š”์ฆ˜,
SQL์„ ์ž‘์„ฑํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žฆ๋‹ค.
๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ SQL ๋ฌธ๋ฒ•์„ ์ •๋ฆฌํ•˜๊ณ ,
ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

CRUD๋Š” ์ฐจ๋ก€๋กœ Create, Read , Update, Delete๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์–ธ์–ด๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ผญ ;์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ํ•ด์ค€๋‹ค.

์–ธ์–ด (SQL) ย 
Keword ๋‚ด์šฉ
show databases ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก์„ ๋ณด์—ฌ๋ผ
create database databaseName ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค
use databaseName ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ค์ž„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
drop databaseName ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ค์ž„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค
show tables ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ˆ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ณด์—ฌ๋ผ
create table tableName(fieldName Type length(NOT NULL) PRIMARY KEY AUTO_INCREMENTโ€ฆ) ENGINE InnoDB DEFAULT CHARSET=utf8mb4; ์„ธ๋ถ€์‚ฌํ•ญ, ์†์„ฑ ์ง€์ • ํ…Œ์ด๋ธ” ์ƒ์„ฑ
desc tableName ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ๋ผ
select * from tableName ํ…Œ์ด๋ธ” ์•ˆ์˜ ๋ชจ๋“  ๋ชฉ๋ก์„ ๋ณด์—ฌ๋ผ
select columnName from tableName ํ…Œ์ด๋ธ” ์•ˆ์˜ columnName์„ ๋ณด์—ฌ๋ผ
select * from tableName order by columnName DESC ํ…Œ์ด๋ธ” ์•ˆ์˜ ๋ชจ๋“  ๋ชฉ๋ก ์ค‘์—์„œ ์ปฌ๋Ÿผ๋„ค์ž„์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ณด์—ฌ๋ผ
select * from tableName order by columnName ASC ํ…Œ์ด๋ธ” ์•ˆ์˜ ๋ชจ๋“  ๋ชฉ๋ก ์ค‘์—์„œ ์ปฌ๋Ÿผ๋„ค์ž„์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ณด์—ฌ๋ผ
alter table tableName add column fieldName type lengthโ€ฆ ํ…Œ์ด๋ธ” ์•ˆ์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ
alter table tableName change column fieldName fieldName(์ˆ˜์ •ํ• ํ•„๋“œ๋‚ด์šฉ) type lengthโ€ฆ ํ…Œ์ด๋ธ” ์•ˆ์— ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ผ
update tableNmae set fieldName ํ…Œ์ด๋ธ” ์•ˆ์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ผ
delete from tableName where(์กฐ๊ฑด) ์กฐ๊ฑด ์•ˆ์— ํฌํ•จ๋œ ๊ฒƒ๋“ค์„ ํ…Œ์ด๋ธ”์—์„œ ์‚ญ์ œํ•˜๋ผ
insert into tableName(column1, column2,โ€ฆ) values(value1, value2, โ€ฆ), ( ), ( ), ( ) ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์— ๊ฐ’ ์ถ”๊ฐ€ํ•˜๋ผ
  • asc: ์ž‘์€๊ฒƒ๋ถ€ํ„ฐ ํฐ ๊ฒƒ์œผ๋กœ
  • desc : ํฐ ๊ฒƒ๋ถ€ํ„ฐ ์ž‘์€ ๊ฒƒ์œผ๋กœ

๋ช…๋ น์–ด ์ •๋ฆฌ


์œ„๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๊ณ ์žํ•ด๋„ ๋‚œ์žกํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
์„ธ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž

๋ช…๋ น์–ด ๋‚ด์šฉ
order by columName desc(asc) desc๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ, asc๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋‹ค.
select distinct ์ค‘๋ณต ์—†์ด ๋‚˜์—ดํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
where ํ•„ํ„ฐ๋งํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
from ์–ด๋А ํ…Œ์ด๋ธ”์—์„œ ๊ฐ–๋‹ค ์“ธ ๊ฒƒ์ธ์ง€
like ์™€์ผ๋“œ์นด๋“œ, ์ •๊ทœํ‘œํ˜„์‹ ์ฐธ์กฐ, ๋ณดํ†ต โ€˜%[]%โ€™ ๋ฐฉ์‹ ์‚ฌ์šฉ,
between a and b a์™€ b์‚ฌ์ด์˜ ๋ฒ”์œ„
where columnName in (value1, value2,โ€ฆ) ์—ฌ๋Ÿฌ ์กฐ๊ฑด ๊ฐ’ ์ง€์ •
where locate(value, columnName) > 0 columnName์— value๊ฐ€ ์žˆ๋Š”์ง€ ์กฐ๊ฑด
where instr(columnName, value) > 0 columnName์— value๊ฐ€ ์žˆ๋Š”์ง€ ์กฐ๊ฑด
limit number limit์€ ์ถœ๋ ฅํ•  ํ–‰์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ช…๋ น์–ด
count(columnName or *) ์ˆ˜๋ฅผ ์„ผ๋‹ค.
AS AS๋Š” ๋ณ„์นญ์„ ์˜๋ฏธํ•œ๋‹ค.
max max๋Š” ์ฃผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ where์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
min min์€ ์ฃผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ where์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
sum sum์€ ์ฃผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ where์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
avg avg๋Š” ์ฃผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ where์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
group by group by๋Š” ๊ทธ๋ฃน์„ ์ง€์ •ํ•œ๋‹ค.
having having์€ ๊ทธ๋ฃน์— ์กฐ๊ฑด์„ ์ง€์ •ํ•œ๋‹ค. count(name)>1
offset offset์€ ์ถœ๋ ฅํ•  ํ–‰์˜ ์‹œ์ž‘์ ์„ ์ง€์ •ํ•œ๋‹ค.
and and๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
or or๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
not not์€ ์กฐ๊ฑด์„ ๋ฐ˜๋Œ€๋กœ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
hour hour์€ ์‹œ๊ฐ„์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
minute minute์€ ๋ถ„์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
second second๋Š” ์ดˆ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
date date๋Š” ๋‚ ์งœ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
year year์€ ๋…„๋„๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
month month๋Š” ์›”์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
day day๋Š” ์ผ์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
week week๋Š” ์ฃผ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
dayofweek dayofweek๋Š” ์š”์ผ์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
dayofyear dayofyear๋Š” ๋…„ ์ค‘ ๋ช‡ ๋ฒˆ์งธ ๋‚ ์ธ์ง€ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
last_day last_day๋Š” ํ•ด๋‹น ์›”์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
quarter quarter๋Š” ํ•ด๋‹น ๋…„๋„์˜ ๋ช‡ ๋ถ„๊ธฐ์ธ์ง€ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
to_days to_days๋Š” ๋‚ ์งœ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
from_days from_days๋Š” ๋‚ ์งœ๋ฅผ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
date_format date_format์€ ๋‚ ์งœ๋ฅผ ์ง€์ •๋œ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
time_format time_format์€ ์‹œ๊ฐ„์„ ์ง€์ •๋œ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
timestampdiff timestampdiff๋Š” ๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
timestampadd timestampadd๋Š” ๋‚ ์งœ์— ์ผ์ • ๊ธฐ๊ฐ„์„ ๋”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
timediff timediff๋Š” ๋‘ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
date_add date_add๋Š” ๋‚ ์งœ์— ์ผ์ • ๊ธฐ๊ฐ„์„ ๋”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
date_sub date_sub๋Š” ๋‚ ์งœ์— ์ผ์ • ๊ธฐ๊ฐ„์„ ๋บ„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
addtime addtime์€ ์‹œ๊ฐ„์— ์ผ์ • ๊ธฐ๊ฐ„์„ ๋”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
subtime subtime์€ ์‹œ๊ฐ„์— ์ผ์ • ๊ธฐ๊ฐ„์„ ๋บ„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
with recursive with recursive ์žฌ๊ท€์ ์œผ๋กœ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
left join left join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
right join right join์€ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
full outer join full outer join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
cross join cross join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
natural join natural join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
inner join inner join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ํ•ฉ์น  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
on extract on extract๋Š” ์กฐ๊ฑด์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
case when then else end if๋ฌธ๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. when์ ˆ์—๋Š” ์กฐ๊ฑด์„, then์ ˆ์—๋Š” ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ๋ฅผ, else์ ˆ์—๋Š” ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ผ ๋•Œ ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. end ์ ˆ์€ case๋ฌธ์˜ ๋์„ ์˜๋ฏธํ•œ๋‹ค.
inner join ๋‘ ํ…Œ์ด๋ธ”์˜ ๊ต์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
inner join on on ์ ˆ์—๋Š” ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•  ๊ธฐ์ค€์ด ๋˜๋Š” ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•œ๋‹ค. where์˜ ์—ญํ• 

left join์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋Š” ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.

SQL ์ž‘์„ฑ ์˜ˆ์‹œ



public int signup(UserDTO userDTO) {
        String SQL = "INSERT INTO kurly_table(user_id, user_pw, user_name, user_email, user_hp, user_addr, user_gender, user_birth) VALUES(?,?,?,?,?,?,?,?)";
        try {
            ps = conn.prepareStatement(SQL);
            ps.setString(1, userDTO.getUser_id());
            ps.setString(2, userDTO.getUser_pw());
            ps.setString(3, userDTO.getUser_name());
            ps.setString(4, userDTO.getUser_email());
            ps.setString(5, userDTO.getUser_hp());
            ps.setString(6, userDTO.getUser_addr());
            ps.setString(7, userDTO.getUser_gender());
            ps.setString(8, userDTO.getUser_birth());
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

public int signin(String user_id, String user_pw) {
        String SQL = "SELECT user_pw FROM kurly_table WHERE user_id=?";
        try {
            ps = conn.prepareStatement(SQL);
            ps.setString(1, user_id);
            rs = ps.executeQuery();

            if(rs.next()){
                if(rs.getString(1).equals(user_pw)){
                    return 1;
                }
                else{
                    return 0;
                }
            }
            else{
                return -1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -2;
    }

public int update(UserDTO userDTO) {
        String SQL = "UPDATE kurly_table SET user_pw=?, user_name=?, user_email=?, user_hp=?, user_addr=?, user_gender=?, user_birth=? WHERE user_id=?";
        try {
            ps = conn.prepareStatement(SQL);
            ps.setString(1, userDTO.getUser_pw());
            ps.setString(2, userDTO.getUser_name());
            ps.setString(3, userDTO.getUser_email());
            ps.setString(4, userDTO.getUser_hp());
            ps.setString(5, userDTO.getUser_addr());
            ps.setString(6, userDTO.getUser_gender());
            ps.setString(7, userDTO.getUser_birth());
            ps.setString(8, userDTO.getUser_id());
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

public int delete(UserDTO userDTO) {
    String SQL = "DELETE FROM kurly_table WHERE user_id=? AND user_pw=?";
    try {
        ps = conn.prepareStatement(SQL);
        ps.setString(1, userDTO.getUser_id());
        ps.setString(2, userDTO.getUser_pw());
        return ps.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return -1;
}