INSERT
/*
연습문제
INSERT 문을 사용하여
학과 / 학생 테이블에 다음과 같이 데이터 입력
SELECT 문으로 조회
*/
-- 학과 테이블 생성
CREATE TABLE department(
dptNo VARCHAR(10) NOT NULL PRIMARY KEY,
dptName VARCHAR(30) NOT NULL,
dptTel VARCHAR(13)
);
-- 학생 테이블 생성
CREATE TABLE student (
stdNo VARCHAR(10) NOT NULL PRIMARY KEY,
stdName VARCHAR(30) NOT NULL,
stdYear INT DEFAULT 4 CHECK(stdYear >= 1 AND stdYear <= 4),
stdAddress VARCHAR(50),
stdBirthDay DATE,
dptNo VARCHAR(10) NOT NULL,
CONSTRAINT FK_student_department FOREIGN KEY (dptNo) REFERENCES department (dptNo)
);
INSERT INTO department (dptNo, dptName, dptTel)
VALUES ('1', '컴퓨터학과', '02-1111-1111'),
('2', '경영학과', '02-2222-2222'),
('3', '수학과', '02-7777-7777');
SELECT * FROM department;
INSERT INTO student (stdNo, stdName, stdYear, stdAddress, stdBirthDay, dptNo)
VALUES ('2018002', '이몽룡', 4, '서울시 강남구', '1998-05-07', '1'),
('2019003', '홍길동', 3, '경기도 안양시', '1999-11-11', '2'),
('2021003', '성춘향', 1, '전라북도 남원시', '2002-01-02', '3'),
('2021004', '변학도', 1, '서울시 종로구', '2000-11-11', '2');
SELECT * FROM student;
DML - 1
/*
연습문제
1. book 테이블에 다음과 같이 행 삽입
(출판사 데이터는 테이블 구조에 맞게 입력) - 9번 10번으로 입력
2. book 테이블에서 도서명이 '자바'인 행의 가격을 22000으로 변경
3. book 테이블에서 발행일이 2018년도인 행 삭제
*/
-- 1. book 테이블에 다음과 같이 행 삽입 (출판사 데이터는 테이블 구조에 맞게 입력)
INSERT INTO book (bookNo, bookName, bookPrice, bookDate, pubNo)
VALUES ('9', 'JAVA 웹프로그래밍', 30000, '2021-03-10', '1'),
('10', '파이썬 데이터 과학', 24000, '2018-02-05', '2');
-- 2. book 테이블에서 도서명이 '자바'인 행의 가격을 22000으로 변경
UPDATE book SET bookPrice=22000 WHERE bookName='자바';
-- 3. book 테이블에서 발행일이 2018년도인 행 삭제
DELETE FROM book
WHERE bookDate >= '2018-01-01' AND bookDate <= '2018-12-31';
DML - 2
/*
종합 연습문제
다음과 같이 SQL 문 작성
1. 고객 테이블 (customer) 생성
2. 고객 테이블의 전화번호 열을 NOT NULL로 변경
3. 고객 테이블에 ‘성별’, ‘나이’ 열 추가
4. 고객 테이블에 데이터 삽입 (3개)
5. 고객명이 홍길동인 고객의 전화번호 값 수정 (값은 임의로)
6. 나이가 20살 미만인 고객 삭제
*/
-- 1. 고객 테이블 (customer) 생성
CREATE TABLE customer(
custNo VARCHAR(10) NOT NULL PRIMARY KEY,
custName VARCHAR(30),
custPhone VARCHAR(13),
custAddress VARCHAR(50)
);
-- 2. 고객 테이블의 전화번호 열을 NOT NULL로 변경
ALTER TABLE customer MODIFY custPhone VARCHAR(13) NOT NULL;
DESCRIBE customer;
-- 3. 고객 테이블에 ‘성별’, ‘나이’ 열 추가
ALTER TABLE customer ADD (custGender VARCHAR(1), custAge INT);
DESCRIBE customer;
-- 4. 고객 테이블에 데이터 삽입 (3개)
INSERT INTO customer (custNo, custName, custPhone, custAddress, custGender, custAge)
VALUES ('1001', '홍길동', '010-1111-1111', '강원도 평창', '남', 25),
('1002', '이몽룡', '010-2222-2222', '서울 종로구', '남', 15),
('1003', '성춘향', '010-3333-3333', '서울시 강남구', '여', 27);
SELECT * FROM customer;
-- 5. 고객명이 홍길동인 고객의 전화번호 값 수정 (값은 임의로)
UPDATE customer SET custPhone='010-1234-1234' WHERE custName='홍길동';
SELECT * FROM customer;
-- 6. 나이가 20살 미만인 고객 삭제
DELETE FROM customer WHERE custAge < 20;
SELECT * FROM customer;
SELECT - 1
-- 연습문제
-- 1. 고객 테이블에서 고객명, 생년월일, 성별 출력
SELECT clientName, clientBirth, clientGender FROM client;
-- 2. 고객 테이블에서 주소만 검색하여 출력 (중복되는 주소는 한번만 출력)
SELECT DISTINCT clientAddress FROM client;
SELECT clientAddress FROM client;
-- 3. 고객 테이블에서 취미가 '축구'이거나 '등산'인 고객의 고객명, 취미 출력
SELECT clientName, clientHobby
FROM client
WHERE clientHobby = '축구' OR clientHobby = '등산';
-- 4. 도서 테이블에서 저자의 두 번째 위치에 '길'이 들어 있는 저자명 출력
-- (중복되는 저자명은 한번만 출력)
SELECT DISTINCT bookAuthor FROM book
WHERE bookAuthor LIKE '_길%';
-- 5. 도서 테이블에서 발행일이 2019년인 도서의 도서명, 저자, 발행일 출력
SELECT bookName, bookAuthor, bookDate FROM book
WHERE bookDate LIKE '2019%';
-- 6. 도서판매 테이블에서 고객번호1, 2를 제외한 모든 판매 데이터 출력
SELECT* FROM bookSale
WHERE clientNo NOT IN('1', '2');
-- 7. 고객 테이블에서 취미가 NULL이 아니면서
-- 주소가 '서울'인 고객의 고객명, 주소, 취미 출력
SELECT clientName, clientAddress, clientHobby FROM client
WHERE clientHobby IS NOT NULL AND clientAddress LIKE '%서울%';
SELECT clientName, clientAddress, clientHobby FROM client
WHERE clientAddress LIKE '%서울%';
-- '천안'으로 한 경우 결과 다르게 출력
SELECT clientName, clientAddress, clientHobby FROM client
WHERE clientHobby IS NOT NULL AND clientAddress LIKE '%천안%';
SELECT clientName, clientAddress, clientHobby FROM client
WHERE clientAddress LIKE '%천안%';
-- 8. 도서 테이블에서 가격이 25000원 이상이면서
-- 저자 이름에 '길동'이 들어가는 도서의 도서명, 저자, 가격, 재고 출력
SELECT bookName, bookPrice, bookAuthor, bookStock FROM book
WHERE bookPrice >= 25000 AND bookAuthor LIKE '%길동';
-- 9. 도서 테이블에서 가격이 20,000 ~ 25,000원인 모든 도서 출력
SELECT * FROM book
WHERE bookPrice BETWEEN 20000 AND 25000;
-- 10. 도서 테이블에서 저자명에 '길동'이 들어 있지 않는 도서의 도서명, 저자 출력
SELECT bookName, bookAuthor FROM book
WHERE bookAuthor NOT LIKE '%길동%';
SELECT - 2
-- 1. 도서 테이블에서 가격 순으로 내림차순 정렬하여,
-- 도서명, 저자, 가격 출력.
-- (가격이 같으면 저자 순으로 오름차순 정렬)
SELECT bookName, bookAuthor, bookPrice
FROM book
ORDER BY bookPrice DESC, bookAuthor ASC;
-- 2. 도서 테이블에서 저자에 '길동'이 들어가는 도서의
-- 총 재고 수량 계산하여 출력
SELECT SUM(bookStock) AS "총 재고 수량"
FROM book
WHERE bookAuthor LIKE '%길동%';
-- 3. 도서 테이블에서 '서울 출판사' 도서 중 최고가와 최저가 출력
SELECT MAX(bookPrice) AS "최고가", MIN(bookPrice) AS "최저가"
FROM book
WHERE pubNo = '1';
-- 4. 도서 테이블에서 출판사별로 '총 재고 수량'과 '평균 재고 수량' 계산하여 출력
-- 총 재고 수량"으로 내림차순 정렬
SELECT pubNo, SUM(bookStock) AS 총재고수량,
AVG(bookStock) AS '평균 재고 수량'
FROM book
GROUP BY pubNo
ORDER BY 총재고수량 DESC;
-- 주의!! : MySQL에서는 ORDER BY 다음의 열이름에 따옴표 있으면 안 됨
SELECT pubNo, SUM(bookStock) AS '총재고수량',
AVG(bookStock) AS '평균 재고 수량'
FROM book
GROUP BY pubNo
ORDER BY '총재고수량' DESC; -- 따옴표 있으면 정렬 안 됨
-- 열이름 대신 숫자 사용
SELECT pubNo, SUM(bookStock) AS '총재고수량',
AVG(bookStock) AS '평균 재고 수량'
FROM book
GROUP BY pubNo
ORDER BY 2 DESC;
-- 5. 도서판매 테이블에서 고객별로(그룹화:기본키(외래키))
-- '총 주문 수량'과 '총 주문 건수' 출력. 단 주문 건수가 2이상인 고객만 해당.
SELECT clientNo, COUNT(*) AS "총 주문 건수", SUM(bsQty) AS "총 주문 수량"
FROM bookSale
GROUP BY clientNo
HAVING COUNT(*) >= 2;
JOIN
-- 연습문제
-- 1. 모든 도서에 대하여 도서의 도서번호, 도서명, 출판사명 출력
SELECT B.bookNo, B.bookName, b.bookauthor, P.pubName
FROM book B
INNER JOIN publisher P ON B.pubNo = P.pubNo ;
-- 2. '서울 출판사'에서 출간한 도서의 도서명, 저자명, 출판사명 출력
-- (조건에 출판사명 사용)
SELECT B.bookName, B.bookAuthor, P.pubName
FROM book B
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '서울 출판사';
-- 3. '종로출판사'에서 출간한 도서 중 판매된 도서의 도서명 출력
-- 중복된 경우 한 번만 출력 (조건에 출판사명 사용)
SELECT DISTINCT B.bookName, P.pubName
FROM book B
INNER JOIN publisher P ON B.pubNo = P.pubNo
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
WHERE P.pubName = '종로출판사';
-- 4. 도서가격이 30,000원 이상인 도서를 주문한 고객의
-- 고객명, 도서명, 도서가격, 주문수량 출력
SELECT C.clientName, B.bookName, B.bookPrice, BS.bsQty
FROM bookSale BS
INNER JOIN client C ON C.clientNo = BS.clientNo
INNER JOIN book B ON B.bookNo = BS.bookNo
WHERE B.bookPrice >= 30000;
-- 5. '안드로이드 프로그래밍' 도서를 구매한 고객에 대하여
-- 도서명, 고객명, 성별, 주소 출력 (고객명으로 오름차순 정렬)
SELECT b.bookName, c.clientName, c.clientGender, c.clientAddress
FROM bookSale BS
INNER JOIN client C ON C.clientNo = BS.clientNo
INNER JOIN book B ON B.bookNo = BS.bookNo
WHERE bookName = '안드로이드 프로그래밍'
ORDER BY clientName;
SELECT * FROM bookSale;
SELECT * FROM client;
SELECT * FROM book;
-- 6. '도서출판 강남'에서 출간된 도서 중 판매된 도서에 대하여
-- '총 매출액' 출력
SELECT SUM(B.bookPrice * BS.bsQty) AS "총 매출액"
FROM book B
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '도서출판 강남';
-- 집계 함수 앞에 열을 출력할 경우
SELECT P.pubName, SUM(B.bookPrice * BS.bsQty) AS "총 매출액"
FROM book B
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '도서출판 강남'
GROUP BY P.pubNo;
-- 각 매출 건수 출력
SELECT P.pubName, B.bookPrice * BS.bsQty AS "매출액"
FROM book B
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '도서출판 강남';
-- 7. '서울 출판사'에서 출간된 도서에 대하여
-- 판매일, 출판사명, 도서명, 도서가격, 주문수량, 주문액 출력
SELECT BS.bsDate, P.pubName, B.bookName, B.bookPrice,
BS.bsQty, B.bookPrice * BS.bsQty AS "판매액"
FROM book B
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '서울 출판사';
-- 8. 판매된 도서에 대하여
-- 도서별로 도서번호, 도서명, '총 주문 수량' 출력
SELECT B.bookNo, B.bookName, SUM(BS.bsQty) AS "총 주문 수량"
FROM book B
INNER JOIN bookSale BS ON B.bookNo = BS.bookNo
GROUP BY B.bookNo;
SELECT * FROM bookSale;
-- 9. 판매된 도서에 대하여
-- 고객별로 고객명, 총구매액 출력
-- 총구매액이 100,000원 이상인 경우만 해당
SELECT C.clientName, SUM(B.bookPrice * BS.bsQty) AS "총구매액"
FROM bookSale BS
INNER JOIN client C ON C.clientNo = BS.clientNo
INNER JOIN book B ON B.bookNo = BS.bookNo
GROUP BY C.clientNo
HAVING SUM(B.bookPrice * BS.bsQty) >= 100000;
-- HAVING 조건 없는 경우 고객별 총구매 내역
SELECT C.clientName, SUM(B.bookPrice * BS.bsQty) AS "총구매액"
FROM bookSale BS
INNER JOIN client C ON C.clientNo = BS.clientNo
INNER JOIN book B ON B.bookNo = BS.bookNo
GROUP BY C.clientNo;
SELECT * FROM bookSale;
-- 10. 판매된 도서 중 '도서출판 강남'에서 출간한 도서에 대하여
-- 고객명, 주문일, 도서명, 주문수량, 출판사명 출력
-- 고객명으로 오름차순 정렬
-- 4개 테이블 : 외래키 제약조건 3개
SELECT C.clientName, BS.bsDate, B.bookName, BS.bsQty, P.pubName
FROM bookSale BS
INNER JOIN client C ON C.clientNo = BS.clientNo
INNER JOIN book B ON B.bookNo = BS.bookNo
INNER JOIN publisher P ON B.pubNo = P.pubNo
WHERE P.pubName = '도서출판 강남'
ORDER BY C.clientName;
'Database > MySQL' 카테고리의 다른 글
[연습문제] JOIN (0) | 2021.11.27 |
---|---|
ORDER BY - 한글 영문 숫자 / 영문 한글 숫자 순서로 정렬 (0) | 2021.11.27 |
csv 파일 import 시 주의사항 (0) | 2021.11.27 |
[연습문제] DDL_ALTER (0) | 2021.11.27 |
[DDL] 기본키 제약 조건을 설정하는 다양한 방법 (0) | 2021.11.27 |