현대오토에버 모빌리티 sw 스쿨
현대오토에버 모빌리티 SW 스쿨 웹/앱 SQL JOIN
종식당
2024. 10. 14. 16:45
728x90
반응형
SQL
SQL에서 JOIN은 수학에서의 집합의 개념과 매우 유사하다. 이번에는 SQL의 기초와 코드에 대해 알아보려 한다.
SQL은 작성 순서가 어긋나면 오류가 나기 때문에 순서가 매우 중요하다.
- SQL문 작성 순서
- SELECT & DISTINCT
- FROM
- JOIN
- WHERE
- HAVING
- GROUP BY
- ORDER BY
- LIMIT
- SQL 쿼리 실행 순서
- FROM & JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT & OFFSET
SQL-JOIN
너무 간단한 내용은 넘어가도록 하고 이제 JOIN문에 대해서 알아보겠다.
INNER JOIN
- INNER JOIN은 교집합에 해당하는 개념이다.
LEFT OUTER JOIN
- FROM "Table"에 초점을 맞춘 Join이다.
RIGHT OUTER JOIN
- OUTER JOIN "Table"에 초점을 맞춘 Join이다.
FULL OUTER JOIN
- 모든 데이터 조회를 위한 합집합 개념이다.
SQL-JOIN 실습
CREATE table t_customer(
customer_id int not null auto_increment,
region_code varchar(3) not null,
customer_name varchar(50) not null,
phone varchar(20) not null,
email varchar(50) not null,
address varchar(100) not null,
regist_date datetime default now(),
primary key(customer_id)
);
CREATE TABLE t_region(
region_code varchar(3) not null,
region_name varchar(10) not null,
primary key(region_code)
);
CREATE TABLE t_product(
product_code int not null auto_increment,
product_name varchar(50) not null,
price int,
primary key(product_code)
);
CREATE TABLE t_sales(
id int not null auto_increment,
customer_id int not null,
product_code int not null,
qty int not null,
sales_date datetime default now(),
primary key(id)
);
ALTER TABLE t_customer ADD CONSTRAINT fk_region_code FOREIGN KEY (region_code) REFERENCES t_region(region_code);
ALTER TABLE t_sales ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES t_customer (customer_id);
ALTER TABLE t_sales ADD CONSTRAINT fk_product_code FOREIGN KEY (product_code) REFERENCES t_product (product_code);
INSERT INTO t_region (region_code, region_name) VALUES
('02', '서울특별시'),
('031', '경기도'),
('032', '인천광역시'),
('033', '강원특별자치도'),
('041', '충청남도'),
('042', '대전광역시'),
('043', '충청북도'),
('044', '세종특별자치시'),
('051', '부산광역시'),
('052', '울산광역시'),
('053', '대구광역시'),
('054', '경상북도'),
('055', '경상남도'),
('061', '전라남도'),
('062', '광주광역시'),
('063', '전라북도'),
('064', '제주특별자치도');
INSERT INTO t_customer (customer_name, phone, email, address, region_code)
VALUES
('홍길동', '010-1234-5678', 'hong@example.com', '서울시 강남구', '02'),
('김철수', '010-9876-5432', 'kim@example.com', '경기도 수원시', '031'),
('이영희', '010-1111-2222', 'lee@example.com', '인천시 남구', '032'),
('박민지', '010-5555-7777', 'park@example.com', '강원도 춘천시', '033'),
('정기호', '010-9999-8888', 'jung@example.com', '대전시 중구', '042');
INSERT INTO t_product(product_name, price)
VALUES
('노트북', 1500000),
('스마트폰', 1000000),
('키보드', 50000),
('마우스', 30000),
('이어폰', 70000);
INSERT INTO t_sales (customer_id, product_code, qty)
VALUES
(1, 1, 2),
(2, 2, 1),
(3, 3, 5),
(4, 4, 3),
(5, 5, 2),
(1, 2, 3),
(3, 1, 1),
(2, 4, 2),
(4, 3, 4),
(5, 5, 1);
먼저 테이블을 생성하소 데이터를 삽입해주었다.
만들어진 테이블들의 관계도이다.
SQL-JOIN 쿼리 및 실행 결과
#제품별로 구매된 총수량과 총가격을 계산하여 출력
SELECT p.product_name as "제품명", sum(p.price) as "총가격", sum(s.qty) as "총수량"
FROM t_sales s
inner join t_product p on s.product_code = p.product_code
GROUP BY p.product_name;
#각 지역별로 고객수를 계산
SELECT r.region_name, count(c.customer_id) as "각 지역별 고객 수 "
FROM t_region r
left join t_customer c on c.region_code = r.region_code
GROUP BY r.region_name;
#특정 고객이 구매한 제품이름 출력
SELECT s.id, p.product_name, s.qty, p.price
FROM t_sales s
inner join t_product p
on s.product_code = p.product_code
where s.customer_id = 3;
#고객이 속한 지역별 총 구매량 출력
SELECT r.region_code, r.region_name, A.count
FROM t_region r
inner join(
SELECT c.region_code, SUM(s.qty) as count
FROM t_sales s
inner join t_customer c
on s.customer_id = c.customer_id
GROUP BY c.region_code) A
on r.region_code = A.region_code;
#제품의 평균가격보다 높은 가격의 제품 이름, 가격 출력
SELECT p.product_name, p.price
FROM t_product p
WHERE price > (SELECT avg(price) as avg from t_product);
#고객별 구매한 총 제품 수
SELECT c.customer_id, c.customer_name, count(s.qty) as total
FROM t_sales s
inner join t_customer c
on s.customer_id = c.customer_id
GROUP BY c.customer_id;
위 내용에 대한 설명을 따로 하는 것보다는 프로그래머스의 SQL문제들을 자주 풀어보면서 감을 잃지 않도록 해야겠다.
조인(JOIN) vs 서브쿼리(Sub Query)
조인과 서브쿼리는 때로 동일한 결과를 얻을 수 있다. 상황에 따라 사용하는 것이 다르다고 하다.
서브쿼리는 복잡한 SQL쿼리문에 많이 사용된다. 이는 보통 메인 쿼리라고 부르는 외부 쿼리가 있고, 외부 쿼리 내에 다른 퀴리문, 즉 내부 쿼리가 있는 구조이다.
반면에 조인은 여러 개의 쿼리를 필요로 하지는 않고 테이블을 서로 연결해 연결한 테이블로부터 필요한 열을 조회할 수 있도록 한다.
그리고 서브쿼리는 가독성이 좋지만 성능이 조인에 비해 매우 좋지 않다고 한다. 따라서 최신 MySQL은 사용자가 서브쿼리문을 사용하면 자체적으로 조인문으로 변환하여 실행시키도록 업데이트되었다.
728x90
반응형