목차
1. 내장 함수
2. 부속 질의
3. 뷰
4. 인덱스
02. 부속 질의
- 스칼라 부속 질의 - SELECT 부속 질의
- 인라인 뷰 - FROM 부속 질의
- 중첩 질의 - WHERE 부속 질의
1. 스칼라 부속 질의 - SELECT 부속 질의 : 한 개의 값(value)을 대신할 수 있음 -> 상관, 비상관 모두 가능
select((select from where) , value , value , value , ) from
ㄴ> 하나의 값 형태로 나올 것
스칼라 <-> 벡터 ex) 버거킹의 위치 (20, 50, 70)
2. 인라인 뷰 - FROM 부속질의 : 하나의 표 형태로 나옴 -> 무조건 비상관 : 독립적인 것
select * -> 메인 안에 표
from (
);
3. 중첩 질의 - WHERE 부속 질의 -> 상관, 비상관 모두 가능
(nested)
select
from
where price = (select from wherer);
ㄴ>하나의 값 ㄴ> 값이 하나만 나올 수도 있고, 표로 나올 수도 있고
in 인 경우 1열 다행의 여러 정보가 나올 수도 있고
exists 인 경우 1행 다열의 여러 정보가 나올 수도 있다.
1. 스칼라 부속 질의 - SELECT 부속 질의
- 주로 상관이 많이 나옴
- 상관 cs.custid=od.custid로 연결 : 항상 안쪽 -> 바깥쪽으로 연결
UPDATE Orders
SET bookname = (Select bookname
FROM book
WHERE book.bookid = Orders.bookid); -> 요 부분도 스칼라 부속 질의(값 1개 나옴)
-> 여기서의 =는 같다는 의미가 아니라 오른쪽 내용을 bookname에 저장하는 것
ex) a = a+3 -> a+3한 값을 a에 저장하라라는 뜻
cf) name = '박지성' -> 이 때는 같다는 의미
질의 4-12 마당 서점의 고객별 판매액을 group by를 통해 보이시오(결과는 고객 이름과 고객별 판매액을 출력)
-> 아래는 상관으로 풀이한 것
select (select name /* 스칼라 부속질의 : 구매한 사람들의 이름만 추출 */
from customer cs
where cs.custid = od.custid) "name", sum(saleprice) "total" /* 이름별로 합이 나옴 -> 그룹화 필요 */
from orders od
group by od.custid; /* 여기에서 custid를 기준으로 그룹화*/
-- group by custid로 했으면 select는 custid가 나와야 하는데
-- name을 얻고 싶으니까 부속질의로 custid를 연결해서 name를 구함
-> 상관일 땐 메인부터 처리 후 부속 질의를 처리해서 결과 냄
: 고객 id별로 합계를 구하는 과정에서 부속 질의를 통해 고객 id를 통해 name을 나타냄
질의 4-12 Orders 테이블에 각 주문에 맞는 도서 이름을 입력하시오.
1) 먼저 Orders 테이블에 bookname이라는 속성을 넣어줘야 함
alter table Orders add bookname varchar2(25);
2) Book table에서 bookid에 맞는 bookname을 가져와 Order 테이블에 입력해줘야 함
Update Orders
set bookname = ( select bookname from book
where book.bookid = orders.bookid);
-> 스칼라 : 1개의 값 자리에 들어감
-> book과 order를 상관시켜서 풀이한 것
2. 인라인 뷰 - FROM 부속 질의
질의 4-14 고객번호가 2 이하인 고객의 판매액을 보이시오(결과는 고객 이름과 고객별 판매액 출력)
select cs.name, sum(saleprice) "total" /* 결과 : 고객이름, 고객별 판매액 -> 고객이름으로 그룹화 */
from (select custid, name /* 고객번호가 2이하인 고객의 이름 필요 -> select name */
from customer /* custid도 구하는 이유는 여기서 추출한 custid로 밑에서 서로 상관시켜야 하기때문 */
where custid <=2) cs, /* 고객 번호가 2 이하인 고객의 고객명, 고객번호 -> cs */
orders os
where cs.custid = os.custid /* cs와 orders를 custid로 연결 */
group by cs.name; /* 고객별 판매액 나타내기 위해 고객이름으로 그룹화 */
-- 독립, 비상관 -> 가상 테이블
-- 고객 테이블에서 custid가 2이하인 custid와 name을 불러온다. -> 1, 2번 두개를 걸러내서
-- orders와 조인해서 custid 1, 2에 해당하는 주문가격의 합계를 구하고 이름 표시.
인라인 뷰 아래에 있는 것 상관 XXXXXX -> 비상관, 조인한 것
- 인라인 뷰 : cs라는 이름의 테이블로 생각하면 됨
3. 중첩 질의 - WHERE 부속 질의
-> SOME = ANY
- 상관이 더 많다.
- WHERE A > B
-> A 또는 B 중 하나가 부속 질의로 들어간다.
-> WHERE 부속 질의는 하나의 값으로 들어가서 값끼리 1 : 1 비교가 가능하게 한다.
- 비교 연산자 : 부속 질의가 반드시 단일 행, 단일 열을 반환해야 하며, 아닐 경우 질의를 처리할 수 없음
질의 4-15 평균 주문금액 이하의 주문에 대해서 주문번호와 금액을 보이시오.
select orderid, saleprice
from orders
where saleprice <= (select avg(saleprice)
from orders);
saleprice <= ave(saleprice) from orders
값(모든 값) 전체 평균(값1개)
-> 비상관
'프로그래밍 > 자바(java) 융합개발자 2차' 카테고리의 다른 글
[취성패] 자바 배우기 - 7일차 일지(PL/SQL) (0) | 2020.12.23 |
---|---|
[취성패] 자바 배우기 - 6일차 일지(부속질의 - 스칼라, 인라인 뷰, 중첩질의2) (0) | 2020.12.21 |
[취성패] 자바 배우기 - 5일차 일지(SQL 고급 - 내장함수) (0) | 2020.12.18 |
[취성패] 자바프로그래밍 - 4일차 학습일지(SQL-데이터 정의어) (0) | 2020.12.17 |
[취성패] 자바프로그래밍 - 3일차 학습일지(SQL-조인, 부속질의) (0) | 2020.12.16 |