SQL 에서 다양한 문법이 사용된다 가장 핵심은 JOIN 이라고 생각하지만 그 외 사용할경우 효과적인 문법에 대해서 알아보고자 한다.
--기본적인 사용방법
SELECT col1 FROM table1
UNION (ALL)
SELECT col1 FROM table2;
예시)
| name |
|---|
| alice |
| bob |
| name |
|---|
| bob |
| Charlie |
| name |
|---|
| alice |
| bob |
| Charlie |
| name |
|---|
| alice |
| bob |
| bob |
| Charlie |
SELECT col1 FROM table1
EXCEPT
SELECT col1 FROM table2;
위와 동일하게 Employees, Managers 테이블을 가지고 실행한다면
그 결과는 다음과 같을 것이다.
| name |
|---|
| alice |
| Charlie |
SELECT col1 FROM table1
INTERSECT
SELECT col1 FROM table2
위와 동일하게 Employees, Managers 테이블을 참조한다면 다음과 같은 결과를 얻을 수 있다.
| name |
|---|
| bob |
UNION, EXCEPT, INTERSECT 의 경우 조회하는 각각의 테이블들의 결과의 필드의 수와,타입이 동일해야 Error가 발생하지 않으므로, 사용할 때 주의하여야 한다.
함수의 정의처럼 합집합이나 교집합 차집합 등을 구할 때 사용할 수 있지만 차이점을 확인할 때 사용하기에도 적합할 수 있다. 예를들어 기존 SELECT A 를 통해 데이터를 조회하다가 로직을 변경하여 SELECT B 를 작성하였다면 두 쿼리가 동일한 결과를 얻어야 하는데 다른 결과를 얻어오는지 등을 확인할 때 사용할 수 있을 것 같다.
SELECT COALESCE(col1,col2,'default') FROM table1;
다음과 같은 테이블이 있을 때 COALESCE 가 어떻게 사용되는지 알아보자.
| Name | Nickname |
|---|---|
| Alice | NULL |
| Bob | Bobby |
SELECT COALESCE(Nickname,Name) AS RES FROM employees;
위와 같은 테이블이 있을 때 다음 쿼리를 사용하면 Nickname 값을 검사하고 null 값이 존재하면 Name 컬럼의 값으로 조회하도록 쿼리를 작성하였다.
| RES |
|---|
| Alice |
| Bobby |
이처럼 NULL 값을 조회하고, 그 값을 변경하고 싶을 때 이처럼 사용할 수 있다.
알아두면 좋은 NULL 특성 !
NULL 값이 있을 때 어떠한 사칙연산(+,-,/,*) 를 하더라도 반드시 NULL 이 나온다는 점을 기억하자.
SELECT NULLIF(COL1,COL2) FROM TABLE1;
| Student | Score |
|---|---|
| Alice | 90 |
| Bob | 95 |
SELECT Student,NULLIF(Score,90) as RES FROM Score;
위와 같은 테이블과 쿼리를 작성했다면 Score 와 90 의 값을 비교하여 같으면 NULL을 리턴하고, 같지 않으면 첫번째 값을 리턴하는 것을 아래의 결과에서 확인할 수 있다.
| Student | RES |
|---|---|
| Alice | NULL |
| Bob | 95 |
SELECT COL1,LISTAGG(COL2,', ')
WITHIN GROUP ( ORDER BY COL1 ) AS AGG_COL
FROM TABLE1
GROUP BY COL1;
위 사용방식 처럼 사용이 가능한데 다음 예시를 통해 어떻게 사용되는지 확인해보자.
| Student | Course |
|---|---|
| Alice | Math |
| Alice | Science |
| Bob | Math |
SELECT Student,LISTAGG(Course,', ') WITHIN GROUP (ORDER BY Course) as CourseList
FROM Courses
GROUP BY Student;
이렇게 사용하면 Student 이름으로 그룹화하여 학생이 수강하는 Course 를 리스트업하고 그 순서는 수강과목의 알파벳 순서로 하여 조회할 수 있다.