본문 바로가기
Back-End/MySQL

MySQL - group by, having, join

by 코젼 2022. 7. 18.
728x90
반응형

2022-07-18(21일차)

💡 group by 문

-- rental 테이블로부터 user_id별로 user_id를 조회한다. --
select user_id from rental group by user_id;

-- user_id별로 개수 세기 --
select user_id, count(*) from rental group by user_id;


💡 having 조건문

select user_id, count(*)
	from rental
	group by user_id
	having count(user_id) > 1;

select user_id, count(*)
	from rental
	group by user_id
	having count(user_id) < 1;

select user_id, count(*)
	from rental
	group by user_id
	having count(user_id) <= 2;


select user_id, count(*)
	from rental
    	group by user_id
        having count(*) >= 2;


💡 조인(join)

◾ 2개 이상의 테이블을 묶어서 하나의 결과 테이블을 만드는 것


💬 일대 다 관계
◾ 한쪽 테이블에는 하나의 값만 존재하고 그 값과 대응되는 다른 쪽 테이블의 값은 여러 개인 관계

💬 다대 다 관계
◾ 다대다 관계는 연결 테이블과 두 테이블이 일대다 관계를 맺도록 구성


💬 내부 조인의 형식

SELECT <열 목록> 
   FROM <첫 번째 테이블> 
   INNER JOIN <두 번째 테이블> 
      ON <조인될 조건> 
[WHERE 검색조건];​

💬
내부 조인의 작동
◾ 구매 테이블의 회원 아이디(buyTBL.userID)인 KYM을 추출
◾ KYM과 동일한 값을 회원 테이블의 아이디 (userTBL.userID) 열에서 검색
◾ 아이디 KYM을 찾으면 구매 테이블과 회원 테이블의 두 행을 결합(조인)​

 


📃 inner join (1)

select *
	from rental
    	inner join user
        on user.id = rental.user_id; -- 조건 : on --

◾ user 테이블

id name email
1 chanhwan choich@elice.com
2 haesol sunsol@elice.com
3 hyungon gone@elice.com

◾ rental 테이블

rental_id user_id book_id
1 1 1000
2 1 1001
3 3 1004

◾ inner join 실시 후

rental_id user_id book_id name email
1 1 1000 chanhwan choich@elice.com
2 1 1001 chanhwan choich@elice.com
3 3 1004 hyungon gone@elice.com

📃 inner join (2)

create table girl_group (
group_id int,
group_name varchar(10),
hitsong_id int
);
insert into girl_group values( 101, '레드벨벳', 3 );
insert into girl_group values( 102, '트와이스', 2 );
insert into girl_group values( 103, '소녀시대', 4 );

create table hit_song (
hitsong_id int,
name varchar(15)
);
insert into hit_song values( 1, '뚜두뚜두' );
insert into hit_song values( 2, '우아하게' );
insert into hit_song values( 3, '아이스크림 케익' );
insert into hit_song values( 4, '다시 만난 세계' );

select * from girl_group;


select * from hit_song;


select *
from girl_group
inner join hit_song;


💡 outer join

💬 (left/right) outer join
◾ 조인 조건을 만족하지 않는 행까지 포함하여 출력하는 조인

◾ 외부 조인 형식
SELECT <열 목록> 
FROM <첫 번째 테이블(LEFT 테이블)> 
   <LEFT | RIGHT> OUTER JOIN <두 번째 테이블(RIGHT 테이블)> 
       ON <조인될 조건> 
[WHERE 검색조건];​

📃 left/right outer join 예제

◾ user 테이블

create table user (
id int,
name varchar(10),
email varchar(30)
);
insert into user values( 1, 'chanhwan', 'choich@elice.com' );
insert into user values( 2, 'haesol', 'sunsol@elice.com' );
insert into user values( 3, 'hyungon', 'gone@elice.com' );
id name email
1 chanhwan choich@elice.com
2 haesol sunsol@elice.com
3 hyungon gone@elice.com

◾ rental 테이블

create table rental (
rental_id int,
user_id int,
book_id int
);
insert into rental values( 1, 1, 1000 );
insert into rental values( 2, 1, 1001 );
insert into rental values( 3, 3, 1004 );
rental_id user_id book_id
1 1 1000
2 1 1001
3 3 1004

select *
from user
left join rental
on user.id = rental.user_id;

◾ left join 의 결과, user 테이블에 rental 테이블을 id 기준으로연결

user_id name email rental_id book_id
1 chanhwan choich@elice.com 1 1000
1 chanhwan choich@elice.com 2 1001
2 haesol sunsol@elice.com null null
3 hyungon gone@elice.com 3 1004

⭐ left join은 user.id를 기준으로 하기 때문에,

(user.id, rental.user_id의 교집합 값(1,3)) + (user.id의 값(2))가 포함되어 user_id 컬럼에 1, 2, 3이 모두 조회된다.

rental.user_id가 2인 값은 존재하지 않기 때문에 rental_id와 book_id는 null로 조회된다.


select *
from user
right join rental
on user.id = rental.user_id;

◾ right join 의 결과, user 테이블에 rental 테이블을 user_id 기준으로연결

id name email rental_id book__id
1 chanhwan choich@elice.com 1 1000
1 chanhwan choich@elice.com 2 1001
3 hyungon gone@elice.com 3 1004

⭐ right join은 rental.user_id를 기준으로 하기 때문에,

(user.id, rental.user_id의 교집합 값(1,3)) + (rental.user_id의 값(1,3))이 포함되어 id 컬럼에 1, 3만 조회된다.

728x90
반응형

'Back-End > MySQL' 카테고리의 다른 글

MySQL - Workbench, DB 종류  (0) 2022.07.19
MySQL - 실습문제  (0) 2022.07.18
MySQL - 사용자 생성 및 권한 부여  (0) 2022.07.18
MySQL - JAVA, DB 연결하기  (0) 2022.07.15
MySQL - food 데이터베이스 만들기  (0) 2022.07.15

댓글