Day23 Database

์›ฐ์น˜์Šคยท2022๋…„ 11์›” 23์ผ
0

22/11/23

๐Ÿ“Œ 4. ์กฐ์ธ(join)

โœ๏ธ <์ถ”๊ฐ€ ์—ฐ์Šต๋ฌธ์ œ>

use shopdb;

desc members;
desc products;
desc orders;

select*
from members;  -- 11๊ฐœ

select*
from products; -- 6๊ฐœ

select*
from orders;  -- 10๊ฐœ
  1. members ํ…Œ์ด๋ธ”๊ณผ orders ํ…Œ์ด๋ธ” ์‚ฌ์šฉ.
    order_num, prod_id, member_id, member_name, phone, address, order_date๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
select  o.order_num, o.prod_id, m.member_id, m.member_name, m.phone, m.address, o.order_date
from members m join orders o
on m.member_id = o.member_id;

  1. products ํ…Œ์ด๋ธ”๊ณผ ordersํ…Œ์ด๋ธ” ์‚ฌ์šฉ
    order_num, member_id, prod_id, prod_name, price, company๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
select o.order_num, o.member_id, o.prod_id, p.prod_name, p.price, p.company
from orders o join products p
on p.prod_id = o.prod_id
order by o.order_num; 	-- ์ •๋ ฌ

  1. members ํ…Œ์ด๋ธ”๊ณผ products ํ…Œ์ด๋ธ”๊ณผ orders ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
    ์ฃผ๋ฌธ์ •๋ณด์™€ ์ฃผ๋ฌธํ•œ ํšŒ์› ์ •๋ณด์™€ ์ฃผ๋ฌธํ•œ ์ œํ’ˆ ์ •๋ณด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜์‹œ์˜ค.
    order_num, prod_id, prod_name, price, company, member_id, member_name, phone, address, order_date๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜์‹œ์˜ค
    ๋˜ํ•œ ์ฃผ๋ฌธ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์‹œ์˜ค.
select o.order_num, p.prod_id, p.prod_name, p.price, p.company, m.member_id, 
		m.member_name, m.phone, m.address, o.order_date
from members m join orders o
on m.member_id = o.member_id
join products p
on p.prod_id = o.prod_id
order by o.order_num;
-- (==)
select o.order_num, p.prod_id, p.prod_name, p.price, p.company, m.member_id, 
		m.member_name, m.phone, m.address, o.order_date
from members m join orders o join products p    
on m.member_id = o.member_id
and p.prod_id = o.prod_id
order by o.order_num;

  1. members ํ…Œ์ด๋ธ”๊ณผ products ํ…Œ์ด๋ธ”๊ณผ orders ํ…Œ์ด๋ธ” ์‚ฌ์šฉ
    ์ฃผ๋ฌธ์ •๋ณด, ์ฃผ๋ฌธ์ž ์ •๋ณด, ์ฃผ๋ฌธํ•œ ์ œํ’ˆ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋˜
    ๊ฐ€์ž… ํ›„ ์ฃผ๋ฌธํ•œ ์ด๋ ฅ์ด ์—†๋Š” ํšŒ์›๋„ ๊ฒฐ๊ณผ์— ์ถœ๋ ฅํ•˜์‹œ์˜ค.
    member_id, member_name, phone, address, prod_name, price, order_date ์ถœ๋ ฅํ•˜๋˜
    member_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
select m.member_id, m.member_name, m.phone, m.address, p.prod_name, p.price, o.order_date
from orders o join products p
on o.prod_id = p.prod_id
right outer join members m
on o.member_id = m.member_id 
order by m.member_id;

๐Ÿ“Œ 5-1. ๋‹จ์ผ ํ–‰ ํ•จ์ˆ˜ - ๋ฌธ์žํ•จ์ˆ˜

ํ•จ์ˆ˜๋ž€? ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์ •ํ•ด์ง„ ์กฐ์ž‘์„ ํ•œ ํ›„ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ.

  • SQLํ•จ์ˆ˜ ์œ ํ˜•
    1) ๋‹จ์ผํ–‰ํ•จ์ˆ˜ : ํ–‰ ๋ณ„๋กœ ์กฐ์ž‘ํ•ด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ. => 5์žฅ
    2) ๋‹ค์ค‘ํ–‰ํ•จ์ˆ˜ : ํ–‰ ๊ทธ๋ฃน์„ ์กฐ์ž‘ํ•ด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ. => 6์žฅ

๐Ÿ“‚ ๋ฌธ์žํ•จ์ˆ˜

ASCII(์•„์Šคํ‚ค์ฝ”๋“œ) : ๋ฌธ์ž์˜ ์•„์Šคํ‚ค ์ฝ”๋“œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
CHAR(์ˆซ์ž) : ์ˆซ์ž์˜ ์•„์Šคํ‚ค ์ฝ”๋“œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select ascii('A'), char(65);
-- from dual;	 ๋ชจ๋“  db์—๋Š” ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ”์ด ์—†์„๋•Œ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋งŒ๋“ค์–ด๋†“์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค = dual

( ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— BLOB๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ(Workbench์˜ ๋ฒ„๊ทธ), ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค ํด๋ฆญ ํ›„,
[Open Value in Viewer] ์„ ํƒ ํ›„, [Text] ํƒญ์— ๋“ค์–ด๊ฐ€๋ฉด ์ •์ƒ์ ์ธ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.)


LENGTH(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์˜ byte ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
BIT_LENGTH(๋ฌธ์ž์—ด) : ํ• ๋‹น๋œ bit ํฌ๊ธฐ ๋˜๋Š” ๋ฌธ์ž ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
CHAR_LENGTH(๋ฌธ์ž์—ด) : ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select length('abc'), bit_length('abc'), char_length('abc');
select length('๊ฐ€๋‹ค๋‚˜'), bit_length('๊ฐ€๋‚˜๋‹ค'), char_length('๊ฐ€๋‚˜๋‹ค');

CONCAT(๋ฌธ์ž์—ด1, ๋ฌธ์ž์—ด2, ...) : ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
CONCAT_WS(๊ตฌ๋ถ„์ž, ๋ฌธ์ž์—ด1, ๋ฌธ์ž์—ด2, ...) : ๊ตฌ๋ถ„์ž์™€ ํ•จ๊ป˜ ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

use hr;

select employee_id, concat(first_name, last_name) as "์ด๋ฆ„"
from employees;

select employee_id, concat(first_name, ' ', last_name) as "์ด๋ฆ„"
from employees;

select employee_id, 
		concat(first_name, ' ', last_name, ' ', job_id, ' ', email) as value
from employees;
-- (==)
select employee_id, 
		concat_ws(' ', first_name, last_name, job_id, email) as value
from employees;

select concat_ws('--', last_name, job_id, salary)
from employees;

INSTR(๊ธฐ์ค€ ๋ฌธ์ž์—ด, ๋ถ€๋ถ„ ๋ฌธ์ž์—ด) : ๊ธฐ์ค€ ๋ฌธ์ž์—ด์—์„œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์œ„์น˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select instr('ํ•˜๋‚˜๋‘˜์…‹','๋‘˜');
select last_name, instr(last_name, 'a') as "a์˜ ์ฒซ๋ฒˆ์งธ ์œ„์น˜"
from employees;

UPPER(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์„ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
LOWER(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์„ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select lower('abcdEFGH'), upper('abcdEFGH');

select employee_id, upper(last_name) as "L-name", lower(job_id) as "Job",
	   phone_number, lower(email) as "E-mail"
from employees;

select concat('The job id for ', upper(last_name), ' is ', lower(job_id))
from employees;

LEFT(๋ฌธ์ž์—ด, ๊ธธ์ด) : ์™ผ์ชฝ์—์„œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋งŒํผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
RIGHT(๋ฌธ์ž์—ด, ๊ธธ์ด) : ์˜ค๋ฅธ์ชฝ์—์„œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋งŒํผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
(ex) left(jumin_number, 6) => 901223

select left('abcdefghi', 3), right('adbcdfghi',3);
select last_name, left(last_name, 2), right(last_name, 2)
from employees;

LPAD(๋ฌธ์ž์—ด, ๊ธธ์ด, ์ฑ„์šธ ๋ฌธ์ž)
: ๋ฌธ์ž์—ด์„ ๊ธธ์ด๋งŒํผ ๋Š˜๋ฆฐ ํ›„ ๋นˆ๊ณณ์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์šธ ๋ฌธ์ž๋กœ ์ฑ„์›Œ์ฃผ๋Š” ํ•จ์ˆ˜, ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ ํ•จ์ˆ˜
RPAD(๋ฌธ์ž์—ด, ๊ธธ์ด, ์ฑ„์šธ ๋ฌธ์ž)
: ๋ฌธ์ž์—ด์„ ๊ธธ์ด๋งŒํผ ๋Š˜๋ฆฐ ํ›„ ๋นˆ๊ณณ์„ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฑ„์šธ ๋ฌธ์ž๋กœ ์ฑ„์›Œ์ฃผ๋Š” ํ•จ์ˆ˜, ์™ผ์ชฝ ์ •๋ ฌ ํ•จ์ˆ˜

select lpad('๊ฐ€๋‚˜๋‹ค',5,'#'), rpad('๊ฐ€๋‚˜๋‹ค',5,'#');
select lpad(last_name,20, '_')as "L-name", rpad(first_name, 20,'_') as "F-name"
from employees;

LTRIM(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์˜ ์™ผ์ชฝ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
RTRIM(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์˜ ์˜ค๋ฅธ์ชฝ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select ltrim('     SQL๋ฌธ๋ฒ• '), rtrim('     SQL๋ฌธ๋ฒ•     '),
	   length('     SQL๋ฌธ๋ฒ• '), length(rtrim('     SQL๋ฌธ๋ฒ•     '));

TRIM(๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์˜ ์•ž/๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
TRIM(๋ฐฉํ–ฅ ์ž๋ฅผ๋ฌธ์ž์—ด FROM ๋ฌธ์ž์—ด)๋ฐฉํ–ฅ - leading(์•ž), trailing(๋’ค), both(์–‘์ชฝ)
: ๋ฌธ์ž์—ด๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๋ฐฉํ–ฅ์˜ ์ž๋ฅผ ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select trim('     SQL ๋ฌธ๋ฒ•   '), trim(both'_'from'__SQL_๋ฌธ๋ฒ•___');

REPLACE(๋ฌธ์ž์—ด, ๊ธฐ์กด๋ฌธ์ž์—ด, ๋ฐ”๊ฟ€๋ฌธ์ž์—ด) : ๋ฌธ์ž์—ด์— ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ๋ฐ”๊ฟ€ ๋ฌธ์ž์—ด๋กœ ๊ต์ฒดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

select employee_id, phone_number, replace(phone_number,'.','-')as"์ „ํ™”๋ฒˆํ˜ธ"
from employees;

SPACE(๊ธธ์ด) : ๊ธธ์ด๋งŒํผ์˜ ๊ณต๋ฐฑ์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select concat('MySQL',space(10),'DBMS');

SUBSTR(๋ฌธ์ž์—ด, ์‹œ์ž‘์œ„์น˜, ๊ธธ์ด) : ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ถ„์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜

select substr('๋Œ€ํ•œ๋ฏผ๊ตญ๋งŒ์„ธ',3,2);
select last_name, substr(last_name,2,3), substring(last_name,2,3)
from employees;

  • ์‹œ์ž‘์œ„์น˜์—(๋‘๋ฒˆ์งธ์ธ์ˆ˜) ์Œ์ˆ˜๊ฐ’์ด ์žˆ์œผ๋ฉด : ์‹œ์ž‘์œ„์น˜๋ฅผ ๋์—์„œ๋ถ€ํ„ฐ ์ฐพ์•„์˜ด
  • ๋ฐ˜ํ™˜ํ•  ๋ฌธ์ž์ˆ˜(์„ธ๋ฒˆ์งธ์ธ์ˆ˜) ์ƒ๋žต : ์‹œ์ž‘ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐ˜ํ™˜ํ•จ.
select last_name,
		substr(last_name,3,2),substr(last_name,-3,2),
        substr(last_name,2), substr(last_name,-3)
from employees;


โœ๏ธ <์—ฐ์Šต๋ฌธ์ œ>

  1. employees ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์‚ฌ์›๋“ค์˜ last_name๊ณผ last_name์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋˜
    last_name์ด โ€˜Jโ€™, โ€˜Aโ€™, โ€˜Mโ€™์œผ๋กœ ์‹œ์ž‘๋˜๋Š” ์‚ฌ์›๋งŒ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
    ๋˜ํ•œ last_name์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
select last_name as "Name", length(last_name) as "Length"
from employees
where last_name Like 'J%'
or last_name Like 'A%'
or last_name Like 'M%'
order by last_name;
-- (==)
select last_name as "Name", length(last_name) as "Length"
from employees
where substring(last_name, 1, 1) in('j','m','a')
order by last_name;

  1. employees ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์‚ฌ์›๋“ค์˜ last_name๊ณผ salary๋ฅผ ์ถœ๋ ฅํ•˜๋˜
    ํŠนํžˆ ๊ธ‰์—ฌ๋Š” 15์ž๋ฆฌ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์™ผ์ชฝ๋ถ€ํ„ฐ $ ๊ธฐํ˜ธ๊ฐ€ ์ฑ„์›Œ์ง€๋„๋ก ์ง€์ •ํ•˜์‹œ์˜ค.
select last_name, lpad(salary,15,'$') as 'salary'
from employees;

  1. employees ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ last_name๊ณผ ๊ธ‰์—ฌ ์•ก์ˆ˜๋ฅผ ๋ณ„ํ‘œ(*)๋กœ ๋‚˜ํƒ€๋‚ด๋Š” query๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.
    ๊ฐ ๋ณ„ํ‘œ๋Š” $1,000๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋ฐฑ๋‹จ์œ„ ์ดํ•˜๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ๋˜ํ•œ ๊ธ‰์—ฌ์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ณ 
    ์ปฌ๋Ÿผ ์ œ๋ชฉ(column alias)์„ EMPLOYEES_AND_THEIR_SALARIES๋กœ ์ง€์ •ํ•˜์‹œ์˜ค.
  • [์˜ค๋‹ต] rpad, lpad ํ•จ์ˆ˜๋Š” ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์‹ค์ˆ˜์ธ ๊ฒฝ์šฐ ์ž๋™ ๋ฐ˜์˜ฌ๋ฆผํ•จ!
select last_name, salary,
		concat(last_name,' ', RPAD('*',salary/1000,'*'))
as EMPLOYEES_AND_THEIR_SALARIES
from employees
order by SALARY desc;

๊ฒฐ๊ณผ -> RPAD('*',salary/1000,'*')
	2์ฒœ ํ›„๋ฐ˜๋Œ€๋Š” 3๊ฐœ์˜ *์ด ์ฐํž˜
	3700/1000=3.7 
	rpad, lpad๋Š” ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์ž๋ฆฌ์ˆ˜ -> ์‹ค์ˆ˜์ผ๋•Œ๋Š” ์ž๋™ ๋ฐ˜์˜ฌ๋ฆผ
	3700/1000=3.7 => 4

  • [์ •๋‹ต] truncateํ•จ์ˆ˜ ์‚ฌ์šฉ!
select last_name, salary,
		concat(last_name,' ', RPAD('*', truncate(salary/1000,0),'*'))
as EMPLOYEES_AND_THEIR_SALARIES
from employees
order by SALARY desc;

0๊ฐœ์˜ ๋Œ“๊ธ€