SQL 실습
테이블 생성 - DDL
속성이 레벨번호, 레벨이름, 레벨등록날짜로 구성되고 기본키가 권한인 회원 권한테이블을 생성하시오.
CREATE TABLE tb_member_level (
level_num INT(11) NOT NULL AUTO_INCREMENT
,level_name VARCHAR(300) NOT NULL
,level_reg_date DATE NOT NULL
,PRIMARY KEY(level_num)
);
속성이 회원 아이디, 비밀번호, 이름, 권한, 이메일, 주소, 회원등록날짜로 구성되고 기본키가 회원아이디, 회원 권한은 회원권한테이블의 아이디를 참조하는 회원테이블을 생성하시오.
CREATE TABLE tb_member (
m_id VARCHAR(200) NOT NULL
,m_pw VARCHAR(200) NOT NULL
,m_name VARCHAR(200) NOT NULL
,m_level INT(11) NULL DEFAULT NULL
,m_email VARCHAR(200) NOT NULL
,m_addr VARCHAR(200) NOT NULL
,m_reg_date DATE NOT NULL
,PRIMARY KEY (m_id)
,CONSTRAINT FK_m_level FOREIGN KEY (m_level) REFERENCES tb_member_level(level_num)
);
속성이 상품코드, 상품이름, 상품가격, 판매자 아이디, 상품등록날짜 구성되고 기본키가 상품코드, 판매자 아이디는 회원테이블의 아이디를 참조하는 상품테이블을 생성하시오.
CREATE TABLE tb_goods (
g_code VARCHAR(50) NOT NULL
,g_name VARCHAR(50) NOT NULL
,g_price INT(11) NOT NULL
,g_seller_id VARCHAR(50) NOT NULL
,g_reg_date DATE NOT NULL
,PRIMARY KEY (g_code)
,CONSTRAINT FK_g_seller_id FOREIGN KEY (g_seller_id) REFERENCES tb_member(m_id)
);
속성이 주문번호, 구매자 아이디, 주문상품코드, 주문수량, 주문등록날짜로 구성되고 기본키(자동증가)가 주문번호이고, 구매자 아이디는 회원테이블의 아이디를 참조하며 주문상품코드는 상품테이블의 상품코드를 참조하는 테이블을 생성하시오.
CREATE TABLE tb_order (
o_num INT(11) NOT NULL AUTO_INCREMENT
,o_id VARCHAR(200) NULL DEFAULT NULL
,o_g_code VARCHAR(200) NULL DEFAULT NULL
,o_amount INT(11) NULL DEFAULT NULL
,o_reg_date DATETIME NULL DEFAULT NULL
,PRIMARY KEY (o_num)
,CONSTRAINT FK_o_g_coed FOREIGN KEY (o_g_code) REFERENCES tb_goods (g_code)
,CONSTRAINT FK_o_id FOREIGN KEY (o_id) REFERENCES tb_member (m_id)
);
로그인 번호, 로그인 아이디, 로그인 날짜, 로그아웃 날짜 속성으로 구성되고, 기본키(자동증가)가 로그인 번호이고, 로그인 아이디는 회원테이블의 아이디를 참조하는 로그인 테이블을 생성하시오.
CREATE TABLE tb_login (
login_num INT(11) NOT NULL AUTO_INCREMENT
,login_id VARCHAR(200) NOT NULL
,login_date DATE NOT NULL
,logout_date DATE NOT NULL
,PRIMARY KEY (login_num)
,CONSTRAINT FK_login_id FOREIGN KEY (login_id) REFERENCES tb_member (m_id)
);
코멘트를 잘 작성하자!
다음과 같이 회원레벨 테이블에 삽입하는 SQL 문장을 작성하시오.
INSERT INTO tb_member_level
(level_num, level_name, level_reg_date)
VALUES
(1, '관리자', '2020-03-17')
,(2, '판매자', '2020-03-17')
,(3, '구매자', '2020-03-17');
각 데이터를 각 테이블에 삽입하는 SQL 문장 작성.
외래키가 참조된 순서에 맞추어 insert문을 작성해주어야 한다.
SQL 집계함수
SELCET 구문이나 HAVING절에서 사용한다.
집계 함수 | ||
함수명 | 함수표기 | 설명 |
SUM | SUM() | 합계를 구한다. |
AVG | AVG() | 평균을 구한다. |
MIN | MIN() | 최소값을 구한다. |
MAX | MAX() | 최대값을 구한다. |
COUNT | COUNT() | 행의 개수를 센다. (NULL무시) |
COUNT DISTINCT | COUNT(DISTINCT) | 행의 개수를 센다. (중복은 1개만 인정) |
SELECT
o.o_id AS '구매자 아이디'
,sum(o.o_amount) AS '총 주문수량'
,AVG(o.o_amount) AS '평균 주문수량'
,ROUND(AVG(o.o_amount),1) AS '평균 주문수량'
,COUNT(o.o_amount) AS '총 주문횟수'
,MAX(o.o_amount) AS '최대 주문수량'
,MIN(o.o_amount) AS '최소 주문수량'
FROM
tb_order AS o
GROUP BY o.o_id
;
round( n , 반올림 할 소수점 자리수 )
실행 순서 인지하기 (tb_order AS o 선언 시점이 사용 시점 이전에 있어야 한다!)
SQL 내장함수
데이터 형식 변환 함수
-- 형변환
SELECT
NOW() AS 'DATETIME'
,CAST(NOW() AS DATE) AS 'DATE'
,CAST(NOW() AS TIME) AS 'TIME';
SELECT
CONVERT (AVG(o.o_amount), SIGNED INTEGER) AS '평균 주문 개수'
FROM
tb_order o;
-- 정수 타입: 음수까지 표현할 수 있는 SIGNED 타입
-- 양수만을 표현할 수 있는 UNSIGNED 타입
문자열 연결함수
-- 문자열 연결함수
SELECT
CONCAT(m.m_id, ' : ',m.m_name) AS '회원 아이디 : 회원 이름'
FROM
tb_member m;
암시적인 형변환
-- 문자와 문자를 더함 (정수로 변환되서 연산됨)
SELECT '100' + '200’ ;
-- 문자와 문자를 연결 (문자로 처리)
SELECT CONCAT('100', '200’);
-- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)
SELECT CONCAT(100, '200’);
제어 흐름 함수
SELECT IF (조건식, true시 반환하는 값, false시 반환하는 값);
-- 조건이 null이 아닐 경우 조건을 반환.
SELECT IFNULL(조건, null일경우 반환하는 값);
-- 조건1과 조건2가 같을 경우 null값을 반환, 다를경우 조건1을 반환
SELECT NULLIF(조건1,조건2);
문자열 함수
-- 문자를 ascii 코드로 변환 / ascii코드를 문자로 변환
SELECT ASCII('A'), CHAR(65);
-- 공백을 제거
SELECT TRIM(' KSMART35 ') AS result;
-- 반복
SELECT REPEAT('KSMART', 3) AS result;
-- 문자열 대체
SELECT REPLACE ('KSMART35기', 'KSMART' , '한국스마트정보교육원') AS result;
-- 문자열을 거꾸로 출력
SELECT REVERSE ('KSMART35') AS result;
-- 공백을 추가, 문자열 연결
SELECT CONCAT('KSMART', SPACE(15), '35기') AS result;
날짜 함수
SELECT
ADDDATE('2020-03-18', INTERVAL 31 DAY)
,ADDDATE('2020-03-18', INTERVAL 1 MONTH)
,SUBDATE('2020-03-18', INTERVAL 31 DAY)
,SUBDATE('2020-03-18', INTERVAL 1 MONTH)
,ADDTIME('2020-03-18 23:59:59', '1:1:1')
,ADDTIME('15:00:00', '2:10:10')
,SUBTIME('2020-03-18 23:59:59', '1:1:1')
,SUBTIME('15:00:00', '2:10:10');
SELECT
YEAR(CURDATE())
,MONTH(CURDATE())
,DAYOFMONTH(CURDATE());
SELECT
HOUR(CURTIME())
,MINUTE(CURRENT_TIME())
,SECOND(CURRENT_TIME())
,MICROSECOND(CURRENT_TIME());
SELECT DATE(NOW()), TIME(NOW());
curdate() <현재날짜
year >int data type 으로 반환
SELECT
DATEDIFF('2020-08-06', NOW())
,TIMEDIFF('17:30:01', CURRENT_TIME());
SELECT
DAYOFWEEK(CURDATE())
,MONTHNAME(CURDATE())
,DAYOFYEAR(CURDATE());
SELECT LAST_DAY('2020-03-18');
시스템 함수
SELECT SLEEP(3);
SELECT
a.*
FROM
tb_member a,(SELECT SLEEP(3)) b;
n초 뒤에 결과 반환
MySQL 변수
SET @myNumber1 = 1;
SET @myNumber2 = 2.3;
SET @myStr1 = '합계:';
SELECT
@myNumber1 AS '변수1'
,@myNumber2 AS '변수2';
SELECT
@myStr1
,@myNumber1 + @myNumber2) AS '합계';
SELECT
@myStr1
,ROUND((@myNumber1 + @myNumber2), 3) AS '합계';
SELECT 문 조건 연산자
비교 연산자 | 논리 연산자 | ||
연산자 | 의미 | 연산자 | 의미 |
= | 같다 | AND | 모든 조건을 만족해야 검색 |
<> | 다르다 | OR | 여러 조건 중 한가지만 만족해도 검색 |
< | 작다 | NOT | 조건을 만족하지 않는 것만 검색 |
> | 크다 | ||
<= | 작거나 같다 | ||
>= | 크거나 같다 |
SELECT 문 조건 LIKE 키워드
사용 예 | 설명 |
LIKE '데이터%' | '데이터'로 시작하는 문자열 (길이는 상관 없다.) |
LIKE '%데이터' |
'데이터'로 끝나는 문자열 (길이는 상관 없다.) |
LIKE '%데이터%' | '데이터'가 포함된 문자열 |
LIKE '데이터____' | 데이터로 시작하는 7자 길이의 문자열 |
LIKE '__데%' | 세번째 글자가 '데'인 문자열 |
SQL JOINS
INNER JOIN
SELECT
m.m_id AS '회원 아이디'
,m.m_name AS '회원 이름'
,l.level_name AS '회원 권한'
FROM
tb_member m
INNER join
tb_member_level l
on
m.m_level = l.level_num
WHERE
l.level_name LIKE '%판매%';
'Database' 카테고리의 다른 글
[Database] 데이터베이스 설계 (0) | 2020.03.25 |
---|---|
[Database] join (0) | 2020.03.25 |
[Database] SQL 활용 ① (3) | 2020.03.18 |
[Database] MySQL 실습 (0) | 2020.03.11 |