-
[SQL 기초] join문(테이블A+테이블B)카테고리 없음 2020. 5. 14. 21:56
연습문제 : www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
SQL Tryit Editor v1.6
WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, Opera, and Edge(79). If you use another browser you will still be able to use our Try SQL Editor, but a different ver
www.w3schools.com
프로그래머스 : programmers.co.kr/learn/courses/30/parts/17046
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
join의 경우는 크게 4가지로 나뉨.
1. A inner join B : 교집합만
2. A left outer join B : 왼쪽 table을 기준으로
3. A right outer join B : 오른쪽 table을 기준으로
4. A full outer join B : 양쪽 table 겹치는 거 없어도 합치기
join **합쳐지고 공백칸은 NULL이란 값이 들어감.(RDBMS인 경우)
1. A inner join B
-교집합!!
-열을 기준으로 두 테이블 모두 가지고 있는 값만 남는다.
-그냥 join이라고 말하면 대체적으로 inner join 말함.
2. A left outer join B
- left로 설정된 테이블은 유실되지 않고, 일치하는 데이터를 right에서 찾아 붙여준다.
- 특정 열을 기준으로 삼고, A테이블에 B테이블 행이 추가되는 것이다.(결과 행 수 = A)
--> A right out join B는 기준이 오른쪽 B 테이블이다.
[사이트 예시 3개 / null 다루는 법]
* (사이트 예시) 주문정보와 고객 정보를 같이 보고 싶을 때
이런 식으로 A join B 다음에 ON을 써서 테이블A의 어떤 열 이랑 테이블B의 어떤 열이랑 합칠지 적어줘야 된다.
SELECT * FROM Customers INNER JOIN Orders ON Orders.CustomerID = Customers.CustomerID ORDER BY Orders.CustomerID;
2-3번째 줄을 보면, Orders테이블의 CustomerID와 Customers테이블의 CustomerID을 합친다는 뜻이다.
예시1 결과 테이블 두개 합치고 customer ID를 기준으로 정렬했는데(4번째 줄 코드) customerID가 1인 사람이 없어짐!!
이유는 Orders테이블에 정보가 없어서 그렇다.(교집합에서 나가리~)
1번 고객은 상품 산 것이 없나보다,,,,
그리고 customerID가 4인 사람은 2번 나오는데 이유는 4번사람이 물건을 두번사서!!!
그럼 여기서 좀더 업그레이드하면↓
*(사이트 예시) 고객마다 주문개수를 알고 싶으면
SELECT Customers.CustomerID, Customers.CustomerName, COUNT(Orders.OrderID) AS "구매횟수" FROM Customers INNER JOIN Orders ON Orders.CustomerID = Customers.CustomerID GROUP BY Customers.CustomerID, Customers.CustomerName ORDER BY Orders.CustomerID;
예시2 결과 이렇게 나옴!!! 근데 여기서 구매횟수가 0인건 나오지 않는다.....
inner join을 썼기 때문에 안 산 사람들은 ORDER 테이블에 정보조차 없어 이미 걸러진 것이기 때문이다.
구매횟수가 0인 사람들도 알고 싶으면 left outer join을 사용하면됨!!!
(* 사이트 예시) 고객마다 주문개수를 알고싶을 떄 (구매횟수도 0 포함)
SELECT Customers.CustomerID, Customers.CustomerName, COUNT(Orders.OrderID) AS "구매횟수" FROM Customers LEFT OUTER JOIN Orders ON Orders.CustomerID = Customers.CustomerID GROUP BY Customers.CustomerID, Customers.CustomerName ORDER BY Orders.CustomerID;
예시3 결과 이렇식으로 나옴.!!
그리고 NULL 데이터를 다루는 법도 있다.
table 끼리 합쳐지고 나서 공백칸은 자동으로 NULL이란 값이 들어간다.
보통 일치하는지를 표현할 때는 =을 사용하지만
NULL은 IS연산자를 사용한다.
SELECT column_names FROM table_name WHERE column_name IS NULL;
SELECT column_names FROM table_name WHERE column_name IS NOT NULL;
+프로그래머스 예제도 해봐야 겠다. 과연^________________^