프로그래밍/자바(java) 융합개발자 2차

[취성패] 자바 배우기 - 5일차 일지 2(부속질의 - 스칼라, 인라인 뷰, 중첩질의1)

aSpring 2020. 12. 18. 15:31
728x90
728x90

목차

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개)

 

-> 비상관

728x90
728x90