SELECT 구절

SELECT / WHERE/ GROUP BY / HAVING/ ORDER BY

 

내장함수

-문자열관련함수

-변환함수

-날짜함수

-NULL 관련함수

-집계함수

 

SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY , ASC ,DESC (무조건외우기)
  • 집계한결과쓸때는 HAVING
  • FROM 에는 격자형태 결과물이오면된다
  • ROWNUM: 결과집합에 대한 가상의 순번
  • 쿼리문 작성순서와 실행순서가 다르다.

WHERE절과 HAVING절의 차이

  • WHERE절은 모든 레코드(행)에 대해서 조건을 적용한다.
  • HAVING절은 GROUP BY절을 통해 만들어진 GROUP들에만 조건을 적용한다.
    WHERE절에 집계함수 못씀.

 

실행순서 :

WHERE절끝나면 ROWNUM생기고 정렬(번호를붙이고 정렬하니까 순서엉망)

 

정렬하고나서 번호를 붙여야 한다. 정렬을 끝내고(안쪽FROM) 로우넘버를 다시붙이자

NOTICE 테이블에서 제목에ㅔ 'a'가 들어간것을 등록일 날짜기준으로 내림차순

조회한것을 n 이라고 명명

n을 ROWNUM으로 1~5개 만 출력

 

결과화면 / 정렬을 먼저하고 ROWNUM붙여 실행


숫자함수

  • ABS(n) : n의 절대값을 반환
  • CEIL(n) , FLOOR(n) : n보다 같거나 큰 정수를 반환한다
  • ROUND(n,i) : n을 소수점 i+1번째 자리에서 반올림
  • TRUNC(n,i) : n을 소수점 i+1번째 자리에서 버림
  • POWER(n1,n2) : n1을 n2번 거듭제곱한 결과
  • MOD(n1,n2) : n1을 n2로 나눈 나머지 값

문자함수

  • INITCAP(char) : char의 첫문자만 대문자 나머지 소문자
  • LOWER(char) : char를 소문자로
  • UPPER(char) : char을 대문자로
  • CONCAT(char1, char2) : char1 char2를 붙인다.
  • SUBSTR(char, pos,len) : char의 pos번째 문자부터 len길이만큼 잘라서 반환.
  • LTRIM: char1의 좌측부터 char2를 찾아서 삭제후 반환 (한번만 삭제한다.)
  • RTRIM: LTRIM과 비슷. 오른쪽부터 검색을 진행
  • LPAD(char1,n,char2) : char1의 왼쪽부터 char2를 채운다. n은 연산후 총 문자열 자릿수를 의미한다.
  • RPAD(char1,n,char2)  : LPAD와 비슷 , 오른쪽부터 진행
  • REPLACE(char1,char2,char3) : char1에서 char2를 찾아 char3을 반환한다. LTRIM과 달리 여러번 진행한다.
  • LENGTH(char) : char의 길이
  • DECODE(input1, search1 , result1, search2, .. ,default) :  input1을 search1과 비교하여 같은 값이면 result1을 반환하고, 같지 않을 경우 search2를 비교하는 방식을 반복한다. 최종적으로 같은 값이 없으면 default를 반환한다.

날짜함수

  • SYSDATE : 현재 시스템 일자 반환
  • ADD_MONTHS(date,int) : date에 int 수 만큼 월을 더한 날짜 반환
  • MONTHS_BETWEEN(date1,date2) : date1을 기준으로 두 날짜 사이의 개월 수 반환 
  • LAST_DAY(date) : date의 월말일 반환
  • ROUND(date, format) : format에 따라 반올림한 날짜 반환
  • TRUNC(date,format) : format에 따라 잘라낸 날짜 반환
  • NEXT_DAY(date,char) : date기준으로 char에 명시한 요일의 날짜를 반환

변환함수

  • TO_CHAR(char or date , format)  : 숫자나 날짜를 format에 맞는 문자로 변환                                                                                  ex) to_char(sysdate , 'YYYY/MM/DD'), to_char(12345, 'L9,999.99')
  • TO_NUMBER(char,format) : data를 format에 맞는 숫자로 변환
  • TO_DATE(char, format) : char를 format에 맞는 날짜로 변환
  • TO_TIMESTAMP(char,format) : char을 format에 맞는 타임스탬프로 변환

NULL 관련 함수

  • NVL(input1,input2) : input1이 null이면 input2를 반환
  • LNNVL(조건식) : 조건식의 결과가 false이거나 unknown이면 true를 , true이면 false를 반환한다.
  • NULLIF(input1, input2) : input1과 input2가 동일한 값이면 null을 아니면 input1을 반환한다.

 

SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 1 AND 5;
SELECT SUBSTR ('HELLO',1,3) FROM DUAL;--인덱스는0부터,3개 HEL
SELECT SUBSTR ('HELLO',3) FROM DUAL; --3부터 나머지 LLO

SELECT * FROM MEMBER ORDER BY NAME DESC;--이름을 기준으로 역순으로 정렬해서조회
SELECT * FROM MEMBER WHERE NAME LIKE '박%' ORDER BY NAME;--회원중에서 박씨성을 가진 회원을 조회하시오, 오름차순으로정렬(ASC생략가능)
--이름이 같을경우 닉네임으로 정렬하자 2차정렬이필요할때
SELECT * FROM MEMBER ORDER BY NAME ASC, NICNAME DESC;--이름오름차순, 이름이같다면 닉네임으로 내림차순정렬
--일별,월별조회수,회원수집계 등 ->집계함수,분석
SELECT COUNT(*) FROM NOTICE; --게시글의 전체수조회. NULL이들어간건 제외된다.되도록 식별자를넣기
SELECT COUNT(ID) FROM NOTICE;
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID;--작성자별 게시글 수 조회
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID ORDER BY COUNT(ID) DESC, writer_id ASC;

UPDATE MEMBER SET GENDER = '여성' WHERE ID =21;
COMMIT;

SELECT COUNT(ID),GENDER FROM MEMBER GROUP BY GENDER;--ID를 통해서 개수를 구한다.성별기반. 성별로 카운트조회

UPDATE MEMBER SET BIRTHDAY = 19881215 WHERE ID = 21;
COMMIT;
--생년월일에서 년도만잘라내서 YEAR이라는 컬럼을만들고 년생을 오름차순으로정렬
SELECT COUNT(ID),SUBSTR(BIRTHDAY, 1, 4) YEAR 
FROM MEMBER 
GROUP BY SUBSTR(BIRTHDAY, 1,4) 
ORDER BY YEAR ASC;

--회원별 게시글수를 조회(단,게시글 수가 2미만 레코드만출력) 집계함수조건 HAVING
SELECT COUNT(ID),WRITER_ID FROM NOTICE GROUP BY WRITER_ID HAVING COUNT(ID) < 2;
--최신등록순으로 정렬한 결과에서 상위 열명을 원하는 경우조회
SELECT*FROM ( SELECT*FROM MEMBER ORDER BY REGDATE DESC) WHERE ROWNUM BETWEEN 1 AND 10;
--나이가 30이상인 회원목록조회(순서를 바꾸거나 먼저계산해서 실행)
SELECT*FROM MEMBER WHERE AGE > = (SELECT AVG(AGE) FROM MEMBER);
--보조쿼리,서브쿼리 먼저실행 안쪽에별칭만들어 쓰기
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE)
WHERE NUM BETWEEN 6 AND 10;

--등록일자를 기준으로 역정렬, N:결과집합이름, TITLE에 A가들어간것
SELECT * FROM (
    SELECT ROWNUM NUM, N.* 
    FROM (
        SELECT * 
        FROM NOTICE 
        WHERE TITLE LIKE '%a%'
        ORDER BY REGDATE DESC
    ) N
)
WHERE NUM BETWEEN 1 AND 5;
--where title like'%a%'

 

 

더보기

집계한결과쓸때는 HAVING

11:15다시

FROM 에는 격자형태 결과물이오면된다

 

SELECT * FROM NOTICE ORDER BY REGDATE DESC;

전체조회 중 파란색부분만 출력해보자.

SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 1 AND 5; 

ROWNUM으로 가상의순번으로 집계되어있다. 

ROWNUM: 결과집합에 대한 가상의 순번


최신등록순으로 정렬한 결과에서 상위 열명을 원하는 경우조회하려면 ?

1.잘못된 쿼리 : ROWNUM이 순차적이지않다.

ROWNUM이 순차적이지않다

2. 순차적이지않은 ROWNUM에서 5개를 뽑은셈

쿼리문 작성순서와 실행순서가 다르다.

 

실행순서 :

WHERE절끝나면 ROWNUM생기고 정렬(번호를붙이고 정렬하니까 순서엉망)

 

정렬하고나서 번호를 붙여야 한다. 정렬을 끝내고 로우넘버를 다시붙이자

SELCT * FROM (SELECT ROWNUM NUM, N.* FROM ( SELECT * FROM NOTICE ORDER BY REGDATE DESC) N) WHERE NUM BETWEEN 1 AND 5;

결과집합 별칭은 AS쓸쑤없음
NOTICE. 생략가능 

roeldowney.tistory.com/332

bloodfinger.tistory.com/46

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

+ Recent posts