이번시간에는 SQL 구문중 데이터를 조회하는 SQL 기초 Query 사용법을 실습을 통해 알아보겠습니다.
이전시간에 생성한 아래 edu_community Database의 7개 테이블을 대상으로 기본적인 SQL Query 학습을 진행해봅니다.


사전준비 )테이블별 샘플 데이터 만들기
아래 INSERT 쿼리를 복사해서 MySQL Query Editor 창에 붙여 넣고  INSERT 구문 전체를 선택한후 실행버튼 클릭해 테이블별 테스트 데이터를 일괄 등록합니다. 


#관리자정보 테이블 샘플 데이터 등록 

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('1', 'admin', '32dfdfdsdfssfsd', '시스템관리자', 'admin@sample.com', '010-1111-2222', '운영팀', '1', '2024-07-01 17:20:10', '1');

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('1', 'sysadmin', '454dfdfdsdfssfsd', '시스템관리자', 'master@sample.com', '010-1111-2222', '개발팀', '1', '2024-07-09 17:20:10', '1');

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('1', 'eddy', '45454fdfdsdfssfsd', '강창훈', 'kch@sample.com', '010-1111-2222', '개발팀', '1', '2024-07-02 17:20:10', '1');

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('1', 'gabriel', 'ytytdfdfdsdfssfsd', '강민서', 'ms@sample.com', '010-2222-2222', '운영팀', '1', '2024-07-05 17:20:10', '1');

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('2', 'msoftware', '565dfdfdsdfssfsd', '시스템관리자', 'ceo@msoftware.co.kr', '010-3422-1553', '개발팀', '1', '2024-07-04 17:20:10', '1');

INSERT INTO `edu_community`.`admin` (`company_code`, `admin_id`, `admin_password`, `admin_name`, `email`, `telephone`, `dept_name`, `used_yn_code`, `reg_date`, `reg_member_id`) VALUES ('2', 'mixedcode', 'jjjdfdfdsdfssfsd', '시스템관리자', 'master@mixedcode.com', '010-5343-3232', '개발팀', '1', '2024-07-02 17:20:10', '1');



#채널 정보 테이블 샘플 데이터 등록 

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('1', '1', '일대일채널1', '/img/channel1.png', 2, '일대일채널1', 1, '2024-07-01', '1');

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('1', '2', '개발자모임', '/img/channel2.png', 1000, '개발자모임', 0, '2024-07-02', '1');

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('1', '2', '클라우드공부방', '/img/channel3.png',500, '클라우드공부방', 1, '2024-07-02', '1');

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('2', '2', '인천지역모임', '/img/channel4.png', 100, '인천지역모임', 1, '2024-07-02', '1');

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('2', '2', '취미여행모임', '/img/channel5.png', 200, '취미여행모임', 0, '2024-07-02', '1');

INSERT INTO `edu_community`.`channel` (`community_id`, `category_code`, `channel_name`, `channel_img_path`, `user_limit`, `channel_desc`, `channel_state_code`, `reg_date`, `reg_member_id`) VALUES ('2', '2', '취미독서모임', '/img/channel6.png', 80, '취미독서모임', 0, '2024-07-01', '1');



#채널 회원정보 테이블 샘플 데이터 등록 

INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('1', '1', '흑기사', '1', '1', '2024-07-05 10:10:15', 'wqeresfdsfdsfdsfs', '111.111.111.111', '2024-07-05 10:10:15', '1');

INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('1', '2', '백기사', '0', '1', '2024-07-05 10:20:10', 'dfdfdfdfdfdffdfds', '222.222.222.222', '2024-07-05 10:20:10', '2');


INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`,`last_out_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('2', '1', '흑기사', '0', '0', '2024-07-06 11:11:10','2024-07-06 11:14:10', 'gdfdfdfdfdfdffdfds', '111.222.222.222', '2024-07-06 11:11:10', '1');

INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`,`last_out_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('2', '2', '백기사', '1', '0', '2024-07-06 11:12:10','2024-07-06 11:14:10', 'sdfdfdfdfdfdffdfds', '112.222.222.222', '2024-07-06 11:12:10', '2');

INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`,`last_out_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('2', '3', '홍기사', '0', '1', '2024-07-06 11:13:10','2024-07-04 11:14:10', 'ddfdfdfdfdfdffdfds', '113.222.222.222', '2024-07-06 11:13:10', '3');

INSERT INTO `edu_community`.`channel_member` (`channel_id`, `member_id`, `nick_name`, `member_type_code`, `active_state_code`, `last_contact_date`,`last_out_date`, `connection_id`, `ip_address`, `edit_date`, `edit_member_id`) VALUES ('2', '4', '블랙핑크', '0', '1', '2024-07-06 11:14:10','2024-07-04 11:14:10', 'sdfdfdfdfdfdffdfds', '114.222.222.222', '2024-07-06 11:14:10', '4');


#게시글 정보 샘플 데이터 등록 

INSERT INTO `edu_community`.`article` (`board_type_code`, `title`, `article_type_code`, `contents`, `view_count`, `ip_address`, `is_display_code`, `reg_date`, `reg_member_id`) VALUES ('1', '공지게시글1입니다.', '0', '공지게시글1 내용 입니다.', '100', '111.111.111.111', '1', '2024-07-01 09:20:10', '1');

INSERT INTO `edu_community`.`article` (`board_type_code`, `title`, `article_type_code`, `contents`, `view_count`, `ip_address`, `is_display_code`, `reg_date`, `reg_member_id`) VALUES ('1', '공지게시글2입니다.', '1', '공지게시글2 내용 입니다.', '110', '111.111.111.111', '1', '2024-07-01 09:20:10', '1');

INSERT INTO `edu_community`.`article` (`board_type_code`, `title`, `article_type_code`, `contents`, `view_count`, `ip_address`, `is_display_code`, `reg_date`, `reg_member_id`) VALUES ('2', '블로깅 게시글1입니다.', '0', '블로깅 게시글1 내용 입니다.', '400', '222.111.111.111', '1', '2024-07-01 09:20:10', '2');

INSERT INTO `edu_community`.`article` (`board_type_code`, `title`, `article_type_code`, `contents`, `view_count`, `ip_address`, `is_display_code`, `reg_date`, `reg_member_id`) VALUES ('2', '블로깅 게시글2입니다.', '1', '블로깅 게시글2 내용 입니다.', '500', '123.111.111.111', '1', '2024-07-01 09:20:10', '3');

INSERT INTO `edu_community`.`article` (`board_type_code`, `title`, `article_type_code`, `contents`, `view_count`, `ip_address`, `is_display_code`, `reg_date`, `reg_member_id`) VALUES ('2', '블로깅 게시글3입니다.', '1', '블로깅 게시글3 내용 입니다.', '600', '101.111.111.111', '1', '2024-07-01 09:20:10', '4');


모든 데이터를 등록하였다면 아래 기본 테이블 조회 쿼리를 실행시켜 실제 데이터가 정상적으로 등록되었는지 확인합니다.

SELECT * FROM member;

SELECT * FROM admin;

SELECT * FROM article;

SELECT * FROM article_file;

SELECT * FROM channel;

SELECT * FROM channel_member;

SELECT * FROM channel_msg;


1)컬럼 전체 및 선택  조회 맟 DISTINCT 사용하기 

-해당 테이블의 모든 컬럼, 또는 부분적 컬럼을 조회하는 SQL입니다.
-DISTINCT는  특정 컬럼 조회시  중복 데이터를 제거한 결과값을 반환합니다.

/*

Step1: 컬럼 전체 및 선택  조회 

*/

SELECT * FROM admin;

SELECT admin_member_id, admin_id,admin_name, email,telephone FROM admin;


#전체 회사구분코드,부서 컬럼만 조회 

SELECT company_code,dept_name FROM admin;


#DISTINCT 해당 컬럼 중복제거 조회하기

SELECT DISTINCT company_code FROM   admin;

SELECT DISTINCT dept_name FROM   admin;


2)WHERE 조건절 사용하기 
-WHERE 조건을 이용해 특정 컬럼의 값을 비교하여 조건에 해당하는 데이터만 조회할수 있습니다.
-데이터의 범위를 지정하여 쿼리가 가능합니다.
-IN을 이용 특정 값 목록을 한번에 조회할수도 있고 NOT IN 을 이용 조회대상에서 제외시킬수도 있습니다.


/*

Step2: WHERE 조건절 조회 

*/

SELECT * FROM channel;


#접속자 제한수가 500보다 작은 채널목록 조회 

SELECT * FROM channel

WHERE user_limit < 500;


#접속자 제한수가 80이상 200명 이하 채널만 조회 

SELECT * FROM channel

WHERE user_limit BETWEEN 80 AND 200;


#접속자 제한수가 80이상 200명 이하 채널만 조회 

SELECT * FROM channel

WHERE user_limit >= 80 AND user_limit <= 200;


# IN() 특정 컬럼에 지정된 값이 존재하는 모든 데이터 조회 - OR조합과 동일

SELECT * FROM channel

WHERE channel_name IN ('인천지역모임', '취미여행모임');


# NOT IN() 특정 컬럼에 지정된 값이 아닌 모든 데이터 조회 

SELECT * FROM channel 

WHERE channel_name NOT IN ('개발자모임', '일대일채널1');


SELECT * FROM channel_member;


#대화명 글자가 맨마지막이 '기사' 로  끝나는 데이터 모두 조회 

SELECT channel_id, member_id,nick_name FROM channel_member

WHERE nick_name LIKE '%기사'; 


 #대화명 글자가 '기' 자가 포함된 데이터 모두 조회 

SELECT channel_id, member_id,nick_name FROM channel_member

WHERE nick_name LIKE '%기%';


 #대화명 글자가 '백' 자로 시작하는 데이터 모두 조회 

SELECT * FROM channel_member

WHERE nick_name LIKE '백%';


#대화명 두번째 글자가 '랙' 글자를 포함한 모든 데이터 조회  

SELECT * FROM channel_member

WHERE nick_name LIKE '_랙%'; 


#컬럼중 해당 값을 모두 포함한 데이터 조회 OR 조합 

SELECT * FROM channel_member

WHERE nick_name ='흑기사' OR nick_name ='백기사';


#컬럼중 해당 값에 해당하는 데이터만 조회 AND 조합 

#채팅 채널 2번 사용자들중에 현재 채팅중인 사용자 목록만 조회하기 

SELECT * FROM channel_member

WHERE channel_id =2 AND active_state_code =1;


3)데이터 정렬 처리 

-조회결과에 대한 데이터 정렬이 가능합니다.
-데이터 정렬은 WHERE 조건으로 필터링 된 조회결과값을 대상으로 진행되며
-오름차순과 내림차순  두가지 방식을 제공합니다.
-ASC=오름차순(1,2,3,4, A,B,C,D)  DESC=내림차순(4,3,2,1, D,C,B,A)
-여러 컬럼에 대해 정렬방법을 순차적으로 적용할수 있습니다.


/*

Step3) 데이터 정렬 처리 

*/

#ASC=오름차순(1,2,3,4, A,B,C,D)  DESC=내림차순(4,3,2,1, D,C,B,A) 


#채널 접속일자를 과거에서 현재기준  오름차순으로  정렬해서  조회하기 -ASC=날짜 으름자순 

#ORDER BY 컬럼명 ASC 정렬방식을 지정하지 않으면 기본값이 ASC입니다. 

SELECT *

FROM channel_member

ORDER BY last_contact_date;


# 접속 채널 아이디별로 지난 과거부터 접속한 접속일시 기준으로 정렬조회 

#channel_id로 먼저 ASC 정렬후 그 정렬셋을 기반으로 한번더 last_contact_date로 ASC정렬처리함

SELECT * FROM channel_member

ORDER BY channel_id, last_contact_date;


#채널별 현재 접속자 먼저 정렬되어 조회 

#채널번호로 먼저 ASC 정렬하고 현재접속상태코드를 기준으로 DESC 정렬

SELECT *

FROM channel_member

ORDER BY channel_id ASC, active_state_code DESC; 



4)컬럼 기본 집계 함수 사용하기  

-컬럼들에 대한 각종 집계함수를 기본 제공합니다.
-SUM,MIN,MAX,AVG 등을 포함한 각종 집계/계산함수를 DB서버에서는 기본 제공합니다.


/*

Step4) 컬럼 기본 집계 함수 사용하기  

*/

SELECT * FROM article;


#전체 게시글 조회수 총합 조회 

SELECT SUM(view_count)

FROM article;


#조회결과 컬럼 Alias(별칭) 지정 출력하기 

SELECT SUM(view_count) AS 'total_count'

FROM article;


#게시글 총조회수, 평균조회수,최소조회수,최대조회수 조회하기 

SELECT * FROM article;

SELECT SUM(view_count) AS ttl_count,

AVG(view_count) AS avg_count,

MIN(view_count) AS min_count,

MAX(view_count) AS max_count

FROM article;


#전체 게시글 목록 건수 조회 

SELECT COUNT(*) FROM article;

SELECT COUNT(*) as 'article_count' FROM article;


5)데이터 그룹핑 및 집계 처리하기 

-GROUP BY 데이터들중 특정 컬럼들을 기준으로 데이터를 그룹핑할수 있습니다.
-그룹핑된 결과에 대한 집계데이터를 제공할수 있습니다.
-HAVING 그룹핑 집계 데이터를 기반으로 데이터를 필터할수 있습니다.  


/*

Step5) Group By 그룹핑/집계함수  사용하기  

*/

SELECT * FROM article;


#게시판 유형별 게시글 건수와 조회수 총합 조회하기 

SELECT

board_type_code, 

COUNT(*) AS 'article_count', 

    SUM(view_count) AS 'total_view_count'

FROM article

GROUP BY board_type_code;


#그룹핑 결과 정렬하기 

SELECT

board_type_code, 

COUNT(*) AS 'article_count', 

    SUM(view_count) AS 'total_view_count'

FROM article

GROUP BY board_type_code

ORDER BY board_type_code ASC;


#그룹핑 집계결과 조건 필터링하기 

SELECT

board_type_code, 

COUNT(*) AS 'article_count', 

    SUM(view_count) AS 'total_view_count'

FROM article

GROUP BY board_type_code

HAVING COUNT(*) >= 3;



6)테이블 관계기반 여러 테이블 JOIN 결과셋 만들기 

-관계형 데이터베이스는 정규화 기법을 통해 사용자 데이터를 여러개의 테이블로 나누어 데이터를 보관할수 있습니다.
-여러 테이블에 분산 저장된 데이터를 하나의 결과셋으로 만들기 위해서 Table Join 기법을 사용합닏.
-Table Join으로는 INNER JOIN , LEFT OUTER JOIN, RIGHT OUTER JOIN,SELF JOIN , CROSS JOIN, UNION 등 다양한 조인 기법이 존재합니다.
-이번시간에는 INNER JOIN,OUTER JOIN, UNION 정도만 알아보고 차차 다양한 JOIN방식을 알아보도록 하겠습니다.
- 각 JOIN기법에 대한 자세한 내용은 아래 JOIN기법별  주석을 참고바랍니다.


/*

Step6) 테이블간 관계를 이용한  JOIN 처리하기   

*/

#채팅 채널과 해당 채틸 채널별 사용자 목륵  2개의 테이블을 조인하여 양쪽에 있는 컬럼을 조합하여 새로운  결과셋을 만들어봅니다.  

SELECT * FROM channel;

SELECT * FROM channel_member;


#INNER JOIN: 두개이상의 테이블에 대해 각각 테이블에 조건 컬럼을 지정하고 각테이블의 조건 컬럼값이 동일한 결과셋만 조회합니다.

#Inner Join은 조인하는 테이블의 조건 컬럼값이 일치하는 결과물만 조회됩니다. 

#Inner Join은  조건 컬럼을 기반으로 조건 컬럼 데이터의 교집합 데이터만 대상으로 조회한다.

#MySQL,ORACLE INNER JOIN 구문

SELECT *

FROM channel, channel_member

WHERE channel.channel_id = channel_member.channel_id;


#각 테이블에서 원하는 컬럼만 가져올수 있지만 

#두테이블 양쪾에 존재하는 컬럼은 정확히 어떤 테이블에서 해당 컬럼을 가져올지 지정해야한다.

SELECT

channel.channel_id,

channel_name,

user_limit,

member_id,

nick_name 

FROM channel, channel_member

WHERE channel.channel_id = channel_member.channel_id;


#테이블 별칭을 이용한 ANSI(미국표준협회)-SQL 표준 INNER JOIN 구문 

#두 테이블에서 내가 원하는 컬럼만 가져와 새로운 결과셋을 만들어 결과값을 반환합니다. 

SELECT

C.channel_id,

channel_name,

user_limit,

member_id,

M.nick_name 

FROM channel C INNER JOIN  channel_member M

ON C.channel_id = M.channel_id;


#3개의 테이블 INNER JOIN하기 

SELECT * FROM member;

#회원테이블을 추가 INNER JOIN해서 회원테이블에서 실명과 메일주소를 추가 조회해온다. 

SELECT

channel.channel_id,

channel_name,

user_limit,

channel_member.member_id,

nick_name,

name,

email

FROM channel, channel_member,member

WHERE channel.channel_id = channel_member.channel_id AND channel_member.member_id = member.member_id


#3개의 테이블 INNER JOIN하기 

#회원테이블을 추가 INNER JOIN해서 회원테이블에서 실명과 메일주소를 추가 조회해온다. 

SELECT

C.channel_id,

channel_name,

user_limit,

CM.member_id,

CM.nick_name,

M.name,

M.email 

FROM channel C INNER JOIN  channel_member CM

ON C.channel_id = CM.channel_id

INNER JOIN member M 

ON CM.member_id = M.member_id;


SELECT * FROM channel;

SELECT * FROM channel_member;


#Outer Join (LEFT/RIGHT Outer Join)

#두개 테이블중 기본 데이터 출력 대상이 되어야는 기준 테이블을 LEFT/RIGHT로 지정합니다.

#기본적으로 Outer Join은 기본출력이 되는 기준 테이블의 모든 ROW 값을 대상으로만 데이터가 출력되며 

#추가로 조인 조건 컬럼의 값이 일치하는 값은 양쪾 테이블의 컬럼들이 모두 기본 출력하고(INNER JOIN과 동일) 또한 조인조건 컬럼값이 일치하지 않은 테이블의 컬럼들도 결과셋으로 출력할수 있습니다.

#일치하지 않는 값은 NULL형태로 값이 제공되어 출력됩니다. 


#Outer Join에는 LEFT Outer Join,Right Outer Join 두개의 방식을 제공합니다.

#LEFT Outer Join은 두개 테이블중 조인테이블의  왼쪽 테이블의 로우만 모두 출력하되 조인조건 컬럼 값이 일치하던 일치하지 않던 양쪽 테이블의 모든 컬럼을 결과셋에 포함시키는 기능이고 

#RIGHT Outer Join은 두개 테이블중 조인테이블의  오른쪽 테이블의 로우만 모두 출력하되 조인조건 컬럼 값이 일치하던 일치하지 않던 양쪽 테이블의 모든 컬럼을 결과셋에 포함시키는 기능입니다. 


#아래 채널테이블에는 1~6번까지의 채널번호 정보가 존재합니다.

SELECT * FROM channel;


#아래 채널회원테이블에는 채널번호(channel_id)값이 1-2번까지만 존재합니다.

SELECT * FROM channel_member;


#아래 쿼리에서 OUTER JOIN 의 LEFT 테이블인 channel테이블의 모든 로우들만 기본 출력대상이 되며

#조인조건인 channel_id값이 일치하는 channel_member 로우는 모두 출력되고 channel_id값이 존재(일치)하지 않는 channel_member 테이블의 컬럼들도 모두 출력대상이 되지만 값은 null로 표시됩니다. 

#두개 테이블의 모든 컬럼을 출력합니다. (조인 기준 테이블은 channel입니다. )

#C.* 는 해당 별칭 테이블의 모든 컬럼을 출력한다는 의미입니다.

SELECT

C.*,

    CH.*

FROM channel C LEFT OUTER JOIN channel_member CH 

ON C.channel_id = CH.channel_id;


#LEFT OUTER JOIN 후 필요한 컬럼만 해당 테이블에서 가져옵니다.

#channel 테이블의 모든 채널을 기반으로 일치되는 값을 출력하고

#일치하지 않는 channel_member테이블의 컬럼들은 출력하되 null값으로 출력됨을 확인합니다. 

SELECT

C.channel_id,

channel_name,

user_limit,

member_id,

nick_name

FROM channel C LEFT OUTER JOIN channel_member CH 

ON C.channel_id = CH.channel_id;


#아래 쿼리는 상기 LEFT OUTER JOIN과 동일한 쿼리인데 RIGHT OUTER JOIN으로 바꾸기만 했습니다.

# Outer Join의 기준이 되는 테이블이 이젠 channel_member가 되고 channel_member의 모든 로우가 기본 출력 대상이 됩니다.

# Outer Join의 기준정보 테이블에는 channel_id값이 1-2번까지만 존재하기 때문에 3-6번 채널정보는 기본 출력대상 되지 못합니다.  

SELECT

C.channel_id,

channel_name,

user_limit,

member_id,

nick_name

FROM channel C RIGHT OUTER JOIN channel_member CH 

ON C.channel_id = CH.channel_id;


#UNION Join은 두개의 동일 구조의 결과셋을 하나의 결과셋으로 만들어주는 기능을 제공합니다.

#UNIO = 중복된 Row는 제거됩니다. 

SELECT * FROM member WHERE member_id IN(1,2,3)

UNION 

SELECT * FROM member WHERE member_id IN(3,4,5)


#UNION ALL = 중복된 Row도 포함됩니다. 

SELECT * FROM member WHERE member_id IN(1,2,3)

UNION ALL

SELECT * FROM member WHERE member_id IN(3,4,5)


7)Sub Query 사용하기 
-JOIN기법을 통해서 원하는 조회결과셋을 만들기 어려울때가 간혹 있습니다.
-이럴떄 유용한 방식이 Sub Query 기법입니다.
-원하는 컬럼의 값을 구하거나 조건절에서 원하는 결과값을 필요할때 만들어서 사용할수 있습니다.
-자주 사용하는 SubQuery는 View나 Function을 이용해 재사용하는 방법이 권장됩니다.


/*

Step7) Sub Query 사용하기 

*/

#SUB QUERUY 는 컬럼이나 조회조건등에서  원하는 결과셋을 만들어 내기 위해 기본 SQL Query안에 추가 SQL쿼리를 작성해서 원하는 결과셋을 만는 기법입니다.

SELECT * FROM channel;

SELECT * FROM channel_member;


#채널별 참여자수 조회 SubQuery(컬럼기반) 

SELECT 

channel_id,

channel_name,

(select count(*) from channel_member where channel_id = channel.channel_id)  as user_cnt

FROM channel;


#채널 이용상태가 활성된 채널의 모든 사용자 목록조회 

SELECT * FROM channel_member

Where channel_id IN(SELECT channel_id FROM channel WHERE channel_state_code=1);


지금까지 기초 쿼리 사용법에 대해 알아보았습니다.

수고 많으셨습니다.