DB

[Oracle] 알짜 SQL 기본 상식 10가지

1223gogo 2023. 3. 19. 22:34

ALL

- 서브쿼리의 여러개의 결과를 모두 만족해야한다.

SELECT *
  FROM userTBL 
 WHERE height > ALL (SELECT height FROM userTBL WHERE addr = '경남');

ANY(SOME)

- 서브쿼리의 여러개의 결과 중 한가지만 만족해도 된다.

- " = ANY "는 "IN"과 같은 의미로 사용된다.

SELECT *
  FROM userTBL 
 WHERE height > ANY (SELECT height FROM userTBL WHERE addr = '경남');
SELECT *
  FROM userTBL 
 WHERE height = ANY (SELECT height FROM userTBL WHERE addr = '경남');
SELECT *
  FROM userTBL 
 WHERE height IN (SELECT height FROM userTBL WHERE addr = '경남');

DISTINCT

- 중복된 것은 한개씩만 보여주면서 출력된다.

SELECT DISTINCT addr
  FROM userTBL

ROWNUM

- ORDER BY 를 사용하지 않고 ROWNUM을 사용하면 항상 테이블에 저장된 상위의 5건만 조회한다.

- 즉 조회할 때마다 같은 데이터가 늘 반복해서 나올 수 밖에 없다.

SELECT employee_id, hire_date
  FROM employees
 WHERE ROWNUM <= 5

SAMPLE(퍼센트)

- '퍼센트'는 0초과 100미만의 값이어야한다.

- SAMPLE(퍼센트) 문을 사용하면 임의의 데이터 5%를 추출한다.

- employees의 총 건수가 107 건인 경우, 107*0.05=5.35 -> 약 5건이 반환된다.

SELECT employee_id, hire_date
  FROM employees SAMPLE(5)

CAST() 함수

- 소수점을 조절하고 싶다면 CAST() 함수를 사용하면 된다.

- CAST(숫자 AS 변환할형식)으로 사용한다.

SELECT userID, CAST(AVG(amount) AS NUMBER(5,3)) AS "평균구매개수"
  FROM buyTBL
 GROUP BY userID
USERID 평균구매개수
BBK 4.75
SSK 5
EJW 1.333

COUNT() 함수

- COUNT(*) -> 모든 개수 출력

- COUNT(열이름) -> 해당 열에서 NULL값인 것은 제외하고 카운트 한다.

ROLLUP() 함수

SELECT idNum, groupName, SUM(price*amount) AS "비용"
  FROM buyTb1
 GROUP BY ROLLUP(groupName, idNum)
IDNUM GROUPNAME 비용
7 서적 75
8 서적 30
11 서적 15
(null) 서적 120
5 의류 150
9 의류 50
(null) 의류 200
(null) (null) 320

- idNum이 NULL로 되어있는 추가행이 각 그룹의 소합계를 의미하고, 또 마지막 행은 각 소합계의 합계, 즉 총합계의 결과가 나왔다.

- idNum은 Primary Key이며 그룹화가 되지않는 효과를 위해서 넣어준 것이다. 약 소합계 및 총합계만 필요하다면 아래의 쿼리(ROLLUP에 idNum을 뺌.)를 이용하면 된다.

SELECT groupName, SUM(price*amount) AS "비용"
  FROM buyTb1
 GROUP BY ROLLUP(groupName)
GROUPNAME 비용
서적 120
의류 200
(null) 320

GROUPING_ID() 함수

- GROUPING_ID() 함수의 결과가 0이면 데이터이고, 1이면 합계를 위해서 추가된 열이라고 보면 된다.

SELECT groupName, SUM(price*amount) AS "비용"
     , GROUPING_ID(groupName) AS "추가행여부"
  FROM buyTb1
 GROUP BY ROLLUP(groupName)
GROUPNAME 비용 추가행여부
서적 120 0
의류 200 0
(null) 320 1

CUBE() 함수

- ROLLUP()과 비슷한 개념이지만 CUBE()는 다차원 정보의 데이터를 요약하는데 더 적당하다.

WITH절

[ WITH <Sub Query> ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ]
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ] 
[ ORDER BY order_expression [ASC | DESC ] ]

- WITH절은 CTE(Common Table Expression) 을 표현하기 위한 구문이다.

- CTE는 기존의 뷰, 파생 테이블, 임시테이블 등으로 사용되던 것을 대신할 수 있으며, 더 간결한 식으로 보여지는 장점이 있다.

비재귀적 CTE

- 단순한 형태이며 복잡한 쿼리문장을 단순화시키는데에 적합하게 사용될 수 있다.

WITH CTE_테이블이름(열 이름)
AS
(
    <쿼리문>
)
SELECT 열 이름 FROM CTE_테이블이름
WITH abc(userID, total)
AS
( SELECT userID, SUM(price*amount)
    FROM buyTb1
   GROUP BY userID
 )
 
 SELECT *
   FROM abc
  ORDER BY total DESC

- 복잡한 쿼리를 WITH구문으로 만들어서 SELECT문을 단순화 시켜준다.

WITH
AAA(userID, total)
  AS
    (SELECT userID, SUM(price*amount) FROM buyTb1 GROUP BY userID),
BBB(sumtotal)
  AS 
    (SELECT SUM(total) FROM AAA),
CCC(sumavg)
  AS 
    (SELECT sumtotal/(SELECT count(*) FROM buyTb1) FROM BBB)
    
SELECT * FROM CCC

- CCC 쿼리문에서는 AAA, BBB를 참조할 수 있지만, AAA의 쿼리문에는 BBB나 CCC를 참조할 순 없다.

- 즉, 아직 정의되지 않은 CTE를 미리 참조할 수 없다.

재귀적 CTE

- 자기자신을 반복적으로 호출한다는 의미를 내포한다.

WITH CTE_테이블이름(열이름)
AS
(
    <쿼리문1: SELECT * FROM 테이블A>
    UNION ALL
    <쿼리문2: SELECT * FROM 테이블A JOIN CTE_테이블이름>
)
SELECT * FROM CTE_테이블이름

- 트리구조로 되어있는 조직 테이블을 재귀적으로 호출할 때 사용하곤 한다.

- 쿼리문1 : 앵커멤버(Anchor Member:AM), 쿼리문2 : 재귀멤버(Recursive Member:RM) 라고 지칭한다. 

<empTb1>

emp(직원이름) manager(상관이름) department(부서)
나사장 없음(NULL) 없음(NULL)
김재무 나사장 재무부
김부장 김재무 재무부
이부장 김재무 재무부
우대리 이부장 재무부
지사원 이부장 재무부
이영업 나사장 영업부
한과장 이영업 영업부
최정보 나사장 정보부
윤차장 최정보 정보부
이주임 윤차장 정보부
WITH empCTE(empName, mgrName, dept, empLevel)
AS
(
    (SELECT emp, manager, department, 0
       FROM empTb1
      WHERE manager = '없음' ) --상관이 없는 사람이 사장
     UNION ALL
    (SELECT empTb1.emp, empTb1.manager, empTb1.department, empCTE.empLevel+1
       FROM empTb1 INNER JOIN empCTE
         ON empTb1.manager = empCTE.empName)
)
SELECT * FROM empCTE ORDER BY dept, empLevel;

<결과값>

empName mgrName dept empLevel
나사장 없음 없음 0
이영업 나사장 영업부 1
한과장 이영업 영업부 2
김재무 나사장 재무부 1
김부장 김재무 재무부 2
이부장 김재무 재무부 2
우대리 이부장 재무부 3
지사원 이부장 재무부 3
최정보 나사장 정보부 1
윤차장 최정보 정보부 2
이주임 윤차장 정보부 3

http://www.yes24.com/Product/Goods/58731074

 

 

이것이 오라클이다 - YES24

80여 가지 실습으로 실무 감각을 익히는 실전형 오라클 입문서오라클을 처음 접하거나 단지 이론만으로 학습한 입문자는 실제 현업에서의 업무에 대한 부담이 크다. 이 책은 바로 이런 입문자를

www.yes24.com