🚩실습용 데이터 구축
1) 데이터 베이스 만들기
한빛미디어 사이트의 혼공자료실에서 market_db.sql파일을 다운로드한 후 SQL에서 market_db 데이터베이스를 열어서 member1, buy2 테이블을 확인
위와 같은 데이터베이스와 테이블을 직접 코딩해서 만들어보기
(1) 기존 market_db 삭제하고 market_db만들기
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;
(2) memeber 테이블 형태만 만들기
USE market_db;
CREATE TABLE member -- 회원 테이블(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), -- 연락처의 국번
phone2 CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
height SMALLINT, -- 평균키
debut_date DATE -- 데뷔 일자
);
(3) buy 테이블 형태만 만들기
USE market_db;
CREATE TABLE buy -- 구매 테이블(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)
);
(4) 데이터 입력 후 확인
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
※ CHAR, VARCHAR, DATE형은 작은따옴표로 값을 묶어줌.
buy 테이블의 첫 번째 열인 num은 자동으로 입력되므로 그 자리에는 NULL이라고 적어줌.
SELECT * FROM member;
SELECT * FROM buy;
USE market_db;
SELECT * FROM member;
데이터베이스를 USE문으로 지정 후 member테이블의 모든 열 추출
SELECT * FROM member.market_db;
USE문 이용하지 않았을때 테이블.데이터베이스이름 으로도 가능.
SELECT addr 주소, debut_date "데뷔 일자", mem_name FROM member;
member테이블에서 일부 열을 추출하는데 별칭(alias)를 지정해줌.
별칭에 공백이 있으면 큰따옴표로 묶어줄 것!
SELECT 열이름 FROM 테이블이름 WHERE 조건식;
이름이 블랙핑크인 결과만 출력
SELECT * FROM member WHERE mem_name = '블랙핑크';
SELECT mem_name, height, mem_number FROM member WHERE height >= 165 and mem_number > 6;
SELECT mem_name, height FROM member WHERE height BETWEEN 163 AND 165;
👉 숫자의 범위를 조건식에서 사용할땐 BETWEEN~AND 쓸 것.
SELECT mem_name, addr FROM member WHERE addr IN('경기', '전남', '경남');
👉 여러 문자 중 하나에 포함되는지를 알아볼 땐 IN() 쓸 것.
SELECT * FROM member WHERE mem_name LIKE '우%';
👉 문자열의 일부 글자를 검색하려면 LIKE 쓸 것.
SELECT * FROM member WHERE mem_name LIKE '__핑크';
👉 한 글자랑 매치하기 위해서는 언더바(_) 쓸 것.
🔸서브쿼리(하위쿼리) : SELECT 안에 또다른 SELECT가 들어 갈때, 두 개의 SELECT문을 하나로!
ex) 이름이 '에이핑크'인 회원의 평균 키보다 큰 회원을 출력
SELECT * FROM member WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');
💡SELECT문 기본 공식 (순서중요!)
SELECT 열이름
FROM 테이블이름
WHERE 조건식
GROUP BY 열이름
HAVING 조건식
ORDER BY 열이름
LIMIT 숫자;
✔️ ORDER BY : 결과가 출력되는 순서를 조절. 오름차순은 ASC(기본), 내림차순은 DESC
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date;
SELECT mem_id, mem_name, debut_date FROM member ORDER BY debut_date DESC;
SELECT mem_id, mem_name, height, debut_date FROM MEMBER ORDER BY height, debut_date DESC;
주의) ORDER BY height and debut_date DESC는 다른 결과 나옴..
SELECT * FROM member ORDER BY height DESC LIMIT 3, 2;
LIMIT 시작, 개수 로 몇 건 추출 / LIMIT 3 = LIMIT 0, 3
SELECT DISTINCT addr FROM member;
✔️ GROUP BY : 데이터를 그룹으로 묶어줌. 집계함수와 주로 같이 이용.
함수명 | 설명 |
---|---|
SUM() | 합계 |
AVG() | 평균 |
MIN() | 최소값 |
MAX() | 최대값 |
COUNT(*) | 모든 행의 개수 세어줌. |
COUNT(열이름) | 열이름 값이 NULL인 것을 제외한 행의 개수 세어줌. |
SELECT mem_id, SUM(amount) FROM buy GROUP BY mem_id;
별칭을 이용하여 좀 더 보기 편하게 한다면,
SELECT mem_id "회원이름", SUM(amount) "총 구매 개수" FROM buy GROUP BY mem_id;
SELECT mem_id, SUM(amount), SUM(amount * price) FROM buy GROUP BY mem_id;
SELECT mem_id, SUM(amount price) FROM buy GROUP BY mem_id HAVING SUM(amount price) > 1000;
HAVING : 집계함수에 대한 조건을 제한하며, GROUP BY뒤에 나와야 함!
SELECT mem_id, SUM(amount price) FROM buy GROUP BY mem_id HAVING SUM(amount price) > 1000 ORDER BY SUM(amount * price) DESC;
🎈 p.138 확인문제
2. 다음 보기 중에서 각 문항의 빈칸에 들어갈 것을 고르세요.
답 :
(1) ORDER BY
(2) LIMIT
(3) DISTINCT
✔️ INSERT : 테이블에 데이터를 삽입하는 명령
INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
주의) 열은 생략가능 / 열 순서 바꿔서 데이터 입력 가능
toy_id랑 toy_name만 입력
USE market_db;
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈');
자동으로 증가하는 AUTO_INCREMENT
주의) Primary Key로 지정된 열만 가능
toy_id열은 자동증가로 설정
USE market_db;
CREATE TABLE hongong2 (toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT);
INSERT INTO hongong2 VALUES(NULL, '보핍', 25);
INSERT INTO hongong2 VALUES(NULL, '슬링키', 22);
INSERT INTO hongong2 VALUES(NULL, '렉스', 21);
SELECT * FROM hongong2;
CREATE TABLE hongong3(
toy_id INT AUTO_INCREMENT PRIMARY KEY,
toy_name CHAR(4),
age INT);
ALTER TABLE hongong3 AUTO_INCREMENT = 1000; -- 1000부터 시작하도록 테이블 변경
SET @@auto_increment_increment = 3; -- 증가값을 3으로 지정
여기서, 시스템 변수 : MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수로, @@이 앞에 붙고, "SELECT @@시스템변수"로 확인 가능
DESC world.city;
(1) 도시 이름, 인구를 새 테이블로 옮기기 위해 테이블부터 만들기
CREATE TABLE city_popul (city_name CHAR(35), population INT);
(2) 만들어진 테이블에 도시 이름, 인구 데이터 옮기기
INSERT INTO city_popul SELECT Name, Population FROM world.city;
✔️ UPDATE : 데이터 수정
UPDATE 테이블_이름 SET 열1=값1, 열2=값2,... WHERE 조건;
주의) MySQL Workbench 설정 변경해야함!!!!!!
New York을 뉴욕으로, 인구를 0으로 수정
UPDATE city_popul SET city_name = "뉴욕", population = 0 WHERE city_name = "New York";
SELECT * FROM city_popul WHERE city_name = "뉴욕";
주의) 만약, WHERE가 없다면 테이블의 모든 행의 값이 변경됨. -> 모든 행의 인구단위나 가격단위를 맞추기 위해 일괄적으로 값을 변경해야할 땐 유용!
✔️ DELETE : 테이블의 행 데이터를 삭제해야하는 경우
DELETE FROM 테이블이름 WHERE 조건식;
New로 시작하는 도시 중 상위 5개만 삭제
DELETE FROM city_popul WHERE city_name LIKE 'New%' LIMIT 5;
하지만, 대용량 테이블을 삭제해야 할 경우,
테이블까지 삭제 하려면 : DROP TABLE 테이블이름;
테이블은 남기고 삭제 하려면 : TRUNCATE TABLE 테이블이름;