본문 바로가기
개발/Database

유니온(UNION), 서브 쿼리

by BellOne4222 2024. 2. 6.

UNION

  • 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법이다.
  • 중복된 값을 제거하고 보여준다.
  • 중복된 값을 제거하는 연산이 추가로 수행되기 때문에 UNION ALL보다 속도가 느리다.

 

UNION ALL 

  • UNION과 동일하게 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법이다.
  • 중복된 값을 모두 보여준다.

 

SELECT A AS one, B AS two 
FROM TABLE_A

UNION (또는 UNION ALL)

SELECT C AS one, D AS two 
FROM TABLE_B;

 

JOIN 과의 차이점

  • JOIN : 새로운 열로 결합한다. (수평결합)
  • UNION : 새로운 행으로 결합한다. (수직결합)
  • JOIN이 속도면으로는 더 좋지만 결과를 SELECT만 가능하다.
  • 서브쿼리는 SELECT, INSERT, UPDATE, DELETE 모두 가능하다.

 

UNION  규칙

  1. 하나의 ORDER BY만 사용할 수 있다.
  2. 각 SELECT의 열수, 표현식가 같아야 한다.
  3. SELECT 문들 끼리 순서는 상관없다.
  4. 유니온을 한 결과가 중복되면 하나만 나온다. (DEFAULT)
  5. 열의 타입은 같거나 반환 가능한 형태여야 한다.
  6. 중복값을 나타내고 싶다면 UNION ALL
SELECT name FROM girl_group
UNION
SELECT name FROM professor;

 

 

 

서브 쿼리

  • 하나의 SQL 문에 포함되어 있는 또 다른 SQL문
  • 주의 사항
    • 서브쿼리를 괄호로 감싸서 사용
    • 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.
    • ORDER BY를 사용하지 못한다.
  • SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT의 VALUES, UPDATE의 SET에 사용가능하다.

 

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%';

 

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;
  • 위의 JOIN방식을 사용 해씅ㄹ 때, 노래 열은 가지고 올 수 없기 때문에 서브쿼리를 사용해서 가져올 수 있다.

 

DELETE FROM girl_group
WHERE hit_song_id IN (SELECT _id FROM song WHERE lyrics LIKE '%e%');

SELECT * FROM girl_group;

'개발 > Database' 카테고리의 다른 글

트랜잭션, 뷰, Date  (0) 2024.02.07
사용자 권한 주기 (GRANT)  (0) 2024.02.07
조인 : JOIN (INNER, OUTER, CROSS, SELF)  (0) 2024.02.05
외래 키 설정하기, 1NF (테이블 쪼개기)  (1) 2024.02.04
정규화(Normalization)  (0) 2024.02.04