MySQL로 배우는 데이터베스 - 04장 문제 풀이

2021. 6. 17. 17:59MySQL/MySQL로 배우는 데이터베이스 개론과 실습

반응형

01. 다음 내장 함수의 결과를 적으시오.

select abs(-15); -- 					15 : 절대값
select ceil(15.7); -- 					16 : '정수'로 올림
select cos(3.14159); -- 				-1 : 코사인값
select floor(15.7); -- 					15 : '정수'로 버림
select log(10, 100); -- 				2 : '자연로그'값 계산
select mod(11, 4); -- 					3 : 11 % 4 = 3 '나머지 계산'
select power(3, 2); -- 					9 : 3의2승 '지수 계산'
select round(15.1); -- 					15 : '정수'로 반올림
select sign(-15); -- 					-1 : 부호 반환 양수면 1, 음수면 -1
 
-- select tranc(15.7); tranc 함수는 없음 오타인듯 싶음
select char(67 using utf8); -- 			C : 내부에서 encoding
select concat('HAPPY','Birthday'); -- 	HAPPYBirthday : 두 값을 이어줌
select lower('BirthdaY'); -- 			birthday : 문자열을 소문자로 바꿔줌
select lpad('Page 1', 15, '*.'); -- 	*.*.*.*.*Page 1 : 특정 길이 만큼 문자를 오른쪽에 붙여서 출력함
select replace('JACK', 'J', 'BL'); --   BLACK : 문자를 서로 교체함
select rpad('Page 1', 15, '*.'); --     Page 1*.*.*.*.* : 특정 길이 만큼 문자를 왼쪽에 붙여서 출력함 

select substr('ABCDEFG', 3, 4); -- 		CDEF : 3번째 부터 4글자를 추출한다.
select trim(leading 0 from '00AA00');-- AA00 : leading trail both 옵션으로 공백, 문자 제거함 
select upper('Birthday'); -- 			BIRTHDAY : 문자를 대문자로 변경 
select ascii('A'); -- 					65 : 아스키 코드값 변환 
select length('Birthday'); -- 			8 : 문자 길이 반환
select adddate('2019-02-14', interval 10 day); -- 2019-02-24 : 날짜 덧셈 
select last_day(sysdate()); -- 			2021-06-30 : 이번달의 마지막 날
select now(); -- 						2021-06-17 10:21:46 : 현재 시간 표시 						
select date_format(sysdate(), '%Y'); -- 2021 : 날짜 포멧팅
select concat(123); -- 					123 : 위와 동일
select str_to_date('12 05 2014', '%d %m %Y'); -- string -> Date형으로 변환 
select cast('12.3123' as decimal(10,1)); -- 12.3 : 형변환 
select if(1=1, 'aa', 'bb'); -- 			aa : if구문 조건식이 맞으면 앞쪽 값, 틀리면 뒷쪽 값 			
select ifnull(123, 345); -- 			123 : null체크 앞쪽 값이 null이면 뒷쪽 값으로 반환
select ifnull(null, 123);  -- 			123 : 위와 동일

02. Mybook 테이블을 생성하고 NULL에 관한 다음 SQL 문에 답하시오. 

-- (1)
select *
from mybook;

-- (2)
select bookid, ifnull(price, 0)
from mybook;

-- (3)
select *
from mybook 
where price is null;

-- (4)
select *
from mybook 
where price = ' ';

-- (5)
select bookid, price+100
from mybook;

-- (6)
select sum(price), avg(price), count(*)
from mybook
where bookid >= 4;

-- (7)
select count(*), count(price)
from mybook;

-- (8)
select sum(price), avg(price)
from mybook;

03. MySQL의 행번호를 처리하는 다음 SQL 문에 답하시오.

set @RNUM = 0;

-- (1)
select *
from book;

-- (2)

select *, @RNUM := @RNUM + 1 as ROWNUM
from book, (select @RNUM := 0) R
where @RNUM <= 5;

-- (3)
select *, @RNUM := @RNUM + 1 as rownum
from book, (select @RNUM := 1) R
where @RNUM <= 5
order by price;

-- (4)
select *, @RNUM := @RNUM + 1 as rownum
from (select * from book order by price) b,
	 (select @RNUM := 0) R
where @RNUM < 5;

-- (5)
select *, @RNUM := @RNUM + 1 as rownum
from
(select * from book where @RNUM <= 5) b,
(select @RNUM := 0) R
order by price;

-- (6)
select *, @RNUM := @RNUM + 1 as rownum
from (select * from book where @RNUM <=5 order by price) b,
(select @RNUM := 0) r;

04. 부속질의에 관한 다음 SQL 문을 수행해보고 어떤 질의에 대한 답인지 설명하시오.

-- (1) orders에 custid로 customer과 join하여 주소로 맵핑하여 합계를 출력
select custid, (select address from customer cs where cs.custid = od.custid) 'address', sum(saleprice) 'total' 
from orders od
group by od.custid;

-- (2) orders의 주문 정보를 받아 이름으로 맵핑하여 평균 주문 price를 출력
select cs.name, s 
from 
(
	select custid, avg(saleprice) s
	from orders
	group by custid
) od, customer cs
where cs.custid = od.custid;

-- (3) customer의 custid 값이 3보다 작은 경우와 orders의 custid가 동일한 경우에 saleprice의 합
select sum(saleprice) 'total' 
from orders od 
where exists 
(
	select *
	from customer cs 
	where custid <= 3 and cs.custid = od.custid 
);

-- 위의 3번을 join으로 해석한 방법
select sum(saleprice) 'total' 
from orders o join customer c
on o.custid = c.custid
where o.custid <= 3;
반응형