

PostgreSQL
postgreSQL - 16.1
pgAdmin4 - 8.0
SQL 구문
SELECT column_name FROM table_name
중복 제거
SELECT DISTINCT column FROM table
SELECT COUNT(name) FROM table;
SELECT COUNT(DISTINCT(amount)) FROM payment;
SELECT * FROM customer WHERE first_name = 'Jared';
SELECT * FROM film WHERE rental_rate > 4 AND replacement_cost >=19.99;
SELECT store_id,first_name FROM customer ORDER BY store_id DESC, first_name ASC;
쿼리에 반환되는 행의 개수를 제한
ORDER BY 와 자주 같이 사용.
SELECT * FROM payment ORDER BY payment_date DESC LIMIT 5;
값 범위의 사잇값 검색
BETWEEN 8 AND 9 => 8과 9 포함!
NOT BETWEEN 8 AND 9 => 8과 9 포함 X!
SELECT color FROM table WHERE color IN ('red','blue','green')
SELECT * FROM customer WHERE first_name NOT IN ('John','Jake','Julie');
WHERE name LIKE 'A%'
SELECT * FROM customer WHERE first_name LIKE 'J%'
WHERE value LIKE 'Version__'
집계함수
SELECT MAX(replacement_cost) FROM film;
SELECT ROUND(AVG(replacement_cost),2) FROM film;
SELECT SUM(replacement_cost) FROM film;
일정 카테고리 별로 열을 집계한다.
순서는 중요하지 않다.
WHERE 이나 FROM 문 바로 뒤에 위치한다.
GROUP BY 문을 사용하고 특정 열만을 선택하는 경우에는 GROUP BY 문에 반드시 그 열을 포함시켜야한다.
WHERE 문과 GROUP BY 문을 함께 사용하는 경우 WHERE 문에는 집계 대상을 적어서는 안된다.
=> HAVING 이 하는 것.
SELECT category_col , AGG(data_col) FROM table GROUP BY category_col;
// 회사별 부서별 판매액의 총 합
SELECT company, division, SUM(sales) FROM finance_table GROUP BY company, division
SELECT company, SUM(sales) FROM finance_table GROUP BY company HAVING SUM(sales) > 1000;
열이나 결과에 별칭을 부여
쿼리의 맨 마지막에 실행된다. => where, group by 에는 사용 불가.
SELECT 에만 사용이 가능!
SELECT COUNT(amount) AS num_transactions FROM payment
SELECT customer_id, SUM(amount) AS total_spent FROM payment GROUP BY customer_id HAVING total_spent >100
=> 별칭 에러!
SELECT customer_id, SUM(amount) AS total_spent FROM payment GROUP BY customer_id HAVING SUM(amount) >100
=> O
JOIN

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

한 테이블에만 있는 경우든 모든 테이블에 있든 상관없이 모두 검색
겹치는게 없으면 null 자동 입력.
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 customer
FULL OUTER JOIN payment
ON customer.customer_id = payment.customer_id
WHERE customer.customer_id IS null
OR payment.payment_id IS null

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
SELECT film.film_id, title, inventory_id, store_id
FROM film
LEFT JOIN inventory ON
inventory.film_id = film.film_id
// film 이 왼쪽이기 때문에 film 테이블에만 있거나 film과 inventory 모두에 있는 행만 확인할것

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
SELECT film.film_id, title, inventory_id, store_id
FROM film
LEFT JOIN inventory ON
inventory.film_id = film.film_id
WHERE inventory.film_id IS null
// 관련있는 영화 정보는 나오지만 재고는 없습니다

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

SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
UNION 은 두 결과를 직접 붙인다는 차이.
바로 붙일 수 있도록 열이 일치해야한다!
EX) 1분기, 2분기 테이블 합치기
SELECT column_name FROM table1 UNION SELECT column_name FROM table2;
SELECT emp.name, report.name
FROM employees AS emp
JOIN employees AS report ON
emp.emp_id = report.report_id
SELECT f1.title, f2.title, f1.length
FROM film AS f1
INNER JOIN film AS f2
ON f1.film_id != f2.film_id
AND f1.length = f2.length
멘토링 QnA
백엔드는 CRUD 성 API 를 쪼개는게 편해.이슈도 적고 다양한 문제발생의 소지가 적어. 프론트엔드는 여러 API 를 나눠서 호출하기 또 싫거든. 그래서 서로 상충하게돼. => graphQL 로 해결
프론트는 디자이너, 기획자랑 한번 합의하고 백엔드랑 맞춰야해. 근데 그 합의 과정에서 백엔드 개발자는 보통 없어서 커뮤니케이션 미스가 자주 일어남.
백엔드를 하더라도 프론트를 해봐야해. 그래야 입장을 이해할 수 있어. 그 부분을 한번이라도 겪어보면, 아~ 이래서 그렇구나 라는걸 알 수 있음. 그러기 위해서 되게 가볍게라도 다른 티어를 만져보면 이해도가 확확 오를 수 있어.
DBA 가 요즘 없어졌지만, DBA 를 이해하기 위해 스토어드 프로시저를 구성해본다거나 등등