DML
(Data Manuplation Language)DDL
(Data Definition Language)DCL
(Data Conrtol Language)SELECT 구문의 구조
-- 집계함수(SUM(), COUNT(), MAX(), MIN(), AVG))
-- 전체 구매자가 구매한 물품 개수의 평균은 얼마인가요?
SELECT AVG(amount)
FROM buyTBL;
-- 각 사용자별로 한번 구매시 물건을 평균 몇 개 구매했는지 조회하세요!
SELECT userID, AVG(amount) AS '평균 구매 개수'
FROM buyTBL
GROUP BY userID;
-- 가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력하세요!(userTBL)
-- 문제가 어려우면 subQuery로 생각을 좀 전환해보세요!
SELECT name, height
FROM userTBL
WHERE height = (
SELECT MAX(height) FROM userTBL
) OR height = (
SELECT MIN(height) FROM userTBL
);
-- 사용자별 총 구매금액이 1,000 이상인 사용자만 출력하세요!
SELECT userID, sum(price*amount) AS '총 구매 금액'
FROM buytbl
GROUP BY userID
HAVING sum(price*amount) >= 1000; -- HAVING은 그룹에 대한 조건!, WHERE절에는 집계함수가 올 수 없다!
WHY? 왜 Transaction을 설정하나요??
ACID
“이체”라는 작업
⇒ 4가지 작업이 일련으로 진행되면서 이체가 수행된다.
Transaction 설정
USE sqldb;
CREATE TABLE testtbl1 (
id INT,
userName CHAR(3),
age INT
);
SELECT * FROM testtbl1;
-- 일반적인 Insert 구문
INSERT INTO testtbl1 VALUES(1, '홍길동', 25);
-- 필요한 것만 선택해서 데이터 입력
INSERT INTO testtbl1(id, userName) VALUES (2, '이순신');
-- 순서 맞출 필요 없어요!
INSERT INTO testtbl1(userName, id) VALUES ('강감찬', 3);
-- auto_increment: 숫자형식만 가능. PRIMARY KEY, UNIQUE
CREATE TABLE testtbl2 (
id INT AUTO_INCREMENT PRIMARY KEY, -- id는 자동으로 증가
userName CHAR(3),
age INT
);
SELECT * FROM testtbl2;
INSERT INTO testtbl2 VALUES(NULL, '홍길동', 25);
INSERT INTO testtbl2 VALUES(NULL, '김길동', 30);
ALTER TABLE testtbl2 AUTO_INCREMENT = 100;
INSERT INTO testtbl2 VALUES(NULL, '최길동', 28);
SET @@auto_increment_increment = 5; -- @@는 환경변수. default는 1인데 5로 변경함.
INSERT INTO testtbl2 VALUES(NULL, '박길동', 60);
START TRANSACTION;
-- UPDATE 구문
UPDATE testtbl3
SET lname = '없음'
WHERE fname = 'Kyoichi';
SELECT * FROM testtbl3 WHERE fname = 'Kyoichi';
ROLLBACK;
-- DELETE 구문
DELETE
FROM testtbl3
WHERE fname = 'Kyoichi'
LIMIT 100;
INT
: 4byte → -21억 ~ +21억BIGINT
: 8byte → -900경 ~ +900경FLOAT
: 4byte → 소수점 7자리 정도까지 표현(명확한 실수값이 아닌 근사값으로 저장)DOUBLE
: 8byte → 소수점 14자리 정도까지 표현(명확한 실수값이 아닌 근사값으로 저장)DECIMAL
: 전체 자리수와 소수점 자리수를 정할 수 있다.CHAR
: 고정 길이(1~255)
VARCHAR
: 가변 길이(1~65535)
LONGTEXT
: 48
LONGBLOB
: (long bynary objcet)
💡 CLOB, BLOB → 일반적인 용어임
C: Character
B: Bynary
LOB: Large Object
CREATE DATABASE moviedb;
USE moviedb;
CREATE TABLE movieTBL (
movie_id INT,
movie_title VARCHAR(30),
movie_script LONGTEXT,
movie_film LONGBLOB
) DEFAULT CHARSET=utf8mb4;
-- 데이터를 입력 !
INSERT INTO movieTBL VALUES(1, '쉰들러 리스트',
LOAD_FILE('/Users/eun/Downloads/Schindler.txt'),
LOAD_FILE('/Users/eun/Downloads/Schindler.mp4')
);
SELECT * FROM movieTBL;
-- 환경설정이 안되었기 때문에 정상적으로 동작하지 않는다.
-- 설정을 하고 오자.
-- 다시 실행하면 정상적으로 insert가 수행된다.
DELETE FROM movieTBL;
-- 이미 저장되어 있는 대용량의 데이터를 다운로드 하려면
SELECT movie_film
FROM movieTBL
WHERE movie_id=1
INTO DUMPFILE '/Users/eun/Downloads/Schindler1.mp4';
Inner Join
Outer Join
: JOIN 조건을 만족하지 않는 행도 포함Self Join
Cross Join
USE sqldb;
-- 구매 테이블에서 'JYP'라는 아이디를 가진 사람이 구매한 물건을
-- 발송하기 위해서 이름과 주소가 필요해요! 이 정보는 userTBL에 존재해요!
-- 두 테이블을 결합해서 결과를 알아내야 해요!
-- 표준방식
SELECT B.userID, name, addr
FROM buyTBL B
INNER JOIN userTBL U
ON B.userID = U.userID
WHERE B.userID = 'JYP';
SELECT buyTBL.userID, name, addr
FROM buyTBL, userTBL
WHERE buyTBL.userID = userTBL.userID;
-- 간단한 예제
USE sqldb;
-- 학생 테이블 생성
CREATE TABLE stdTBL(
std_name VARCHAR(10) NOT NULL PRIMARY KEY, -- 학생 이름
std_addr VARCHAR(4) NOT NULL -- 학생 주소
);
-- 동아리 테이블 생성
CREATE TABLE clubTBL(
club_name VARCHAR(10) NOT NULL PRIMARY KEY, -- 동아리 이름
club_room VARCHAR(4) NOT NULL -- 동아리 방번호
);
-- 학생 동아리 테이블 생성
CREATE TABLE stdclubTBL(
num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 인덱스
std_name VARCHAR(10) NOT NULL, -- 학생 이름
club_name VARCHAR(10) NOT NULL, -- 동아리 이름
FOREIGN KEY(std_name) REFERENCES stdTBL(std_name), -- FK 설정
FOREIGN KEY(club_name) REFERENCES clubTBL(club_name) -- FK 설정
);
-- 데이터 입력
INSERT INTO stdTBL VALUES('김범수', '경남');
INSERT INTO stdTBL VALUES('성시경', '서울');
INSERT INTO stdTBL VALUES('조용필', '경기');
INSERT INTO stdTBL VALUES('은지원', '경북');
INSERT INTO stdTBL VALUES('바비킴', '서울');
INSERT INTO clubTBL VALUES('수영', '101호');
INSERT INTO clubTBL VALUES('바둑', '102호');
INSERT INTO clubTBL VALUES('축구', '103호');
INSERT INTO clubTBL VALUES('봉사', '104호');
INSERT INTO stdclubTBL VALUES (NULL, '김범수', '바둑');
INSERT INTO stdclubTBL VALUES (NULL, '김범수', '축구');
INSERT INTO stdclubTBL VALUES (NULL, '조용필', '축구');
INSERT INTO stdclubTBL VALUES (NULL, '은지원', '축구');
INSERT INTO stdclubTBL VALUES (NULL, '은지원', '봉사');
INSERT INTO stdclubTBL VALUES (NULL, '바비킴', '봉사');
-- 학생을 기준으로 학생이름, 지역, 가입한 동아리, 동아리방번호를 출력하세요!
SELECT S.std_name, S.std_addr, SC.club_name, C.club_room
FROM stdTBL S
INNER JOIN stdclubTBL SC
ON S.std_name = SC.std_name
INNER JOIN clubTBL C
ON SC.club_name = C.club_name
ORDER BY S.std_name;
-- userTBL과 buyTML을 이용해서 다음을 구해보아요!
-- 전체 회원의 구매기록을 조회하세요. 단 구매 기록이 없는 회원도 출력되어야 한다.
SELECT U.userId, U.name, B.ProdName, U.addr
FROM userTBL U
LEFT OUTER JOIN buyTBL B
ON U.userId = B.userId
ORDER BY U.userId;
-- 한번도 구매한 적이 없는 회원의 목록을 출력하세요!
SELECT U.userId, U.name, B.ProdName, U.addr
FROM userTBL U
LEFT OUTER JOIN buyTBL B
ON U.userId = B.userId
WHERE B.ProdName IS NULL
ORDER BY U.userId;