INSERT INTO testdb.product (name,qty,price,create_date,update_date) VALUES
('carrot',15,1000,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('apple',105,500,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('pear',35,800,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('orange',55,1000,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('honey',15,3000,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('pine',25,5000,'2023-02-06 13:54:11','2023-02-06 13:54:11'),
('mellon',15,10000,'2023-02-06 13:54:11','2023-02-06 13:54:11');

INSERT INTO testdb.member (member_id,name,address,phone_number,create_date,update_date) VALUES
('TWC','트와이스','Seoul','010-1111-1111','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('BLK','블랙핑크','Seoul','010-1111-2222','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('WMN','여자친구','Daegu','010-1111-3333','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('OMY','오마이걸','Daegu','010-1111-4444','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('GRL','소녀시대','Daegeon','010-1111-5555','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('ITZ','잇지','Daegeon','010-2222-1111','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('RED','레드밸벳','Daegeon','010-2222-1111','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('APN','에이핑크','Busan','010-2222-2222','2023-02-06 14:04:08','2023-02-06 14:04:08'),
('SPC','우주소녀','Junnam','010-2222-2222','2023-02-06 14:04:08','2023-02-06 14:04:08');

CREATE TABLE buy (
id bigint NOT NULL AUTO_INCREMENT,
member_id bigint DEFAULT NULL,
product_id bigint DEFAULT NULL,
qty int DEFAULT NULL,
create_date datetime DEFAULT CURRENT_TIMESTAMP,
update_date datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
INSERT INTO testdb.buy (member_id,product_id,qty,create_date,update_date) VALUES
(1,1,10,'2023-02-07 08:24:33','2023-02-07 08:24:33'),
(1,2,30,'2023-02-07 08:29:48','2023-02-07 08:29:48'),
(2,1,10,'2023-02-07 08:29:58','2023-02-07 08:29:58'),
(5,2,10,'2023-02-07 08:30:07','2023-02-07 08:30:07'),
(6,8,5,'2023-02-07 08:30:30','2023-02-07 08:30:30'),
(3,3,4,'2023-02-07 08:30:39','2023-02-07 08:30:39'),
(3,5,10,'2023-02-07 08:30:50','2023-02-07 08:30:50'),
(4,4,10,'2023-02-07 08:38:40','2023-02-07 08:38:40'),
(5,2,10,'2023-02-07 08:38:40','2023-02-07 08:38:40'),
(4,1,20,'2023-02-07 08:38:40','2023-02-07 08:38:40');
INSERT INTO testdb.buy (member_id,product_id,qty,create_date,update_date) VALUES
(6,7,10,'2023-02-07 08:38:40','2023-02-07 08:38:40'),
(9,4,10,'2023-02-07 08:38:40','2023-02-07 08:38:40'),
(7,2,30,'2023-02-07 08:38:40','2023-02-07 08:38:40'),
(1,7,20,'2023-02-07 08:38:40','2023-02-07 08:38:40');

'member'와 'buy'에서 member_id가 관계를 갖는다.
member의 member_id는 buy에서 외래키가 되며 이러한 관계를 갖는 것을 RDBMS가 된다.
외래키만 5~6개씩 있는 테이블도 있음.
SELECT *
FORM A
[INNER] JOIN B # INNER 생략가능
ON A.id=B.a_id
AND B.qty>30 # 이런식으로 조건 더 걸어줄 수 있음
외래키로 안묶여있어도 join가능
SELECT * 'A'
FROM A_MEMBER-CODE [AS] 'A'
[INNER] JOIN B_MEMBER_CODE [AS] 'B' # AS는 생략 가능
ON A.id=B.a_id
SELECT *
FROM buy b
INNER JOIN product p ON b.product_id=p.id
INNER JOIN member m ON b.member_id=m.id
member_id가 OMY인 member가 구매한 product_id를 가져옵니다.
product 테이블의 name이 carrot의 구매량(buy에 있는 qty)을 합산해서 가져옵니다.

구매이력이 있는 (buy테이블에 데이터가 있는) 모든 member의 이름을 중복 제거하여 가져옵니다.

구매 이력이 있는 member 테이블의 member_id, name, 구매한 product의 name,price를 가져옵니다.


left join- 왼쪽 데이터 모두 나옴
오른쪽과 겹치는 부분은 함께 나오고 겹치지 않는 부분은 null값
right join- 오른쪽 데이터 모두 나옴
왼쪽과 겹치는 부분은 함께 나오고 겹치지 않는 부분은 null값
full outer join- 왼쪽 오른쪽 전부 나오는데 겹치면 합치고 안겹치면 전부 null값으로
예시
SELECT *
FROM A
LEFT OUTER JOIN B ON A.id=B.A_id
#A값을 기준으로 없는 값은 null 정렬

product 테이블에 있는 모든 품목(name)이 팔린 갯수(buy.qty)를 가져옵니다. 단, 비어있는 경우 NULL로 처리합니다.

어떤 멤버(member_id)가 구매한 품목(product.name)과 구매 수량(buy.qty)를 가져옵니다. 단, 없는 경우 NULL로 처리합니다.

사용 툴 다운로드
https://dbeaver.io/download/


select m.member_id, m.name, sum(b.qty) as 'sum'
from member m
inner join buy b on b.member_id =m.id
where b.member_id = (
select member_id
from (select member_id, count(1) as cnt
from buy
group by member_id
order by cnt desc
limit 1 )
as cnt2
)
group by m.member_id , m.name;


member 테이블에서 'Daegu'에서 사는 사람이 구매한 모든 product의 name과 price를 가져옵니다.

member_id가 'TWC'인 member가 구매한 물품의 양 (buy.qt) 합계를 구합니다.

member_id 'WMN'가 구매한 product의 모든 정보를 가격(price)이 비싼 순으로 정렬합니다.

creat table [이름] (
컬럼1 [data][null/not null][unique][default]
컬럼2
컬럼3
primary key ('컬럼') # 컬럼1,2,3등에 직접 줘도 되지만 이렇게 적어도 가능
);
DROP TABLE IF EXISTS member; #존재해야지 삭제 시킴.
원래있던 테이블에 FK추가 (외래키를 지정하는 것)
ALTER TABLE [테이블 명] ADD CONSTRAINT (이름:임의) FOREIGN KEY(참조 키값) REFERENCE 참조 테이블(테이블ID)
테이블 명: BUY
키 값:member_id
참조 테이블: member id, product id
새 테이블에 제약조건
CREATE TABLE buy(
1
2
FOREIGN KEY(컬럼명) REFERENCES 테이블명(레이블키)
);
(컬럼명)에 member_id
테이블명(레이블키)에 member(id)
학생(student)

과목(subject)



buy와 product가 있을 때 10개를 사면 product에서 그만큼 빠져야함.
트렌젝션-어떤 작업이 끝까지 완료될 때 까지 데이터의 변경을 홀딩함. 데이터가 잘못 반영되는 것을 막기 위해 필요함.
책 내용을 알기위해 INDEX 활용
데이터 베이스도 마찬가지 어떤 데이터가 어디 있고
위에 만든 테이블의 pk, fk도 제약조건을 걸어 인덱스가 걸림.
인덱스 원칙
정수:소수점x INT, BIGINT(보통 ID에 사용), TIMEINT
실수:소수점o FLOAT DOUBLE
문자형: CHAR(고정) VARCHAR(가변)
CHAR(4), VARCHAR(4) 일때 세글자 넣으면 CHAR의 경우 공백이 생김
식별자, FLAG, 약어에서 CHAR를 사용
is_use, delete_yn, category 등 y,n이나 o,x 등으로 데이터의 길이 CHAR(1)가 보장되어 있음.
대량 데이터: TEXT.LONGTEXT, LONGBLOB 사용
이미지 파일: 메모장으로 열면 여러 글자가 나옴 LONGTEXT를 사용하는 것
LONGTEXT (문자 그대로), LONGBLOB (메모리 주소)
날짜형: DATE(시간X), DATETIME(날짜+시간)
NOW(), CURRENT_TIMESTAMP
strudent_number: VARCHAR->INT
DATE_FORMAT(date, '%y-%m-%d)