| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 공모주 청약
- php
- html
- SQL
- JavaScript
- Stock
- 제이쿼리
- css
- 코드이그나이터
- MYSQL
- 오라클
- 공모주
- Eclipse
- 자바스크립트
- Stock ipo
- 7월 공모주 청약 일정
- 자바
- 공모주 청약 일정
- 리눅스
- 주식
- linux
- codeigniter
- 맥
- 주식 청약 일정
- java
- jquery
- 주식 청약
- Oracle
- IPO
- 6월 공모주 청약 일정
- Today
- Total
개발자의 끄적끄적
[MySQL] 8장 유니온(UNION), 서브 쿼리 [펌] 본문
[MySQL] 8장 유니온(UNION), 서브 쿼리 [펌]
| CREATE TABLE girl_group |
| ( |
| _id INT PRIMARY KEY AUTO_INCREMENT, |
| name VARCHAR(32) NOT NULL, |
| debut DATE NOT NULL, |
| hit_song_id INT |
| ); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('원더걸스', '2007-09-12', 101); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('소녀시대', '2009-06-03', 102); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('카라', '2009-07-30', 103); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('브라운아이드걸스', '2008-01-17', 104); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('다비치', '2009-02-27', 105); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('2NE1', '2009-07-08', 107); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('f(x)', '2011-04-20', 109); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('시크릿', '2011-01-06', 110); |
| INSERT INTO girl_group (name, debut, hit_song_id) |
| VALUES ('레인보우', '2010-08-12', 111); |
| INSERT INTO girl_group (name, debut) |
| VALUES ('에프터 스쿨', '2009-11-25'); |
| INSERT INTO girl_group (name, debut) |
| VALUES ('포미닛', '2009-08-28'); |
| CREATE TABLE professor |
| ( |
| _id INT AUTO_INCREMENT, |
| name VARCHAR(32) NOT NULL, |
| belong VARCHAR(12) DEFAULT 'FOO', |
| phone VARCHAR(12), |
| PRIMARY KEY(_id) |
| ) ENGINE=INNODB; |
| INSERT INTO professor |
| (name, belong, phone) |
| VALUES('유재석', 'IDE','01112345678'); |
| INSERT INTO professor |
| (name, belong, phone) |
| VALUES('황영조', 'MSE', '01121342443'); |
| INSERT INTO professor |
| (name, belong, phone) |
| VALUES('케이멀', 'ESE', '01123424343'); |
| INSERT INTO professor |
| (_id, name, belong, phone) |
| VALUES(256, '호날두', 'IME', '01134343222'); |
| INSERT INTO professor |
| (name, belong, phone) |
| VALUES( '리오넬', 'IDE', '01123432432'); |
| SELECT _id, belong, phone FROM professor; |
| SELECT * FROM professor; |
view rawmysql_41.sql hosted with ❤ by GitHub
1. 유니온 (UNION)
지금까지 테이블의 데이터는 아래와 같다.

두 테이블에서 이름만 꺼내서 아래와 같이 하나의 테이블로 나타내고 싶다.

| SELECT name FROM professor |
| UNION |
| SELECT name FROM girl_group; |
view rawmysql_42.sql hosted with ❤ by GitHub
UNION은 몇개 라도 계속해서 연결할 수 있다.
유니온의 규칙
- 하나의 ORDER BY만 사용할 수 있다.
- 각 SELECT의 열수, 표현식가 같아야 한다.
- SELECT 문들 끼리 순서는 상관없다.
- 유니온을 한 결과가 중복되면 하나만 나온다. (DEFAULT)
- 열의 타입은 같거나 반환 가능한 형태여야 한다.
- 중복값을 나타내고 싶다면 UNION ALL
2. 서브 쿼리
서브쿼리는 6장 테이블 쪼개기를 하면서 잠깐 등장한 적이 있다. 서브 쿼리는 JOIN으로 할 수 있는 기능과 유사한 기능을 제공한다.
이번 시간에는 서브 쿼리가 어떤 경우에 유용하게 사용할 수 있을지에 대해 알아보자.
우선 저번 시간에 사용했던 girl_group 테이블과 song 테이블을 사용한다. 이 테이블이 없다면 링크를 통해 테이블을 추가하도록 하자.
https://gist.github.com/tmmoond8/fc8ba6f4d046aec117968bb80e97a294
| SELECT * |
| FROM girl_group |
| WHERE hit_song_id = (SELECT _id |
| FROM song |
| WHERE lyrics LIKE '%Give%' |
| ); |
| SELECT * |
| FROM girl_group |
| WHERE hit_song_id IN (SELECT _id |
| FROM song |
| WHERE lyrics LIKE '%e%' |
| ); |
| SELECT gg.name, gg.debut, s.title |
| FROM girl_group AS gg |
| JOIN song AS s |
| ON gg.hit_song_id = s._id |
| WHERE s.lyrics LIKE '%e%'; |
view rawmysql_43.sql hosted with ❤ by GitHub
첫 번째 쿼리 결과

3 ~6 : (SELECT 부터 뒷 부분이 서브 쿼리다. 결과는 hit_song_id과 동일한 값인지 비교하게 된다. 이 때 서브 쿼리의 결과는 한 개 보다 크다면 오류가 발생한다.
여러 값을 비교하고 싶다면 두 번째 쿼리를 사용하면 된다.
두 번째 쿼리 결과

세 번째 쿼리 결과

데이터를 유사하게 가져오지만, title 열을 song 테이블에 있는 열이다.
서브 쿼리의 위치는 다양하다. 위와 같이 사용하면 쿼리 결과에 song의 열은 포함할 수 없다. 위 join과 같은 결과를 얻기 위해선 아래와 같이 서브쿼리를 사용
하면 된다.
| SELECT gg.name, gg.debut, |
| (SELECT title |
| FROM song |
| WHERE title IS NOT NULL |
| AND lyrics LIKE '%e%' |
| AND gg.hit_song_id = _id |
| ) AS hitsong |
| FROM girl_group AS gg; |
view rawmysql_44.sql hosted with ❤ by GitHub
지금 부터 서브 쿼리의 유용성에 대해 말해보겠다. 사실, JOIN이 서브 쿼리에 비해 속도 면에서는 더 좋은 것은 분명하다. 그러나 JOIN은 그 결과를
SELECT 하는 것만 가능하다는 단점이 있다. 그렇다, 서브 쿼리는 SELECT, INSERT, UPDATE, DELETE 모두 가능하다.
| DELETE FROM girl_group |
| WHERE hit_song_id IN (SELECT _id |
| FROM song |
| WHERE lyrics LIKE '%e%' |
| ); |
view rawmysql_45.sql hosted with ❤ by GitHub
위 쿼리를 싱행하면 가사에 'e' 문자를 포함 하는 노래를 히트곡으로 하는 걸그룹이 삭제가 된다.

이번 시간에는 유니온과 서브 쿼리에 대해 배웠다. 이제 실무에서 사용할 수 있는 다양한 쿼리를 작성할 수 있는 베이스를 갖췄다. ORDER BY, GROUP BY, 서브 쿼리, 조인, 내부 함수 등을 잘 적용하면 원하는 결과를 얻어 낼 수 있는 쿼리를 작성할 수 있을 것이라 믿는다.
출처: https://futurists.tistory.com/18 [미래학자]
'개발 > sql' 카테고리의 다른 글
| [cubrid] 큐브리드 매니저 10.2 설치 [펌] (0) | 2020.04.02 |
|---|---|
| [sql] SQL의 종류 DDL, DML, DCL 이란? [펌] (0) | 2020.03.28 |
| [sql] Tibero 티베로 JDBC-5114 에러 [펌] (0) | 2020.03.16 |
| [sql] 오라클 데이터베이스 백업(Backup) 및 복구(Recovery) - 전체, 계정(스키마), 테이블[펌] (0) | 2020.03.11 |
| [sql] mssql 날짜 형식 변환 ( convert ) (0) | 2020.03.11 |
