-
008. UNION / UNION ALL, INTERSECT / MINUS, NATURAL JOIN, USINGSsY/Class 2023. 3. 31. 17:48728x90
2023.3.31 (금)
SCOTT 계정 실습
- .UNION / UNION ALL
- 예제 풀이
--○ 지금까지 주문받은 모든 데이터를 활용하여 -- 제품별 총 주문량을 조회하는 쿼리문을 구성한다. /* ---------------------------- 제품코드 주문량 ---------------------------- .... XX ... XXX : ---------------------------- */ SELECT JECODE "제품코드",SUM(JUSU) "총주문량" FROM ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP UNION ALL SELECT JECODE, JUSU FROM TBL_JUMUN ) T GROUP BY T.JECODE; --==>> /* 초코파이 20 도리토스 30 꼬북칩 10 새우깡 20 쿠크다스 50 포테토칩 20 오감자 26 포카칩 50 홈런볼 140 빼빼로 30 칸쵸 50 */ SELECT JECODE "제품코드",SUM(JUSU) "총주문량" FROM ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP UNION SELECT JECODE, JUSU FROM TBL_JUMUN ) T GROUP BY T.JECODE; --> 이 문제를 해결하는 과정에서는 UNION 을 사용해서는 안된다. -- →JECODE 와 JESU 를 조회하는 과정에서 중복된 행을 제거하는 상황이 발생.
- INTERSECT / MINUS (→ 교집합 / 차집합)
- INTERSECT (교집합)
SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN; --==>> // 주문백업 테이블에도 10개짜리 새우깡이 있고 주문 테이블에도 10개짜리 새우깡이 있다... /* 새우깡 10 칸쵸 20 포카칩 20 홈런볼 40 */
- MINUS (차집합)
SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP MINUS SELECT JECODE, JUSU FROM TBL_JUMUN; --==>> // INTERSECT 를 제외한 나머지 부분 ... /* 도리토스 30 빼빼로 30 오감자 12 초코파이 20 쿠크다스 30 포테토칩 20 */
--○ TBL_JUMUNBACKUP 테이블과 TBL_JUMUN 테이블에서 -- 제품코드와 주문량의 값이 똑같은 행의 정보를 -- 주문번호, 제품코드, 주문수량, 주문일자 항목으로 조회한다.
더보기SELECT JUNO "주문번호", JECODE "제품코드", JUSU"주문수량", JUDAY "주문일자" FROM TBL_JUMUN; SELECT B.JUNO "주문번호", T.JECODE "제품코드", T.JUSU"주문량", B.JUDAY "주문일자" FROM ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN ) T , TBL_JUMUNBACKUP B WHERE T.JECODE = B.JECODE(+) AND T.JUSU = B.JUSU(+) UNION ALL SELECT J.JUNO "주문번호", T.JECODE "제품코드", T.JUSU"주문량", J.JUDAY "주문일자" FROM ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN ) T , TBL_JUMUN J WHERE T.JECODE = J.JECODE(+) AND T.JUSU = J.JUSU(+); -- 희정언니 코드 SELECT U.JUNO "주문번호", I.JECODE "제품코드", I.JUSU "주문량", U.JUDAY "주문일자" FROM ( SELECT JUNO, JECODE, JUSU, JUDAY FROM TBL_JUMUNBACKUP UNION ALL SELECT JUNO, JECODE, JUSU, JUDAY FROM TBL_JUMUN ) U , ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN ) I WHERE I.JECODE = U.JECODE AND I.JUSU = U.JUSU ORDER BY 2,4;
--방법1 SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN; --==>> /* 새우깡 10 칸쵸 20 포카칩 20 홈런볼 40 */ -------------------------------------------------------------------------------------- SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUNBACKUP INTERSECT SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUN; --==>> 조회결과 없음 --// 네개의 항목이 모두 일치하는 코드를 찾아서 조회하겠다 라는 의미로 변질됨 -------------------------------------------------------------------------------------- SELECT T2.JUNO "주문번호",T1.JECODE "제품코드", T1.JUSU "주문수량", T2.JUDAY "주문일자" FROM ( SELECT JECODE, JUSU FROM TBL_JUMUNBACKUP INTERSECT SELECT JECODE, JUSU FROM TBL_JUMUN ) T1 JOIN ( SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUNBACKUP UNION ALL SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUN ) T2 ON T1.JECODE = T2.JECODE AND T1.JUSU = T2.JUSU; --==>> /* 2 새우깡 10 2001-10-01 10:05:10 6 홈런볼 40 2001-10-03 10:05:10 8 칸쵸 20 2001-10-05 11:05:10 9 포카칩 20 2001-10-06 15:05:10 938767 칸쵸 20 2023-03-30 16:32:59 938771 홈런볼 40 2023-03-30 16:34:15 938772 새우깡 10 2023-03-30 16:34:38 938776 포카칩 20 2023-03-30 16:36:23 */
--방법2 SELECT * FROM ( SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUNBACKUP UNION ALL SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUN ) T WHERE T.JECODE IN ('새우깡','홈런볼','칸쵸','포카칩') AND T.JUSU IN (10,20,40); --> // 조건절에 논리적인 허점이 있기때문에 안 됨 SELECT * FROM ( SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUNBACKUP UNION ALL SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUN ) T --WHERE JECODE||JUSU IN ('새우깡10','홈런볼40','칸쵸20','포카칩20', '새우깡10','홈런볼40','칸쵸20','포카칩20'); --WHERE CONCAT (JECODE, JUSU) IN DISTINCT('새우깡10','홈런볼40','칸쵸20','포카칩20', '새우깡10','홈런볼40','칸쵸20','포카칩20'); --WHERE CONCAT (JECODE, JUSU) IN ('새우깡10','홈런볼40','칸쵸20','포카칩20'); WHERE CONCAT (JECODE, JUSU) =ANY ('새우깡10','홈런볼40','칸쵸20','포카칩20'); --// 위의 네 줄은 동일한 구문임 // 그러나 찾는 걸 너무 직접 찾아서 넣었다... SELECT CONCAT (JECODE, JUSU) FROM TBL_JUMUNBACKUP INTERSECT SELECT CONCAT (JECODE, JUSU) FROM TBL_JUMUN; --==>> /* 새우깡10 칸쵸20 포카칩20 홈런볼40 */ SELECT * FROM ( SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUNBACKUP UNION ALL SELECT JUNO,JECODE,JUSU,JUDAY FROM TBL_JUMUN ) T WHERE CONCAT (JECODE, JUSU) =ANY (SELECT CONCAT (JECODE, JUSU) FROM TBL_JUMUNBACKUP INTERSECT SELECT CONCAT (JECODE, JUSU) FROM TBL_JUMUN); --// 서브쿼리 형태로 집어넣어서 조회 가능 --==>> /* 2 새우깡 10 2001-10-01 10:05:10 6 홈런볼 40 2001-10-03 10:05:10 8 칸쵸 20 2001-10-05 11:05:10 9 포카칩 20 2001-10-06 15:05:10 938767 칸쵸 20 2023-03-30 16:32:59 938771 홈런볼 40 2023-03-30 16:34:15 938772 새우깡 10 2023-03-30 16:34:38 938776 포카칩 20 2023-03-30 16:36:23 */
동일환경 만들기
더보기--환경체크 통일 DESC TBL_JUMUN; --==>> /* 이름 널? 유형 ------ -- ------------ JUNO NUMBER JECODE VARCHAR2(30) JUSU NUMBER JUDAY DATE */ SELECT COUNT(*) FROM TBL_JUMUN; --==>> 12 SELECT COUNT(*) FROM TBL_JUMUNBACKUP; --==>> 10
- 참조용
- NATURAL JOIN
SELECT D.DEPTNO, D.DNAME, E.ENAME, E.SAL FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO; --// -------------------- 연결고리 컬럼 SELECT DEPTNO, DNAME, ENAME, SAL FROM EMP NATURAL JOIN DEPT; --==>> // 두개의 테이블에서 관계를 맺는 컬럼이 "하.나"일 때, 오라클에게 찾아달라고 하는 JOIN + ON 조건을 붙이지 않아도 됨. // 하지만 성능이 너무 떨어지게 됨 -- // 바람직하지는 않지만, 잠깐 확인하나 해보는 용도로 사용하는 것 정도는 괜찮음 /* 10 ACCOUNTING CLARK 2450 10 ACCOUNTING KING 5000 10 ACCOUNTING MILLER 1300 20 RESEARCH JONES 2975 20 RESEARCH FORD 3000 20 RESEARCH ADAMS 1100 20 RESEARCH SMITH 800 20 RESEARCH SCOTT 3000 30 SALES WARD 1250 30 SALES TURNER 1500 30 SALES ALLEN 1600 30 SALES JAMES 950 30 SALES BLAKE 2850 30 SALES MARTIN 1250 */
- USING 문
SELECT DEPTNO, DNAME, ENAME, SAL FROM EMP JOIN DEPT USING(DEPTNO); --==>> // USING 문 // 많이 활용하기보다는 참조용으로 생각 -- // USING() 안에 들어있는 컬럼을 사용해서 JOIN 을 해달라는 의미 /* 10 ACCOUNTING CLARK 2450 10 ACCOUNTING KING 5000 10 ACCOUNTING MILLER 1300 20 RESEARCH JONES 2975 20 RESEARCH FORD 3000 20 RESEARCH ADAMS 1100 20 RESEARCH SMITH 800 20 RESEARCH SCOTT 3000 30 SALES WARD 1250 30 SALES TURNER 1500 30 SALES ALLEN 1600 30 SALES JAMES 950 30 SALES BLAKE 2850 30 SALES MARTIN 1250 */
(과제 : 95 + α 제 풀기)
728x90'SsY > Class' 카테고리의 다른 글
010. 무결성, 제약 조건(PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK) 추가/ 변경/ 삭제 (0) 2023.04.04 009. 정규화(Normalization), Primary Key, 관계 (0) 2023.04.03 007. SEQUENCE 와 ROW_NUMBER, JOIN(SQL 1992/1999 CODE), UNION / UNION ALL (0) 2023.03.30 006. 그룹 함수, 분석 함수(ROLLUP / CUBE / GROUPING SETS), HAVING절, 서브상관쿼리, ROW_NUMBER() / SEQUENCE() (0) 2023.03.29 005. 서브쿼리, 인라인뷰, 등수 함수, 그룹 함수 와 주의점 (0) 2023.03.29