-- 만약 market_db가 존재하면 우선 삭제하기
DROP DATABASE IF EXISTS market_db;
-- market_db 생성하기
CREATE DATABASE market_db;
-- market_db 사용하기
USE market_db;
TABLE 생성하기(member, buy)
-- 회원 Table
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원수
addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
phone1 CHAR(3), -- 연락처의 국번(02, 031, 055 등)
phone2 CHAR(8), -- 연락처의 나머지 전화번호(- 제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔 일자
);
-- 구매 Table
CREATE TABLE buy
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
mem_id CHAR(8) NOT NULL, -- 아이디(FK)
prod_name CHAR(6) NOT NULL, -- 제품이름
group_name CHAR(4), -- 분류
price INT NOT NULL, -- 가격
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES member(mem_id) -- 회원 Table의 mem_id와 FK 설정
);
Data INSERT하기
-- member Table
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO member VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, '2016.08.08');
INSERT INTO member VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, '2015.01.15');
INSERT INTO member VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, '2015.04.21');
INSERT INTO member VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, '2007.08.02');
INSERT INTO member VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, '2019.02.12');
INSERT INTO member VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, '2014.08.01');
INSERT INTO member VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, '2011.02.10');
INSERT INTO member VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, '2016.02.25');
INSERT INTO member VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, '2014.06.19');
-- buy Table
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', '혼공SQL', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);
기본 SELECT문
SELECT 칼럼명 FROM Table명; // SELECT 칼럼명 FROM Database명.Table명;
SELECT 칼럼명 FROM Table명 WHERE 조건;
WHERE 조건 없이 SELECT하기
-- member Table 조회하기
-- 전체 칼럼 조회하기
SELECT * FROM member;
-- mem_name 칼럼만 조회하기
SELECT mem_name FROM member;
-- addr, debut_date, mem_name 칼럼 조회하기
SELECT addr, debut_date, mem_name FROM member;
-- addr, debut_date, mem_name 칼럼 조회하기
/*
alias 사용하기
- AS 사용
- 바로 별칭 입력
- "별칭" 입력
*/
SELECT addr 주소, debut_date "데뷔 일자", mem_name as 이름 FROM member;
WHERE 조건 사용하기
-- mem_name 칼럼으로 조건 추가하기
SELECT * FROM member WHERE mem_name = '블랙핑크';
-- mem_number 칼럼으로 조건 추가하기
SELECT * FROM member WHERE mem_number = 4;
관계연산자, 논리연산자 사용
-- 관계연산자 <= 사용하여 mem_id, mem_name 칼럼만 조회하기
SELECT mem_id, mem_name
FROM member
WHERE height <= 162;
-- AND 연산자 사용하여 mem_name, height, mem_number 칼럼만 조회하기
SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;
-- OR 연산자 사용하여 mem_name, height, mem_number 칼럼만 조회하기
SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 OR mem_number > 6;
BETWEEN ~ AND
-- 관계연산자 >=, <=와 AND 연산자 사용하여 mem_name, height 칼럼만 조회하기
SELECT mem_name, height
FROM member
WHERE height >= 163 AND height <= 165;
-- 위의 코드를 BETWEEN 사용하여 mem_name, height 칼럼만 조회하기
SELECT mem_name, height
FROM member
WHERE height BETWEEN 163 AND 165;
IN()
-- OR 연산자 여러 개 사용하여 mem_name, addr 칼럼만 조회하기
SELECT mem_name, addr
FROM member
WHERE addr = '경기' OR addr = '전남' OR addr = '경남';
-- 위의 코드를 IN() 사용하여 mem_name, addr 칼럼만 조회하기
SELECT mem_name, addr
FROM member
WHERE addr IN('경기', '전남', '경남');
LIKE
-- % 사용하기
/*
LIKE '우%'
- 검색하는 칼럼의 데이터에서
- 맨 앞글자는 '우'
- 그 뒷글자는 무엇이든 허용 가능함.
예시) '우주소녀'
*/
SELECT *
FROM member
WHERE mem_name LIKE '우%';
-- _ 사용하기
/*
LIKE '__핑크'
- 검색하는 칼럼의 데이터에서
- 앞 두 글자는 무엇이든 상관없음
- 맨 뒤 2글자는 '핑크'만 허용함.
예시) '에이핑크', '블랙핑크'
*/
SELECT *
FROM member
WHERE mem_name LIKE '__핑크';
추가 SELECT문
기본 문법
SELECT 칼럼명 FROM 테이블명
WHERE 조건식
GROUP BY 칼럼명 HAVING 조건식
ORDER BY 칼럼명
LIMIT 숫자
-- ASC(오름차순) / DESC(내림차순)
ORDER BY
예시 SQL문
-- debut_date가 빠른 순서대로 출력하기
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date;
-- debut_date가 늦은 순서대로 출력하기
SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date DESC;
-- -----------------------------------------------------------
-- 오류나는 상황 확인하기
-- SELECT ~ FROM ~ WHERE 후에 GROUP BY나 ORDER BY 사용하기
-- -----------------------------------------------------------
-- 오류 발생
SELECT mem_id, mem_name, debut_date, height
FROM member
ORDER BY height DESC
WHERE height >= 164;
-- 오류 해결
SELECT mem_id, mem_name, debut_date, height
FROM member
WHERE height >= 164
ORDER BY height DESC;
LIMIT : 출력의 개수를 제한하기
-- 3개의 결과만 출력하기
SELECT * FROM member
LIMIT 3;
-- ORDER BY를 한 결과에서 3개만 출력하기
SELECT mem_name, debut_date FROM member
ORDER BY debut_date
LIMIT 3;
-- ORDER BY를 한 결과 3번째부터 4개만 출력하기
-- ※ 0부터 시작하기 때문에 3번째가 2임.
SELECT mem_name, debut_date FROM member
ORDER BY debut_date
LIMIT 2,4;
DISTINCT : 중복된 결과를 제거하기
-- addr만 출력
SELECT addr FROM member;
-- addr 기준으로 정렬해서 출력
SELECT addr FROM member ORDER BY addr;
-- addr 데이터 중에서 중복된 데이터 제거 후 출력
SELECT DISTINCT addr FROM member;
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액" FROM buy
GROUP BY mem_id
-- HAVING 사용 시에는 칼럼명 중 Alias 앞에 부분을 모두 입력해줘야 한다!
-- HAVING은 GROUP BY 뒤에 사용해야 함.
HAVING SUM(price*amount) > 1000;
INSERT / UPDATE / DELETE
INSERT
INSERT INTO 테이블명 (칼럼명) VALUES (값)
-- 칼럼명 적지 않고 INSERT하기
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
-- 칼럼명 적고 INSERT하기
INSERT INTO member(mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date)
VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
UPDATE
UPDATE 테이블명 SET 칼럼명=값 WHERE 조건;
-- city_name이 Seoul -> 서울
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
-- city_name이 New York -> 뉴욕
-- city_name이 New York인 데이터에서 population을 0으로 변경
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
DELETE
DELETE FROM 테이블 WHERE 조건;
-- 'New' 글자로 시작하는 도시 삭제하기
DELETE FROM city_popul
WHERE city_name LIKE 'New%';
p.138 ~ p.139 확인문제
1. SELECT문에서 사용되는 절
SELECT -> FROM -> WHERE -> ORDER BY -> LIMIT;
2 -1. SELECT * FROM member ORDER BY height;
2 -1. SELECT * FROM member LIMIT 5,2;
2 -1. SELECT DISTINCT phone1 FROM member;
3. ORDER BY 절에서 오름차순을 위한 예약어는 ASC이고, 내림차순을 위한 예약어는 DESC다.
4. LIMIT에 대한 문법 -> LIMIT 0,3,5는 문법에 어긋남.
5. DISTINCT
조회된 결과에서 중복된 것은 한 개만 남기며, SELECT문의 열 이름 앞에 붙여준다.
6. GROUP BY의 집계 함수
HAVING()은 WHERE 조건과 유사함. // GROUP BY와 같이 사용됨. // 집계함수가 아님.