40.SQL-6

SOWA·2023년 4월 25일
0

SQL

목록 보기
6/12

🧷 UNION

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

  • Union: 중복된 값을 제거하여 알려줌
  • Union All: 중복된 값도 모두 보여줌

Select column1, column2, ...From tableA
UNION | UNION ALL
Select column1, column2, ... From tableB;

mysql> select * from test1
    -> union all
    -> select * from test2;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
|    3 |
+------+
6 rows in set (0.00 sec)

ㄴ test1의 모든 데이터와 test2의 모든 데이터를 중복된 값을 포함하여 검색


mysql> select name, sex, agency from celeb where sex='F'
    -> union all
    -> select name,sex, agency from celeb where agency = 'YG엔터테인먼트';
+-----------+------+--------------------------+
| name      | sex  | agency                   |
+-----------+------+--------------------------+
| 아이유    | F    | EDAM엔터테이먼트         |
| 이미주    | F    | 올림엔터테인먼트         |
| 이수현    | F    | YG엔터테인먼트           |
| 강동원    | M    | YG엔터테인먼트           |
| 차승원    | M    | YG엔터테인먼트           |
| 이수현    | F    | YG엔터테인먼트           |
+-----------+------+--------------------------+

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


mysql> select name, sex, agency From celeb where sex='F'
    -> union
    -> select name, sex, agency from celeb where agency = 'YG엔터테인먼트';
+-----------+------+--------------------------+
| name      | sex  | agency                   |
+-----------+------+--------------------------+
| 아이유    | F    | EDAM엔터테이먼트         |
| 이미주    | F    | 올림엔터테인먼트         |
| 이수현    | F    | YG엔터테인먼트           |
| 강동원    | M    | YG엔터테인먼트           |
| 차승원    | M    | YG엔터테인먼트           |
+-----------+------+--------------------------+

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


mysql> select name, job_title from celeb where job_title like '%가수%'
    -> union
    -> select name, birthday, age from celeb where birthday between '1980-01-01' and '1989-12-31';
ERROR 1222 (21000): The used SELECT statements have a different number of columns

ㄴ 가져오는 칼럼의 갯수가 다르면 ERROR 리턴


🧷 JOIN

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


mysql> select * from snl_show;
+----+--------+---------+----------------+-----------+
| ID | season | episode | broadcast_date | host      |
+----+--------+---------+----------------+-----------+
|  1 |      8 |       7 | 2020-09-05     | 강동원    |
|  2 |      8 |       8 | 2020-09-12     | 유재석    |
|  3 |      8 |       9 | 2020-09-19     | 차승원    |
|  4 |      8 |      10 | 2020-09-26     | 이수현    |
|  5 |      9 |       1 | 2021-09-04     | 이병헌    |
|  6 |      9 |       2 | 2021-09-11     | 하지원    |
|  7 |      9 |       3 | 2021-09-18     | 제시      |
|  8 |      9 |       4 | 2021-09-25     | 조정석    |
|  9 |      9 |       5 | 2021-10-02     | 조여정    |
| 10 |      9 |       6 | 2021-10-09     | 옥주현    |
+----+--------+---------+----------------+-----------+

🖇️ INNER JOIN

공통된 부분만 가져오는 것

SELECT column1, column2,...
FROM tableA
INNER JOIN gableB
ON tableA.column = tableB.column
WHERE condition;

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 | 이수현    |
+----+-----------+----+-----------+

ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 inner join


🖇️ LEFT JOIN

공통된 부분과 공통되지않은 왼쪽 테이블을 가져오는 것

SELECT column1, column2,...
FROM tableA
LEFT JOINtableB
ON tableA.column= tableB.column
WHERE condition;

mysql> SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> left 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 | 이수현    |
+----+-----------+------+-----------+

🖇️ RIGHT JOIN

공통된 부분과 공통되지않은 오른쪽 테이블을 가져오는 것

SELECT column1, column2,...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

mysql> 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      |
+------+-----------+----+-----------+
|    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 | 옥주현    |
+------+-----------+----+-----------+

ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 체이블과 snl_show테이블을 Right join


🖇️ FULL OUTER JOIN

공통된 부분과 공통되지 않은 부분 전부 가져오는 것

SELECT column1, column2,...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> full outer join snl_show
    -> on celeb.name = snl_show.host;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'outer join snl_show
on celeb.name = snl_show.host' at line 3

ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 Full outer join
*mysql 에서는 FULL OUTER JOIN을 지원하지않음

  • MySQL에서는 FULL JOIN을 지원하지않으므로 다음과 같은 쿼리로 같은 결과를 만들 수 있음
    SELECT column1, column2,...
    FROM tableA
    LEFT JOIN tableB ON tableA.column = tableB.column
    UNION
    SELECT column1, column2,...
    FROM tableA
    RIGHT JOIN tableB ON tableA.column = tableB.column
    WHERE condition;

🖇️ SELF JOIN

INNER JOIN과 같은 결과(공통된 부분을 가져옴)

SELECT column1, column2,...
FROM tableA, tableB,...
WHERE condition;

mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host;
+----+-----------+----+-----------+
| id | name      | id | host      |
+----+-----------+----+-----------+
|  4 | 강동원    |  1 | 강동원    |
|  5 | 유재석    |  2 | 유재석    |
|  6 | 차승원    |  3 | 차승원    |
|  7 | 이수현    |  4 | 이수현    |
+----+-----------+----+-----------+

ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN


mysql> select celeb.name, celeb.job_title
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host and celeb.agency = '안테나';
+-----------+--------------+
| name      | job_title    |
+-----------+--------------+
| 유재석    | MC,개그맨    |
+-----------+--------------+

ㄴ celeb 테이블 연예인 중, snl_show에 host로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색


mysql> select celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host
    -> and not job_title like '%영화배우%' and agency = 'YG엔터테인먼트'
    -> or age >= 40 and agency != 'YG엔터테인먼트';
+-----------+------+--------------+----------------------+--------+---------+
| name      | age  | job_title    | agency               | season | episode |
+-----------+------+--------------+----------------------+--------+---------+
| 유재석    |   50 | MC,개그맨    | 안테나               |      8 |       7 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      8 |       8 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      8 |       9 |
| 이수현    |   23 | 가수         | YG엔터테인먼트       |      8 |      10 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      8 |      10 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       1 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       2 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       3 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       4 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       5 |
| 유재석    |   50 | MC,개그맨    | 안테나               |      9 |       6 |
+-----------+------+--------------+----------------------+--------+---------+

ㄴ celeb의 테이블 연예인 중 , snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사 정보, 시즌, 에피소드 검색 (에러)


mysql> select celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host
    -> and ((Not job_title like '%영화배우%' and agency = 'YG엔터테인먼트')
    ->     or ( age >= 40 and agency != 'YG엔터테인먼트'));
+-----------+------+--------------+----------------------+--------+---------+
| name      | age  | job_title    | agency               | season | episode |
+-----------+------+--------------+----------------------+--------+---------+
| 유재석    |   50 | MC,개그맨    | 안테나               |      8 |       8 |
| 이수현    |   23 | 가수         | YG엔터테인먼트       |      8 |      10 |
+-----------+------+--------------+----------------------+--------+---------+

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


from.제로베이스 데이터 취업스쿨 강의

0개의 댓글