Database

공부하면서 알게된 사실들

philo0407 2020. 10. 1. 23:19

갯수 제한할때

ROWNAME과 ORDER BY를 혼용해서 사용할 때가 있는데.. 주의해야 한다.

ROWNAME이 ORDER BY보다 먼저 실행되기 때문에.. 본인 같은 경우 서브 쿼리 형태로 작성하였다.

SYSDATE + TO_CHAR 는 짝끙

JOIN에서

INNER, OUTER 등 명확한 명시를 안 하고

WHERE절에서 ID외래키로 JOIN한 것은 INNER조인이다!


 

SET STATISTICS TIME ON; --SQL Server 쿼리 수행 시간 측정
SELECT
    e.first_name + ' ' + e.last_name employee,
    m.first_name + ' ' + m.last_name manager,
	m2.first_name + ' ' + m2.last_name manager2,
	m3.first_name + ' ' + m3.last_name manager3
FROM
    sales.staffs e
	LEFT JOIN 
		sales.staffs m 
	ON m.staff_id = e.manager_id
		LEFT JOIN 
			sales.staffs m2
		ON m2.staff_id = m.manager_id
			LEFT JOIN
				sales.staffs m3
			ON m3.staff_id = m2.manager_id

ORDER BY
    manager3, manager2, manager, employee;
SET STATISTICS TIME OFF;

차차상위 매니저 검색하기

반복이 된다..

나중에 이럴일이 많이 생기면 for문이나 변수 지정등에 대해서 공부하는 것도 좋을 것 같다.

오라클에서 수행 시간 검색하기

 

SET TIMING ON;

 

이러면 메세지에 Elapsed 라고 찍힌다.


조인을 할 때 여러 방식이 있다

 

SELECT [] 
FROM TABLE_A, TABLE_B
WHERE TABLE_A.ID = TABLE_B.ID (+)

 

SELECT [] 
FROM TABLE_A A
LEFT JOIN
  FROM TABLE_B B
ON
  A.ID = B.ID;

 

 

밑에 방식을 사용하는 것이 좋다.

WHERE와 ON절을 나눠서 용도에 맞게 사용이 가능하며

다른 SQL 언어와도 호환이 된다.


self join에서 >와 <>에 대해 조건 걸었을 떄 후자가 row가 2배 많다. 이것은 신승범쌤 순열조합 표그리기를 생각하면 쉽게 이해할 수 있다.

안선생이 내준 2번 문제이다.

self join으로 차상위 칼럼을 나타내는 것이 쉽지 않았다.

select 
	cus.first_name + ' ' + cus.last_name as "customer",
	emp.first_name + ' ' + emp.last_name as "employee",
	mgr.first_name + ' ' + mgr.last_name as "mgrloyee"
from sales.orders ord
	inner join
		sales.customers cus
	on
		cus.customer_id = ord.staff_id
	inner join
		sales.staffs emp
	on
		emp.staff_id = ord.staff_id
	inner join
		sales.staffs mgr
	on
		mgr.staff_id = emp.manager_id;

VIEW 예제.. SQL Server에서는 먹히지 않는다.. 샴실에서 QueryBox로 해 보자.

 

http://www.gurubee.net/lecture/1036

 

VIEW 테이블

뷰란? - 뷰는 하나의 가상 테이블이라 생각 하면 된다. - 뷰는 실제 데이터가 저장 되는 것은 아니지만 뷰를 통해 데이터를 관리 할수 있다..

www.gurubee.net

 

 

 

 

--SQL> CREATE OR REPLACE VIEW name_query
--     AS
--       SELECT a.ename, b.dname
--       FROM  emp a, dept b
--       WHERE a.deptno = b.deptno
--         AND b.deptno = 20;

---- 뷰를 이용한 조회
--SQL> SELECT * FROM name_query; 

-- 오더에서 오더아이템으로.. 또 거기서 프로덕의 네임으로

--select * from sales.orders;
--select * from sales.order_items;

CREATE VIEW getPrdName
AS
	SELECT product_name
	FROM
		sales.orders ord
	INNER JOIN
		sales.order_items ordItem
	ON
		ord.order_id = ordItem.order_id
	INNER JOIN
		production.products prd
	ON
		prd.product_id = ordItem.product_id;

SELECT * FROM getPrdName;

 

헛 ! 됏다능!