[20240103 TIL] AS / JOIN / 고급 SQL 명령어

Haizel·2024년 1월 3일
1
post-thumbnail

01. AS


AS문은 열의 별칭을 붙이는 역할을 한다.

❇︎ 기본 문법

SELECT SUM(column) AS new_name 
FROM table;

🚨 AS문은 쿼리에서 가장 마지막에 할당된다.

WHERE 연산자나 HAVING 호출 등에서는 AS(별칭)을 사용할 수 없다.

AS문은 쿼리에서 가장 마지막에 할당된다. 따라서 HAVING절이 실행될 때 AS문은 아직 할당되지 않은 상태이므로, 별칭을 참조할 수 없다.

대신 원래 열 이름을 참조할 수 있다.


02. JOIN


① INNER JOIN 함수

✴︎ 기본 문법

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

✴︎ 응용

SELECT payment_id, payment.customer_id, first_name
FROM payment
INNER JOIN customer
ON payment.customer_id = customer.customer_id;

② FULL OUTER JOIN 함수

❶ 교집합 포함

✴︎ 기본 문법

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

❷ 교집합 제외 (합집합 - 교집합)

한 테이블에서 다른 테이블에 존재하지 않는 유니크한(고유한) 값을 알고싶을 때 사용한다.

✴︎ 기본 문법

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

③ LEFT JOIN(LEFT OUTER JOIN) 함수

❶ 교집합 포함

✴︎ 기본 문법

SELECT * FROM TableA
LEFT JOIN TableB
ON TableA.name = TableB.name

❷ 교집합 제외 (LEFT JOIN 집합 - 교집합)

✴︎ 기본 문법

SELECT * FROM TableA
LEFT JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

④ RIGHT JOIN (RIGHT OUTER JOIN) 함수

❶ 교집합 포함

✴︎ 기본 문법

SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.name = TableB.name

❷ 교집합 제외 (RIGHT JOIN 집합 - 교집합)

✴︎ 기본 문법

SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.name = TableB.name
WHERE TablA.id IS null

⑤ UNION 연산자

2개 이상의 SELECT문의 결과를 결합할 수 있다. 이때, 두 결과를 바로 위에 붙이기 때문에, 열 이름이 일치해야 한다.

✴︎ 기본 문법

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2

02. 고급 SQL 명령


✴︎ Timestamp

  • TIME : 시 / 분 / 초
  • DATE : 년 / 월 / 일 / 요일
  • TIMESTAMP : DATE + TIME
  • TIMESTAMPTZ : DATE + TIME + 표준시간대
  • TIMEZONE : 표준시간대
  • NOW : 현재 시간
  • TIMEOFDAY : 시계 시각
  • CURRENT_TIME : 현재 시각
  • CURRENT_DATE : 현재 날짜
SHOW TIMEZONE;
SELECT NOW();
SELECT TIMEOFDAY();
SELECT CURRENT_TIME;
SELECT CURRENT_DATE;

✴︎ Extract

EXTRACT() : 날짜 값에서 년, 월, 일, 주기, 분기별로 추출할 수 있다.

  • YEAR / MONTH / DAY / WEEK / QUATER
EXTRACT(YEAR FROM date_col)

// 월급 지급일이 21이라고 할때, 지금까지 월요일인 적은 몇 번일까?
SELECT COUNT(*)
FROM payment
WHERE EXTRACT(dow FROM payment_date) = 1;

dow

컴퓨터 프로그램은 일요일을 한 주의 시작으로 생각해 0으로 인식한다.
👉 0: 일요일, 1: 월요일, 2: 화요일 ...

AGE() : 해당 날짜/시각에서 현재까지 얼마나 되었는지 계산값을 알려준다.

AGE(date_col)
 // 13 years 1 mon 4 days 01:03:19:20.10241

TO_CHAR() : 일자의 유형을 변경해준다.

TO_CHAR(date_col, 'mm-dd-yyyy')

// 달로 치환하고 싶다면,
SELECT DISTINCT(TO_CHAR(payment_date, 'MONTH'))
FROM payment; 

✴︎ 문자열 함수와 연산자

더 많은 문자열 함수와 연산자 문서는 여기에!

SELECT LENGTH(first_name) FROM customer;
// 문자열 길이

SELECT first_name || ' ' || last_name FROM customer; 
// 문자열 합치기

SELECT UPPER(first_name) FROM customer; 
// 대문자로 치환

SELECT LOWER(first_name) FROM customer;
// 소문자로 치환

SELECT LEFT(first_name, 1) FROM customer; 
// 왼쪽부터 n개만큼 문자열 가져오기

✴︎ 서브 쿼리

서브쿼리는 주로 더 복잡한 쿼리를 만드는 데 사용한다. 다른 쿼리 결과에 대한 쿼리를 실행하거나, 다른 쿼리의 결과를 사용할 수 있다.

괄호 안에 작성된 서브 쿼리가 먼저 작동하면서, 하나의 값으로 사용할 수 있다.

❶ 반 평균 점수보다 높은 점수를 얻은 학생 목록을 얻으라면?

SELECT student, grade
FROM test_scores
WHERE grade > 
(SELECT AVG(grade) FROM test_score); // 70

❷ 특정 역할을 맡은 학생에 대한 목록이 필요하다면?

SELECT student, grade
FROM test_scores
WHERE student IN
(SELECT honor_roll_table); // 70

❸ 특정 기간에 반납된 영화 목록을 확인하고 싶다면 ?

SELECT inventory.film_id
FROM rental
INNER JOIN inventory 
ON inventory.inventory_id = rental.inventory_id
WHERE return_date
BETWEEN '2023-01-02' AND '2023-02-01';

❹ 추가적으로 영화 목록의 제목을 알고 싶다면?

SELECT film_id, title
FROM film
WHERE film_id IN
(SELECT inventory.film_id
FROM rental
INNER JOIN inventory 
ON inventory.inventory_id = rental.inventory_id
WHERE return_date
BETWEEN '2023-01-02' AND '2023-02-01')
ORDER BY film_id;

✓ EXISTS 오퍼레이터


서브 쿼리에서 행의 존재를 테스트하는데 사용한다.
보통 서브 쿼리가 EXISTS 함수 뒤 괄호로 입력되어, 어떤 행이 서브 쿼리로 도출되었는지 확인하는 용도로 사용된다.

SELECT column_name
FROM table_name
WHERE EXISTS
(SELECT column_name 
FROM table_name WHERE condition); // true or false

❺ 한번 결제 시 11달러를 초과한 고객의 이름과 성을 알고 싶다면?

SELECT first_name, last_name
FROM customer AS c
WHERE EXISTS
(SELECT * FROM payment as p
WHERE p.customer_id = c.customer_id
AND amount > 11);

// 해석 : 두 표의 고객 아이디가 같고, 지급표 속 지금액 조건이 맞는 고객 정보를 찾아라

❻ 반대의 경우(11달러를 초과하지 않은 고객)엔?

...
WHERE NOT EXISTS

✴︎ 셀프 조인(self-join)

셀프 조인은 자체 조인이라고 부르기도 하는데 자기 자신, 즉 1개의 테이블만 사용해 조인하기 때문이다.

주로 한 행에 있는 값을 같은 행에 있는 다른 값과 비교해야 할때 주로 사용한다.

특히 셀프 조인을 통해 같은 테이블에 대해 복사본을 만들어 조인할 수 있어 용이하다.

✓ 기본 문법

동일한 테이블을 별칭을 이용해 JOIN한다.

SELECT tableA.col, tableB.col
FROM table AS tableA<별칭A>
JOIN table AS tableB<별칭B>
ON tableA.som_col = tableB.other_col;


※ 참고자료

profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글

관련 채용 정보