상세 컨텐츠

본문 제목

[MySQL] 회원가입 데이터베이스 테이블 만들기 JOIN(3)

MySQL

by 주초위왕 2023. 3. 19. 23:29

본문

조인(Join)

 -  SELECT와 더불어 가장 많이 사용하는 옵션 중 하나이며, 두 개 이상의 테이블을 묶어서 하나의 결과 집합으로 만들어        내는 것입니다.

 -  서로 다른 테이블에서 데이터를 가져올 때 사용하는 것이 조인(Join)입니다.


우선, 기존 테이블에 있는 사람만 프로필에 있게 만들어 주기

 

auto_increment를 제외하고 넣어주기.

create table tb_profile(
    pro_useridx bigint,
    pro_age int not null,
    pro_gender enum('남자', '여자'),
    pro_birth datetime not null,
    foreign key(pro_useridx)  references tb_member(mem_idx)

);

desc tb_profile;

알맞게 들어간걸 확인하고,

 

데이터를 넣어주기 (1번 사용자에 대한 프로필, 20살, 여자, 날짜타입)

insert into tb_profile values(1, 20, '여자', '2000-10-11'); 에러가 남

19:03:34 insert into tb_profile values(7, 20, '여자', '2000-10-11')

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 이것은, "참조 무결성 위배" 라고 한다. 쉽게 말해서 fk를 통해 참조해야하는 대상의 값이 먼저 입력되어있지 않으면 나오는 에러, 만약 넣고 싶다면 참고하기.

-- fk를 잠깐 무력화 시켜주는 방법
SET foreign_key_checks = 0;
-- 해주고 INSERT를 할 시 에러가 뜨지 않음
-- 모든 데이터를 다 넣은 뒤에는,
SET foreign_key_checks = 1;

 

 

insert into tb_profile values(7, 20, '여자', '2000-10-11'); 정상적으로 뜸

 

insert into tb_profile values(1, 25, '여자', '2000-10-11');
insert into tb_profile values(10, 25, '여자', '1995-10-11'); 실수로 두번 넣음


insert into tb_profile values(11, 30, '남자', '1992-10-11');


같은 테이블인 것처럼 병합하기

inner(교집합)
tb_member테이블에도 존재하고, tb_profile테이블에도 존재하는것만 결합해서 보여주는 것

SELECT 컬럼명1, 컬럼명2 ..FROM 테이블명1 (inner, left, rught) join 테이블명2 ON 테이블1.필드명 = 테이블2.필드명

(보고싶은 컬럼명1, 컬럼명2 ...테이블명 첫번째꺼(기준이 되는 테이블) join 두번째 테이블명 on 테이블1에서 합칠 테이블명(useridx) = 테이블2의 합칠 테이블명)

select mem_userid, mem_name, pro_age, pro_birth from tb_member inner join tb_profile on tb_member.mem_idx = tb_profile.pro_useridx

(tb_member.mem_idx 기준이 되는 테이블에, primary key가 잡혀있는 키 = foreign key(이래키)가 잡혀있는 테이블에, foreign key(외래키) 잡혀있는 필드 = 기준이 되는 필드가 서로 같게끔)

보고싶은 필드를 첫번째 필드나 두번째 필드를 적어주면 됨

mem_userid, mem_name, pro_age, pro_birth(안에 있는 필드명을 다 다르게 주기)

 


left
먼저 써진 테이블을 기준으로 뽑기

select mem_userid, mem_name, pro_age, pro_birth from tb_member left join tb_profile on tb_member.mem_idx = tb_profile.pro_useridx;

왼쪽 테이블 기준으로 모자른건 null로 나옴


right join
오른쪽 테이블을 중심으로

select mem_userid, mem_name, pro_age, pro_birth from tb_member right join tb_profile on tb_member.mem_idx = tb_profile.pro_useridx;


!!!중요함!!!
limit
원하는 곳에서 원하는데까지의 데이터 뽑기
select 컬럼명1, 컬럼명2 .. from 테이블명 limit 가져올 레코드 갯수

select mem_userid, mem_userpw, mem_name from tb_member limit 3;

select mem_userid, mem_userpw, mem_name from tb_member limit 5;

 

select mem_userid, mem_userpw, mem_name from tb_member limit 0, 3;

(0번부터 3개)
select mem_userid, mem_userpw, mem_name from tb_member limit 1, 2;

(1번부터 2개)


 

반응형

관련글 더보기

댓글 영역