혼자 공부하는 SQL - 3주차
- 3주차의 분량은 다음과 같습니다.
- 이번 장에서는 SQL 고급 문법에 대해 공부했습니다.
4.1 MySQL의 데이터 형식
데이터 형식
- MySQL에서 제공하는 데이터 형식의 종류는 수십 개 정도, 각 데이터 형식마다 크기, 표현 범위가 다릅니다.
- 데이터 형식은 다음과 같습니다.
- 정수형 : 소수점이 없는 숫자로, tinyint, smallint, int, bigint가 있으며, int를 가장 많이 사용합니다.
- 문자형 : 문자형은 글자를 저장하기 위해 사용하며 입력 최대 글자수를 지정해야 합니다. char, varchar 가 있는데 char은 자릿수가 고정되고 varchar은 가변길이 문자형입니다. 데이터 글자수가 같을 경우 char, 다를 경우 varchar을 사용합니다.
- 실수형 : 실수형은 소수점이 있는 숫자로, float, double이 존재합니다. 거의 비슷하며 과학 기술용 데이터가 아닌 이상 float으로 충분합니다.
형 변환
- 날짜형 : 날짜, 시간을 저장할 때 사용하며, date, time, datetime이 있습니다.
- 문자형 -> 정수형 또는 그 반대로 바꾸는 것을 데이터의 형 변환이라고 합니다. 명시적인 변환과 암시적인 변환이 있습니다.
- 함수를 이용한 명시적인 변환은 cast(), convert() 함수 두 가지가 있습니다.
cast (값 as 데이터_형식 [(길이)]
convert (값, 데이터 형식 [(길이)]
- 암시적인 변환은 자연스럽게 형이 변환되는 것을 말합니다.
select '100' + '200';
+---------------+
| '100' + '200' |
+---------------+
| 300 |
+---------------+
1 row in set (0.00 sec)
4.2 두 테이블을 묶는 조인
- 조인은 두 개의 테이블을 서로 묶어 하나의 결과를 만들어 내는 것으로 두 테이블을 엮어야 원하는 형태가 나오는 것을 말합니다.
내부 조인
- 내부조인은 두 테이블을 연결할 때 가장 많이 사용하며, 그냥 조인이라 부르면 대부분 내부 조인입니다.
- 형식은 다음과 같습니다.
select <열 목록>
from <첫 번째 테이블>
inner join <두 번째 테이블>
on <조인될 조건>
[where 검색 조건]
- 두 개의 테이블을 조인하는 경우 동일한 열 이름이 존재한다면 꼭 테이블이름.열이름으로 표기해야 합니다.
외부 조인
- 외부 조인은 두 테이블을 조인할 때 필요한 내용이 한쪽 테이블에만 있어도 결과 추출이 가능합니다.
select <열 목록>
from <첫 번째 테이블(left 테이블)>
<left | right | full> outer join <두 번째 테이블(right 테이블)>
on <조인될 조건>
[where 검색 조건];
- 내부 조인과는 달리 한쪽에만 있는 데이터도 가져올 수 있으며, 없는 경우 NULL 로 표시됩니다.
4.3 SQL 프로그래밍
- 스토어드 프로시저는 MySQL에서 프로그래밍 기능이 필요할 때 사용하는 데이터베이스 객체입니다.
delimiter $$
create procedure 스토어드_프로시저_이름()
begin
(sql 프로그래밍 코딩)
end $$
delimiter ;
call 스토어드_프로시저_이름();
if 문 / if ~ else 문
if <조건식> then
SQL 문장들
else
SQL 문장들
end if;
- 조건식이 참이라면 if문 아래 문장, 아니라면 else 아래 문장을 실행합니다.
case 문
CASE
WHEN 조건 1 THEN
SQL 문장들1
WHEN 조건 2 THEN
SQL 문장들2
WHEN 조건 3 THEN
SQL 문장들3
ELSE
SQL 문장들4
END CASE;
WHILE 문
WHILE <조건식> DO
SQL 문장들
END WHILE;
동적 SQL
- SQL문은 내용이 고정되어 있는 경우가 대부분인데, 동적 SQL문을 사용해 변경되는 내용을 실시간으로 적용시켜 사용이 가능합니다.
create table gate_table(id int auto_increment primary key, entry_time datetime);
set @curDate = current_timestamp();
prepare myQuery from 'insert into gate_table values(null, ?)';
execute myQuery using @curDate;
deallocate prepare myQuery;
select * from gate_table;
+----+---------------------+
| id | entry_time |
+----+---------------------+
| 1 | 2023-07-21 17:54:15 |
+----+---------------------+
기본 미션
- 다음 SQL은 회원으로 가입만 하고, 한 번도 구매한 적이 없는 회원의 목록입니다. 빈칸을 채우세요.
select distinct M.mem_id, B.prod_name, M.mem_name, M.addr
from membber M
left outer join buy B
on M.mem_id = B.mem_id
빈칸
order by M.mem_id;
- 빈칸에 들어갈 답은
where B.prod_name is NULL
입니다.
- having 의 경우는 group by 절에서 조건을 추가할 때 사용합니다.
선택 미션
- 중복된 결과 1개만 출력하기 손코딩 실행 및 결과화면 인증.
- DISTINCT를 사용해 중복된 결과를 제거할 수 있습니다.
mysql> select distinct M.mem_id, M.mem_name, M.addr
-> from buy B
-> inner join member M
-> on B.mem_id = M.mem_id
-> order by M.mem_id;
+--------+--------------+--------+
| mem_id | mem_name | addr |
+--------+--------------+--------+
| APN | 에이핑크 | 경기 |
| BLK | 블랙핑크 | 경남 |
| GRL | 소녀시대 | 서울 |
| MMU | 마마무 | 전남 |
+--------+--------------+--------+
4 rows in set (0.01 sec)