상세 컨텐츠

본문 제목

51일차. DB 8 - ORDER BY, GROUP BY, HAVING, 서브쿼리 (페이징)

수업 일지/Oracle DBMS

by NayC 2021. 4. 30. 09:34

본문

728x90

그냥 3만 쓰면, 시작위치가 3이라 (3부터 나머지) -> LLO 나옴

 

docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#:~:text=SQL%20functions%20are%20built%20into,functions%20written%20in%20PL%2FSQL.

 

SQL Functions

Single-row functions return a single result row for every row of a queried table or view. These functions can appear in select lists, WHERE clauses, START WITH and CONNECT BY clauses, and HAVING clauses. Numeric Functions Numeric functions accept numeric i

docs.oracle.com

이거는 지금 보기 어렵다.

기초 체력이 생긴 이후 보기 (뭐가 중요한지 알고 난 이후!) 

 

 

함수는 따로 공부하기

 

beginner-sql-tutorial.com/oracle-functions.htm

 

Oracle SQL Functions

Oracle Built in Functions There are two types of functions in Oracle. 1) Single Row Functions: Single row or Scalar functions return a value for every row that is processed in a query. 2) Group Functions: These functions group the rows of data based on the

beginner-sql-tutorial.com


SELECT 구절, 직계함수는 공부한다~ 

 

내가 원하는 데이터를 원하는 방식으로 그루핑, 정렬할 수 있는 것

 

 

ODER BY

자바였으면 굉장히 복잡했을텐데, 오라클은 쉽다 쉽다~ 

 

Q. 근데 아까 순서로 따지면... 

    ORDER BY가 다른 거하고 사용될 때는~

   '박'씨 성을 가진 회원을, 이름을 오름차순으로 정렬

기본정렬 ASC는 생략 가능~!

UPDATE MEMBER SET NAME = '뉴렉' WHERE NAME IS NULL; 

이름 입력하지 않은건 다 뉴렉으로 바꾸는 명령

 

혹시 이름이 같은건, 뒤에 명령어를 더 줘서 나열할 수 있다. (만약에 NICKNAME 정렬도 ASC면 생략 가능!)

손에 익도록 해줘야 합니다.


*GROUP BY절*

 

일별, 월별 조회수 top 같은거 알고 싶을 때는 '집계'함수인 이 함수를 사용한닷

 

(?) 쓴 이유는 컬럼 뭘 쓸지 몰라서

(FILESE)하면 -> 0 나옴(다 NULL이어서 이거 나왔던)

(CONTENT) 가지고 개수를 세자 하면 -> 오류 (CLOP이 안되어서?)

 

() 여기에는 NULL이 들어가지 않는거를 넣어야 한다.

- NULL이 들어간 컬럼을 넣으면 정확한 개수가 안나올 수 있으니

 

ㅡㅡㅡㅡㅡ

 

'xx별' 

전체 개수 말고 'xx별 개수'를 세고 싶을 때 ex) 지역별, 20대별...

 

글 2개 쓴 사람이 2명 있구나~ 

집계, 다른 컬럼 사용 불가

왜냐하면 집계는 말그대로 집계니까 21명이면 21, 22명이면 22 이렇게 보이는 함수인데 다른 컬럼은 여러개니까 

 

근데 GROUP BY를 쓰면 가능해진다!

GROUP BY별! 세는거니까  

 

 

이거 다시 해보기 

- ID를 통해서 COUNT  // 한 거를 OREDER하는데 DESC로 하고, WRITER_ID는 ASC로 한다 (코드 해석) 

 

 

Q. 성별 회원 수를 뽑아달라

Q. 나이대를 알아보자 

BIRTHDAY 업데이트

코드가 ... 복잡하다.

그래서 이렇게 보통 나눠쓴다~~ 

 

여기서 YEAR는 테이블 이름임

YYY 써주면 표에 YYY 뜸~ 

 

 

ㅡㅡㅡㅡㅡ

 

* HAVING에 대해 알아보자 *

 

회원별/ 집계.

집계 결과, 게시글 수가 2 미만인거

 

GROUP BY 전에! WHERE 한다는게 논리가 이상한것

 

집계한 결과를 비교하고 싶을 때는 

HAVING은 GROUP BY를 위한 WHERE절이라고 생각하면 됨

 

그리고 (ID) 자리는 앞에랑 맞추어주기...(태희님이 (WRITER_ID) 쓰면 안되냐고 물어봄) 

코드 설명

WRITER_ID 별로! 카운드를 센다고 했잖아
WHERE COUNT(ID) 이 의미는 : WRITER_ID 옆에 COUNT들이 표시된 표가 나타날건데~ 그게 <=2인걸 찾겠다는거지

cf) 복습하면서 WHERE WRITER_ID <=2 라고 적어서 정리함. 

 

 

 

"정말 많이 씁니다. 단순 이해가 아니라 정말 활용할 줄 알아야 합니다."


* 서브 쿼리를 알아보자 * (JOIN할 때? 어제 PAGER에서 더 해보기로 했던 내용?)

 

TABLE을 가지고 만든 결과 집합을! 다시 SELECT할 수 있을까? YES

- 사실 FROM절에 오는건 '격자 형태의 결과물'이 오는 자리

  테이블만 있었을 때는 그냥 테이블만 넣어주었던거지

어제 ROWNUM BETWEEN 6 AND 10이 선택 안되었었던 이유를 생각해보면, 이렇게 해주는 이유를 바로 알 수 있음

- 대신 ROWNUM 이름은 바꾸어주어야 (안쪽의 ROWNUM을 선택해야 하니!!) 

  안쪽 별칭을 써서 사용해준다. 

-> 그래서 지금 위에 코드는 잘못된 거

    ROWNUM이 안쪽인지 바깥쪽인지 모르기에! 그래서 안쪽에 ROWNUM의 별칭을 주어야함! 

 

별칭 주깃 

NOTICE.* 이거 이해하기

- NOTICE 모든 부분 다 가지고 오라는건가? 

-> NOTICE의 모든 컬럼! 을 가지고 오라는게 맞다. 

이거는 예시

원래는 앞에 컬럼들 써줄 때 NOTICE.ID FROM NOTICE 이런식으로 써주는거였는데 삭제한거였음

그래서 NOTICE.다음에 * 을 써줘서는 모든 컬럼들을 가지고 오라는 뜻이 되는 것>.< 

 

 

cf) 만약 전체가 컬럼이 아니라 content만 가지게 오고 싶으면 

SELECT * FROM (SELECT ROWNUM Y, CONTENT FROM NOTICE)
WHERE Y BETWEEN 6 AND 10;

이렇게만 적으면 되지~ 

 

 

() 는 오라클에서도 수학에서와 마찬가지로 먼저 실행하는 것

Q. 1에서 5까지 자르는데, 1페이지가 등록일자 기준으로 제일 최근것부터 나오게 해주기

 

 

안에다가 줘야한다고 한다. 

근데 결과는 왜 같지?

-> WHERE 절이 먼저 실행됨. 그래서 전체!를 대상으로가 아니라 1-5번 뽑아준 것에 대해서! ORDER했기 때문에 이러면 안 됨. (우연히 심했던거라고 한다 ㅋㅋㅋ) 위에서 먼저! 정렬해주기!

 

지금 문제는 ORDER NUMBER 때문에 뒤죽박죽 되었다고 함.

 

//

 

SELECT / FROM / WHERE / GROUP BY / HAVING / ORER BY 

이지만 SELECT가 가장 마지막에 실행 

 

정렬한다음에! 번로 붙이는건 없나.. (지금 문제는 번호 붙이고 정렬해버려서 문제)

정렬 끝내고 번호를 붙이자.

-> 서브쿼리 중첩 

    FROM절에서 () 미리 정렬해주는 것

 

정렬 / 번호 붙이고 / 그리고 아래서 번호 자르는 것 

 

AS N 이라고 별칭 붙이고 실행 

(왜냐하면 뒤에 ()는 NOTICE가 아니기에) 

-> AS N 하면 오류남

    결과 집합에는 AS를 쓸 수 없다고 한다. 

이거 예제 이해해야해~~~~

 

코드 내려쓰기 해서 보기 좋게 해주기

 

 

지금 SELECT가 3개임

 

Q. 사용자가 제목으로 검색을 할 경우 

- WHERE TITLE LIKE '%A%' 

이거를 어디에다가 꽂아야 하나? 

 

1. 제일 바깥에 

2. 위에 SELECT

3. 아래 SELECT 

 

-> 무조건 필터링은 제일 안쪽에 해줘야 한다! 3번! 

 

월요일부터는 이 코드를 기준으로 작성할거다~~~ 

 

728x90
반응형

관련글 더보기