AS문은 열의 별칭을 붙이는 역할을 한다.
SELECT SUM(column) AS new_name
FROM table;
즉 WHERE 연산자나 HAVING 호출 등에서는 AS(별칭)을 사용할 수 없다.
AS문은 쿼리에서 가장 마지막에 할당된다. 따라서 HAVING절이 실행될 때 AS문은 아직 할당되지 않은 상태이므로, 별칭을 참조할 수 없다.
대신 원래 열 이름을 참조할 수 있다.
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;
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
SELECT * FROM TableA
LEFT JOIN TableB
ON TableA.name = TableB.name
SELECT * FROM TableA
LEFT JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.name = TableB.name
SELECT * FROM TableA
RIGHT JOIN TableB
ON TableA.name = TableB.name
WHERE TablA.id IS null
2개 이상의 SELECT문의 결과를 결합할 수 있다. 이때, 두 결과를 바로 위에 붙이기 때문에, 열 이름이 일치해야 한다.
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
- 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 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
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);
// 해석 : 두 표의 고객 아이디가 같고, 지급표 속 지금액 조건이 맞는 고객 정보를 찾아라
...
WHERE NOT EXISTS
셀프 조인은 자체 조인이라고 부르기도 하는데 자기 자신, 즉 1개의 테이블만 사용해 조인하기 때문이다.
주로 한 행에 있는 값을 같은 행에 있는 다른 값과 비교해야 할때 주로 사용한다.
특히 셀프 조인을 통해 같은 테이블에 대해 복사본을 만들어 조인할 수 있어 용이하다.
동일한 테이블을 별칭을 이용해 JOIN한다.
SELECT tableA.col, tableB.col
FROM table AS tableA<별칭A>
JOIN table AS tableB<별칭B>
ON tableA.som_col = tableB.other_col;
※ 참고자료