MySQL - 중첩 서브 쿼리(Nested Subquery) - 다중행 서브쿼리(Multiple-Row Subquery) 사용법
MySQL - 중첩 서브 쿼리(Nested Subquery) - 다중행 서브쿼리(Multiple-Row Subquery) 사용법
이번 포스팅에서는 중첩 서브 쿼리(Nested Subquery) 의 다중행 서브쿼리(Multiple-Row Subquery)에 대해서 알아보도록 하겠습니다.
관련글 |
https://server-talk.tistory.com/521 - MySQL - 서브쿼리(Subquery)란?
https://server-talk.tistory.com/522 - MySQL - 스칼라 서브쿼리(Scalar Subquery) 사용법
https://server-talk.tistory.com/523 - MySQL - 인라인 뷰(Inline View) 사용법
MySQL - 조회 테이블 데이터 생성 및 구조확인 |
1. 조회할 테이블 명세서 - 회원테이블, 회사테이블
2. 조회할 테이블 생성 - 회원 테이블
CREATE TABLE member_table (
seq INT NOT NULL AUTO_INCREMENT,
company_code VARCHAR(100),
mb_id VARCHAR(20),
mb_pw VARCHAR(100),
PRIMARY KEY(seq)
) ENGINE=innodb CHARSET=utf8;
3. 조회할 테이블 생성 - 회원정보 테이블
CREATE TABLE member_info_table (
seq INT NOT NULL AUTO_INCREMENT,
company_code VARCHAR(100),
mb_id VARCHAR(20),
member_name VARCHAR(20),
member_age INT,
address VARCHAR(50),
mb_tell VARCHAR(50),
PRIMARY KEY(seq)
) ENGINE=innodb CHARSET=utf8;
4. 조회할 테이블 생성 - 회사 테이블
CREATE TABLE company_table (
seq INT NOT NULL AUTO_INCREMENT,
company_code VARCHAR(100),
korea_name VARCHAR(100),
company_name VARCHAR(100),
company_address VARCHAR(20),
PRIMARY KEY(seq)
) ENGINE=innodb CHARSET=utf8;
5. 데이터 삽입 - 회원 테이블
INSERT INTO member_table (company_code, mb_id, mb_pw) VALUE('035720', 'build', 'build1');
INSERT INTO member_table (company_code, mb_id, mb_pw) VALUE('068270', 'talk', 'server2');
INSERT INTO member_table (company_code, mb_id, mb_pw) VALUE('035420', 'story', 'server3');
INSERT INTO member_table (company_code, mb_id, mb_pw) VALUE('035720', 'kay1', 'ak74');
6. 데이터 삽입 - 회원정보 테이블
INSERT INTO member_info_table (company_code, mb_id, member_name, member_age, address, mb_tell) VALUE('035720', 'build', '홍길동', 22, '서울특별시 강남구 도곡동', '010-1234-1234');
INSERT INTO member_info_table (company_code, mb_id, member_name, member_age, address, mb_tell) VALUE('068270', 'talk', '김하니', 32, '경기도 성남시 분당구', '010-2345-2345');
INSERT INTO member_info_table (company_code, mb_id, member_name, member_age, address, mb_tell) VALUE('035420', 'story', '이성계', 32, '인천광역시 부평구 부평동', '010-3456-3456');
INSERT INTO member_info_table (company_code, mb_id, member_name, member_age, address, mb_tell) VALUE('035720', 'kay1', '박길동', 33, '서울 용산구 한남대로 98', '010-9876-9876');
7. 데이터 삽입 - 회사 테이블
INSERT INTO company_table (company_code, korea_name, company_name, company_address) VALUE('035420', '네이버', 'NAVER', '경기도 성남시 분당구 불정로 6');
INSERT INTO company_table (company_code, korea_name, company_name, company_address) VALUE('035720', '카카오', 'KAKAO', '제주특별자치도 제주시 첨단로 242');
INSERT INTO company_table (company_code, korea_name, company_name, company_address) VALUE('068270', '셀트리온', 'CELLTRION', '인천광역시 연수구 아카데미로 23');
MySQL - 중첩 서브 쿼리(Nested Subquery) 사용시 주의사항 |
1. 서브쿼리는 SELECT 문으로만 작성이 가능합니다
2. 서브쿼리는 ( ) - "괄호" 안에 작성해야 됩니다.
3. ORDER BY 절에서는 사용할수 없습니다.
4. 실행결과가 2개의 행 이상이야 됩니다.
5. 다중행 비교 연산자를 사용합니다.
MySQL - 중첩 서브 쿼리(Nested Subquery) 다중행 비교 연산자 |
연산자 | 설 명 |
IN | 서브쿼리에 조회결과가 1개라도 일지하는 경우 |
ANY | 메인쿼리와 비교조건과 서브쿼리의 검색결과가 1개라도 일치하는 경우 |
EXIST | 메인쿼리와 비교조건과 서브쿼리의 검색결과가 1개라도 일치하는 전체 조회 |
[다중행 연산자]
다중행 서브쿼리는 IN, ANY, EXIST 로 다중행 연산자를 사용하게 됩니다.
MySQL - 중첩 서브 쿼리(Nested Subquery) - 다중행 서브쿼리(Multiple-Row Subquery) 사용법 |
다중행 서브쿼리는 WHERE 절에서 사용되는 쿼리이며, 실행결과가 2개이상의 행일경우 사용 됩니다.
1. 중첩 서브 쿼리(Nested Subquery) 중접행 사용법
사용법 :
SELECT [컬럼명],
[컬럼명],
[컬럼명]
FROM [Table Name]
WHERE [컬럼명] IN (중첨행 서브쿼리)
2. 중첩 서브 쿼리(Nested Subquery) 다중행 예제 - IN
select company_code, mb_id, member_name, member_age, address, mb_tell
from member_info_table
where company_code in (select company_code
from member_table
where company_code = '035720');
조회결과가 2개의 행이상으로 단일행 서브쿼리인 경우 에러가 발생하지만 다중행 서브쿼리에서는 조회가 가능합니다.
2. 중첩 서브 쿼리(Nested Subquery) 다중행 예제 - IN - 출력결과
+--------------+-------+-------------+------------+-------------------------------------+---------------+
| company_code | mb_id | member_name | member_age | address | mb_tell |
+--------------+-------+-------------+------------+-------------------------------------+---------------+
| 035720 | build | 홍길동 | 22 | 서울특별시 강남구 도곡동 | 010-1234-1234 |
| 035720 | kay1 | 박길동 | 33 | 서울 용산구 한남대로 98 | 010-9876-9876 |
+--------------+-------+-------------+------------+-------------------------------------+---------------+
3. 중첩 서브 쿼리(Nested Subquery) 다중행 예제 - EXISTS
select company_code, mb_id, member_name, member_age, address, mb_tell
from member_info_table
where exists (select company_code
from member_table
where company_code = '035720');
서브쿼리에 조회결과가 있을 경우 메인쿼리에 내용을 모두 조회하게 됩니다.
3. 중첩 서브 쿼리(Nested Subquery) 다중행 예제 - EXISTS - 출력결과
+--------------+-------+-------------+------------+-------------------------------------+---------------+
| company_code | mb_id | member_name | member_age | address | mb_tell |
+--------------+-------+-------------+------------+-------------------------------------+---------------+
| 035720 | build | 홍길동 | 22 | 서울특별시 강남구 도곡동 | 010-1234-1234 |
| 068270 | talk | 김하니 | 32 | 경기도 성남시 분당구 | 010-2345-2345 |
| 035420 | story | 이성계 | 32 | 인천광역시 부평구 부평동 | 010-3456-3456 |
| 035720 | kay1 | 박길동 | 33 | 서울 용산구 한남대로 98 | 010-9876-9876 |
+--------------+-------+-------------+------------+-------------------------------------+---------------+