[zerobase_데이터취업스쿨] SQL_CH7_12~CH9_09 [IN, LIKE, UNION 및 JOIN]

DONGYOON KIM·2024년 1월 15일

SQL

목록 보기
3/14

CH7_12: IN 연산자 이론

IN은 목록안에 조건이 존재하는 경우 TRUE 반환

나이가 28세, 48세 중 하나인 데이터 검색

mysql> SELECT * FROM CELEB
    -> WHERE AGE IN (28, 48);
+----+--------+------------+------+------+----------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY           |
+----+--------+------------+------+------+----------------+------------------+
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수           | 울림엔터테이먼트 |
|  3 | 송강   | 1994-04-23 |   28 | M    | 탤런트         | 나무엑터스       |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델 | YG엔터테이먼트   |
+----+--------+------------+------+------+----------------+------------------+
3 rows in set (0.00 sec)

소속사가 나무엑터스, 안테나, 울림엔터테이먼트가 아니면서 성별이 여자이거나 나이가 48세 이상인 데이터 조회

mysql> SELECT * FROM CELEB
    -> WHERE NOT AGENCY IN ('나무엑터스', '안테나', '울림엔터테이먼트')
    -> AND (SEX = 'F' OR AGE >= 48);
+----+--------+------------+------+------+----------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY           |
+----+--------+------------+------+------+----------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트   | EDAM엔터테이먼트 |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델 | YG엔터테이먼트   |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수           | YG엔터테이먼트   |
+----+--------+------------+------+------+----------------+------------------+
3 rows in set (0.00 sec)

CH7_14: IN연산자 문제풀이

CELEB 테이블에서 아이유, 이미주, 유재석, 송강 중에 소속사가 ‘나무엑터스’ 인 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE NAME IN ('아이유','이미주','유재석','송강') AND
    -> AGENCY = '나무엑터스';
+----+------+------------+------+------+-----------+------------+
| ID | NAME | BIRTHDAY   | AGE  | SEX  | JOB_TITLE | AGENCY     |
+----+------+------------+------+------+-----------+------------+
|  3 | 송강 | 1994-04-23 |   28 | M    | 탤런트    | 나무엑터스 |
+----+------+------------+------+------+-----------+------------+
1 row in set (0.00 sec)

CELEB 테이블에서 소속사가 안테나, YG엔터테이먼트 중 하나가 아니고, 성별이 여자인 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE NOT AGENCY IN ('안테나','YG엔터테이먼트')
    -> AND SEX = 'F';
+----+--------+------------+------+------+--------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE    | AGENCY           |
+----+--------+------------+------+------+--------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트 | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수         | 울림엔터테이먼트 |
+----+--------+------------+------+------+--------------+------------------+
2 rows in set (0.00 sec)

CELEB 테이블에서 아이유, 송강, 강동원, 차승원 중에 YG엔터테이먼트 소속이 아니거나 나이가 40세에서 50세 사이인 사람을 찾아보시오

mysql> SELECT * FROM CELEB
    -> WHERE NAME IN ('아이유','송강','강동원','차승원')
    -> AND (NOT AGENCY = 'YG엔터테이먼트' OR AGE BETWEEN 40 AND 50);
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY           |
+----+--------+------------+------+------+------------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트     | EDAM엔터테이먼트 |
|  3 | 송강   | 1994-04-23 |   28 | M    | 탤런트           | 나무엑터스       |
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트   |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트   |
+----+--------+------------+------+------+------------------+------------------+
4 rows in set (0.00 sec)

CH7_15: LIKE 연산자 이론

조건값이 패턴에 맞으면 TRUE

소속사 이름이 ‘YG’로 시작하는 데이터 검색(%연산자: 패턴앞에오면 앞에 어떤 문자가 와도 상관없다. 뒤에오면 뒤에 어떤 문자가 와도 상관없다)

mysql> SELECT * FROM CELEB
    -> WHERE AGENCY LIKE 'YG%';
+----+--------+------------+------+------+------------------+----------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY         |
+----+--------+------------+------+------+------------------+----------------+
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트 |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트 |
+----+--------+------------+------+------+------------------+----------------+
3 rows in set (0.00 sec)

‘엔터테이먼트’로 끝나는 소속사 이름을 가진 데이터 검색

mysql> SELECT * FROM CELEB
    -> WHERE AGENCY LIKE '%엔터테이먼트';
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY           |
+----+--------+------------+------+------+------------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트     | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수             | 울림엔터테이먼트 |
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트   |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트   |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트   |
+----+--------+------------+------+------+------------------+------------------+
5 rows in set (0.00 sec)

직업명에 ‘가수’가 포함된 데이터를 검색

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '%가수%';
+----+--------+------------+------+------+--------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE    | AGENCY           |
+----+--------+------------+------+------+--------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트 | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수         | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수         | YG엔터테이먼트   |
+----+--------+------------+------+------+--------------+------------------+
3 rows in set (0.00 sec)

소속사 이름의 두번째 글자가 G인 데이터 조회(언더바’_’는 문자의 갯수를 정해주는 것임)

mysql> SELECT * FROM CELEB
    -> WHERE AGENCY LIKE '_G%';
+----+--------+------------+------+------+------------------+----------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY         |
+----+--------+------------+------+------+------------------+----------------+
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트 |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트 |
+----+--------+------------+------+------+------------------+----------------+
3 rows in set (0.00 sec)

직업명이 ‘가’로 시작하고 두글자 이상인 데이터 검색(%는 최소 0글자 이상을 뜻한다)

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '가_%';
+----+--------+------------+------+------+--------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE    | AGENCY           |
+----+--------+------------+------+------+--------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트 | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수         | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수         | YG엔터테이먼트   |
+----+--------+------------+------+------+--------------+------------------+
3 rows in set (0.00 sec)

직업명이 ‘가’로 시작하고 최소 5글자 이상인 데이터 검색

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '가____%';
+----+--------+------------+------+------+--------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE    | AGENCY           |
+----+--------+------------+------+------+--------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트 | EDAM엔터테이먼트 |
+----+--------+------------+------+------+--------------+------------------+
1 row in set (0.00 sec)

직업명이 ‘영’으로 시작하고 ‘모델’로 끝나는 데이터 검색

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '영%모델';
+----+--------+------------+------+------+----------------+----------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY         |
+----+--------+------------+------+------+----------------+----------------+
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델 | YG엔터테이먼트 |
+----+--------+------------+------+------+----------------+----------------+
1 row in set (0.00 sec)

영화배우와 탤런트를 병행하는 연예인 검색

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '%영화배우%' AND JOB_TITLE LIKE '%탤런트%';
+----+--------+------------+------+------+------------------+----------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY         |
+----+--------+------------+------+------+------------------+----------------+
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트 |
+----+--------+------------+------+------+------------------+----------------+
1 row in set (0.00 sec)

직업이 하나 이상인 연예인 중 영화배우 혹은 탤런트가 아닌 연예인 검색

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '%,%'
    -> AND NOT (JOB_TITLE LIKE '%영화배우%' OR JOB_TITLE LIKE '%탤런트%');
+----+--------+------------+------+------+------------+--------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE  | AGENCY |
+----+--------+------------+------+------+------------+--------+
|  5 | 유재석 | 1972-08-14 |   50 | M    | MC, 개그맨 | 안테나 |
+----+--------+------------+------+------+------------+--------+
1 row in set (0.00 sec)

CH7_17: LIKE 연산자 문제풀이

CELEB 테이블에서 직업 중 가수가 포함되어 있고 성이 이씨인 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE JOB_TITLE LIKE '%가수%'
    -> AND NAME LIKE '이%';
+----+--------+------------+------+------+-----------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE | AGENCY           |
+----+--------+------------+------+------+-----------+------------------+
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수      | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수      | YG엔터테이먼트   |
+----+--------+------------+------+------+-----------+------------------+
2 rows in set (0.00 sec)

CELEB 테이블에서 성별이 남자이거나 직업명이 ‘탤런트’로 끝나면서 최소 5글자 이상인 데이터 조회

mysql> SELECT * FROM CELEB
    -> WHERE SEX = 'M' OR JOB_TITLE LIKE '%_탤런트';
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY           |
+----+--------+------------+------+------+------------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트     | EDAM엔터테이먼트 |
|  3 | 송강   | 1994-04-23 |   28 | M    | 탤런트           | 나무엑터스       |
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트   |
|  5 | 유재석 | 1972-08-14 |   50 | M    | MC, 개그맨       | 안테나           |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트   |
+----+--------+------------+------+------+------------------+------------------+
5 rows in set (0.00 sec)

CELEB 테이블에서 이름이 두글자인 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE NAME LIKE '__';
+----+------+------------+------+------+-----------+------------+
| ID | NAME | BIRTHDAY   | AGE  | SEX  | JOB_TITLE | AGENCY     |
+----+------+------------+------+------+-----------+------------+
|  3 | 송강 | 1994-04-23 |   28 | M    | 탤런트    | 나무엑터스 |
+----+------+------------+------+------+-----------+------------+
1 row in set (0.00 sec)

CELEB 테이블에서 나이가 30세이상 50세 이하이면서 개그맨이 아닌 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE AGE BETWEEN 30 AND 50
    -> AND NOT JOB_TITLE LIKE '%개그맨%';
+----+--------+------------+------+------+------------------+----------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY         |
+----+--------+------------+------+------+------------------+----------------+
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트 |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트 |
+----+--------+------------+------+------+------------------+----------------+
2 rows in set (0.00 sec)

CELEB 테이블에서 아이유, 이미주, 유재석, 송강 중 소속사 이름이 ‘나무’로 시작하는 데이터 조회하기

mysql> SELECT * FROM CELEB
    -> WHERE NAME IN ('아이유','이미주','유재석','송강')
    -> AND AGENCY LIKE '나무%';
+----+------+------------+------+------+-----------+------------+
| ID | NAME | BIRTHDAY   | AGE  | SEX  | JOB_TITLE | AGENCY     |
+----+------+------------+------+------+-----------+------------+
|  3 | 송강 | 1994-04-23 |   28 | M    | 탤런트    | 나무엑터스 |
+----+------+------------+------+------+-----------+------------+
1 row in set (0.00 sec)

CELEB테이블에서 아이유, 이미주, 송강, 이수현 중에 가수만 직업으로 가졌거나 가수를 병행하지 않고 탤런트를 하는 사람을 찾으세요

mysql> SELECT * FROM CELEB
    -> WHERE NAME IN ('아이유','이미주','송강','이수현')
    -> AND (JOB_TITLE = '가수' OR NOT JOB_TITLE LIKE '%가수%' AND JOB_TITLE LIKE '%
탤런트%');
+----+--------+------------+------+------+-----------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE | AGENCY           |
+----+--------+------------+------+------+-----------+------------------+
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수      | 울림엔터테이먼트 |
|  3 | 송강   | 1994-04-23 |   28 | M    | 탤런트    | 나무엑터스       |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수      | YG엔터테이먼트   |
+----+--------+------------+------+------+-----------+------------------+
3 rows in set (0.00 sec)

CH8_01: UNION 명령어 이론

UNION은 여러개의 SQL 문을 합쳐서 하나의 SQL문으로 만들어 주는 방법 (주의! 칼럼의 갯수가 같아야함)

UNION: 중복된 값을 제거하여 알려줌

mysql> SELECT * FROM TABLE1
    -> UNION
    -> SELECT * FROM TABLE2;
+------+
| NO   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
+------+
5 rows in set (0.00 sec)

UNION ALL: 중복된 값도 모두 보여줌

 mysql> SELECT * FROM TABLE1
    -> UNION ALL
    -> SELECT * FROM TABLE2;
+------+
| NO   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
|    3 |
+------+
6 rows in set (0.00 sec)

성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 UNION ALL로 실행

mysql> SELECT * FROM CELEB WHERE SEX = 'F'
    -> UNION ALL
    -> SELECT * FROM CELEB WHERE AGENCY = 'YG엔터테이먼트';
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY           |
+----+--------+------------+------+------+------------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트     | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수             | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트   |
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트   |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델   | YG엔터테이먼트   |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트   |
+----+--------+------------+------+------+------------------+------------------+
6 rows in set (0.00 sec)

가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와 1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 UNION으로 실행

  • 오류가 난다(왜냐하면 UNION과 UNION ALL은 두 쿼리문의 칼럼이 동일해야하는데 이 문제에서는 두 쿼리문의 칼럼이 다르기 때문임)

CH8_06 UNION의 문제풀이

직업이 가수를 포함하는 데이터를 검색하는 쿼리와 직업에 탤런트를 포함하는 쿼리를 중복을 제거하여 합쳐서 실행하기

mysql> SELECT * FROM CELEB WHERE JOB_TITLE LIKE '%가수%'
    -> UNION
    -> SELECT * FROM CELEB WHERE JOB_TITLE LIKE '%탤런트%';
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE        | AGENCY           |
+----+--------+------------+------+------+------------------+------------------+
|  1 | 아이유 | 1993-05-16 |   29 | F    | 가수, 탤런트     | EDAM엔터테이먼트 |
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수             | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수             | YG엔터테이먼트   |
|  3 | 송강   | 1994-04-23 |   28 | M    | 탤런트           | 나무엑터스       |
|  4 | 강동원 | 1981-01-18 |   41 | M    | 영화배우, 탤런트 | YG엔터테이먼트   |
+----+--------+------------+------+------+------------------+------------------+
5 rows in set (0.00 sec)

성이 이씨인 데이터를 검색하는 쿼리와 1970년대생을 검색하는 쿼리를 중복을 포함하여 합쳐서 실행하기

	mysql> SELECT * FROM CELEB
    -> WHERE NAME LIKE '이%'
    -> UNION ALL
    -> SELECT * FROM CELEB
    -> WHERE BIRTHDAY BETWEEN '19700101' AND '19791231';
+----+--------+------------+------+------+----------------+------------------+
| ID | NAME   | BIRTHDAY   | AGE  | SEX  | JOB_TITLE      | AGENCY           |
+----+--------+------------+------+------+----------------+------------------+
|  2 | 이미주 | 1994-09-23 |   28 | F    | 가수           | 울림엔터테이먼트 |
|  7 | 이수현 | 1999-05-04 |   23 | F    | 가수           | YG엔터테이먼트   |
|  5 | 유재석 | 1972-08-14 |   50 | M    | MC, 개그맨     | 안테나           |
|  6 | 차승원 | 1970-06-07 |   48 | M    | 영화배우, 모델 | YG엔터테이먼트   |
+----+--------+------------+------+------+----------------+------------------+
4 rows in set (0.00 sec)

CH9_01~09: JOIN 이론 및 예제 풀이

JOIN은 두개 이상의 테이블을 결합하는 것

INNER JOIN: 두 테이블의 교집합(공통데이터)를 가져옴

SNL_SHOW에 호스트로 출연한 CELEB을 기준으로 CELEB테이블과 SNL_SHOW 테이블을 INNER JOIN

INNER JOIN을 할 때도 SELECT 뒤의 칼럼은 두 테이블의 모든 칼럼을 가져올 수 있음 (ON에 매칭되는 칼럼의 값은 같아야함)

mysql> SELECT CELEB.ID, CELEB.NAME, SNL_SHOW.ID, SNL_SHOW.HOST FROM CELEB
    -> INNER JOIN SNL_SHOW
    -> ON CELEB.NAME = SNL_SHOW.HOST;
+----+--------+----+--------+
| ID | NAME   | ID | HOST   |
+----+--------+----+--------+
|  4 | 강동원 |  1 | 강동원 |
|  5 | 유재석 |  2 | 유재석 |
|  6 | 차승원 |  3 | 차승원 |
|  7 | 이수현 |  4 | 이수현 |
+----+--------+----+--------+
4 rows in set (0.00 sec)

LEFT JOIN(LEFT OUTER JOIN)

RIGHT JOIN(RIGHT OUTER JOIN)

SNL_SHOW에 호스트로 출연한 CELEB을 기준으로 CELEB테이블과 SNL_SHOW 테이블을 RIGHT JOIN 하기

mysql> SELECT CELEB.NAME, CELEB.ID, SNL_SHOW.HOST, SNL_SHOW.ID FROM CELEB
    -> RIGHT OUTER JOIN SNL_SHOW
    -> ON CELEB.NAME = SNL_SHOW.HOST;
+--------+------+--------+----+
| NAME   | ID   | HOST   | ID |
+--------+------+--------+----+
| 강동원 |    4 | 강동원 |  1 |
| 유재석 |    5 | 유재석 |  2 |
| 차승원 |    6 | 차승원 |  3 |
| 이수현 |    7 | 이수현 |  4 |
| NULL   | NULL | 이병헌 |  5 |
| NULL   | NULL | 하지원 |  6 |
| NULL   | NULL | 제시   |  7 |
| NULL   | NULL | 조정석 |  8 |
| NULL   | NULL | 조여정 |  9 |
| NULL   | NULL | 옥주현 | 10 |
+--------+------+--------+----+
10 rows in set (0.00 sec)

FULL OUTER JOIN(MY SQL에서는 지원 안함): 공통된 영역은 중복되지 않고 공통되지 않은 영역은 NULL로 출력함

SNL_SHOW에 호스트로 출연한 CELEB을 기준으로 CELEB테이블과 SNL_SHOW 테이블을 FULL OUTER JOIN

mysql> SELECT CELEB.ID, CELEB.NAME, SNL_SHOW.ID, SNL_SHOW.HOST FROM CELEB
    -> LEFT JOIN SNL_SHOW ON CELEB.NAME = SNL_SHOW.HOST
    -> UNION
    -> SELECT CELEB.ID, CELEB.NAME, SNL_SHOW.ID, SNL_SHOW.HOST FROM CELEB
    -> RIGHT JOIN SNL_SHOW ON CELEB.NAME = SNL_SHOW.HOST;
+------+--------+------+--------+
| ID   | NAME   | ID   | HOST   |
+------+--------+------+--------+
|    1 | 아이유 | NULL | NULL   |
|    2 | 이미주 | NULL | NULL   |
|    3 | 송강   | NULL | NULL   |
|    4 | 강동원 |    1 | 강동원 |
|    5 | 유재석 |    2 | 유재석 |
|    6 | 차승원 |    3 | 차승원 |
|    7 | 이수현 |    4 | 이수현 |
| NULL | NULL   |    5 | 이병헌 |
| NULL | NULL   |    6 | 하지원 |
| NULL | NULL   |    7 | 제시   |
| NULL | NULL   |    8 | 조정석 |
| NULL | NULL   |    9 | 조여정 |
| NULL | NULL   |   10 | 옥주현 |
+------+--------+------+--------+
13 rows in set (0.00 sec)

SELF JOIN (문법은 다르지만 INNER JOIN과 같은 결과): WHERE절에 조건을 명시함

SELECT COL1, COL2, ....
FROM TABLE1, TABLE2, ....
WHERE CONDITIONS;

SNL_SHOW에 호스트로 출연한 CELEB을 기준으로 CELEB 테이블과 SNL_SHOW테이블을 SELF JOIN:

CELEB 테이블의 연예인 중 SNL_SHOW 에 HOST로 출연했고 소속사가 안테나인 사람의 이름과 직업을 조회

mysql> select celeb.id, celeb.name, celeb.agency, snl_show.episode
    -> from celeb, snl_show
    -> where celeb.agency = '안테나' and celeb.name = snl_show.host;
+----+--------+--------+---------+
| id | name   | agency | episode |
+----+--------+--------+---------+
|  5 | 유재석 | 안테나 |       8 |
+----+--------+--------+---------+
1 row in set (0.00 sec)

CELEB 테이블의 연예인 중 , SNL_SHOW에 HOST로 출연했고 영화배우는 아니면서 YG엔터테이먼트 소속이거나 40세 이상이면서 YG 엔터테이먼트 소속이 아닌 연예인의 이름과 나이, 소속사, 시즌, 에피소드 정보 탐색

mysql> SELECT CELEB.NAME, CELEB.AGE ,CELEB.AGENCY, SNL_SHOW.SEASON,
    -> SNL_SHOW.EPISODE FROM CELEB, SNL_SHOW
    -> WHERE CELEB.NAME = SNL_SHOW.HOST AND (NOT CELEB.JOB_TITLE LIKE
    -> '%영화배우%' AND CELEB.AGENCY = 'YG엔터테이먼트'
    -> OR CELEB.AGE >= 40 AND NOT CELEB.AGENCY = 'YG엔터테이먼트');
+--------+------+----------------+--------+---------+
| NAME   | AGE  | AGENCY         | SEASON | EPISODE |
+--------+------+----------------+--------+---------+
| 유재석 |   50 | 안테나         |      8 |       8 |
| 이수현 |   23 | YG엔터테이먼트 |      8 |      10 |
+--------+------+----------------+--------+---------+
2 rows in set (0.00 sec)

SNL_SHOW에 출연한 CELEB의 SNL_SHOW 아이디, 시즌, 에피소드, 이름, 직업정보를 검색

만약에 조인하는 테이블끼리 겹치는 칼럼이름이 없으면 테이블이름.칼럼 형식으로 쓰지 않을 수 있으나 겹치는 칼럼이 있으면 테이블이름.칼럼명 형태로 써줘야 함(동일한 칼럼명의 경우에만 써도 되지만 가독성을 위하여는 다 써주는게 좋음)

mysql> SELECT SNL_SHOW.ID, SNL_SHOW.SEASON, SNL_SHOW.EPISODE,
    -> CELEB.NAME, CELEB.JOB_TITLE FROM CELEB, SNL_SHOW
    -> WHERE CELEB.NAME = SNL_SHOW.HOST;
+----+--------+---------+--------+------------------+
| ID | SEASON | EPISODE | NAME   | JOB_TITLE        |
+----+--------+---------+--------+------------------+
|  1 |      8 |       7 | 강동원 | 영화배우, 탤런트 |
|  2 |      8 |       8 | 유재석 | MC, 개그맨       |
|  3 |      8 |       9 | 차승원 | 영화배우, 모델   |
|  4 |      8 |      10 | 이수현 | 가수             |
+----+--------+---------+--------+------------------+
4 rows in set (0.00 sec)

SNL_SHOW에 출연한 CELEB 중, 에피소드 7,9,10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 작년 9월 15일 이후에 출연한 사람을 검색

mysql> SELECT NAME,AGENCY,EPISODE,BROADCAST_DATE FROM CELEB,SNL_SHOW
    -> WHERE NAME=HOST
    -> AND
    -> (EPISODE IN (7,9,10) OR AGENCY LIKE 'YG%_____')
    -> AND BROADCAST_DATE > '2020-09-15';
+--------+----------------+---------+----------------+
| NAME   | AGENCY         | EPISODE | BROADCAST_DATE |
+--------+----------------+---------+----------------+
| 차승원 | YG엔터테이먼트 |       9 | 2020-09-19     |
| 이수현 | YG엔터테이먼트 |      10 | 2020-09-26     |
+--------+----------------+---------+----------------+
2 rows in set (0.00 sec)

0개의 댓글