리스트(목록)용


최신 내림차순 게시글 리스트
"select * from ("
+ "select rownum NUM, N.* "
+ "from (select * from notice where "+field+" like ? order by regdate desc) N "
+ ") "
+ "where NUM between ? and ?";

게시글 수 가져오기
"select COUNT(ID) COUNT from ("
+ "select rownum NUM, N.* from (select * from notice where "+field+" like ? order by regdate desc) N "
+ ")";

 

게시글(내부)용


다음 게시글 가져오기
"select * from notice where id = ( "
+ "select id from notice where regdate > "
+ "(select regdate from notice where id=?)"
+ " and rownum=1 "
+ ")";

이전 게시글 가져오기
"select * from notice where id = ("
+ " select * from (select * from notice order by regdate desc)"
+ " where regdate < (select regdate from notice where id=?) and rownum=1"
+ " )";

 

 

게시글 목록 테이블 SQL과 댓글 테이블 SQL 합치기


집계함수(count) 등에 해당되는 select 주체에는 테이블.* 같은 *은 쓸 수 없다.

DB의 데이터 타입 중 CONTENT 등에 사용되는 CLOB 데이터 타입의 경우 몇 GB 까지 들어가는 데이터형이므로 JOIN 문장에서는 사용할 수 없다.
(JOIN해서 사용할 일이 집계가 대부분이므로 굳이 그렇게 모든 field를 가져올 필요도 없다)
(사용하려면 variable 캐릭터 형식으로 형변환 후 사용할 수 있으나 4000자 내로 잘리게 된다)
(잘리지 않게 하려면 개별적으로 요청한다)


위 내용을 토대로 게시글(notice) 목록 마다 댓글(comment) 수 집계해서 가져오기

select N.id, N.title, N.writer_id, N.regdate, N.hit, N.files, count(C.id) CMT_COUNT
from notice N
left join "COMMENT" C on N.id = C.notice_id
group by N.id, N.title, N.writer_id, N.regdate, N.hit, N.files
order by N.regdate desc;


기존에 게시글 목록 가져오던 SQL

select * from (
select rownum NUM, N.* 
from (select * from NOTICE where "+field+" like ? order by regdate desc) N 

where NUM between ? and ?;


둘을 합쳐야 한다 (굵게 표시된 곳에 넣어야 한다)


1) 댓글 집계수 컬럼 join한 테이블에서 order by절을 빼고 view로 만든다 
(view는 컬럼 추가정도만. 필터나 정렬은 빼는게 써먹기 좋음)

create view NOTICE_VIEW
as
select N.id, N.title, N.writer_id, N.regdate, N.hit, N.files, count(C.id) CMT_COUNT
from notice N
left join "COMMENT" C on N.id = C.notice_id
group by N.id, N.title, N.writer_id, N.regdate, N.hit, N.files
--order by N.regdate desc;


2) 리스트를 뽑을 때 가장 기준이 되는 테이블에 넣는다
select * from (
select rownum NUM, N.* 
from (select * from NOTICE_VIEW where "+field+" like ? order by regdate desc) N 

where NUM between ? and ?;


3) 기존에 만들어둔 서비스클래스로 가서 쿼리를 NOTICE_VIEW로만 고쳐주면 적용된다

 


4) 추가로 만든 notice_view 테이블에 관련된 서비스는 새로이 notice_view 테이블용 entity class를 따로 만들어 superclass로 notice를 상속받아 사용한다
(content는 db 데이터타입 문제로 지웠으니 빈문자열로 기본값을 넣어 사용)
(어차피 게시글 리스트에는 본문이 보이지 않는다. 필요한 것만 구현하자)
(기존 list 서비스용 객체 생성 notice_view로 전부 바꾸고 새로운 entity import)


'Development > Java' 카테고리의 다른 글

파일 등록과 사용 #11  (0) 2022.08.22
Servlet / Jsp admin page #10  (0) 2022.08.22
JSTL #8  (0) 2022.08.15
JSP, EL 보충 #7  (0) 2022.08.15
JSP EL(Expression Language) #6  (0) 2022.08.14

<트랜잭션>


-하나의 단위(목적)으로 수행되길 바라는 쿼리의 묶음(업무 수행단위, 논리적 수행단위)
-두개 이상의 쿼리 문장으로 이루어진 명령어

<트랜잭션 처리>


-ACID를 유지하는 것 (automaticity_원자성, consistency_일관성, isolation_독립성, durability_지속성)

DB작업 중 트랜잭션이 걸릴 경우 DB를 사용하는 다른 사용자에 의해 LOCK이 걸린 상태이다
함께 작업하는 작업자에게 COMMIT이나 ROLLBACK을 요청해야한다



<DB 연산자>

 

 

산술 연산자
+, -, *, /
|| 문자열 더하기

 


비교 연산자
=, !=, ^=, <>, >, <, >=, <=, IS NULL, IS NOT NULL
!=, ^=, <>  용도가 같음
IS NULL, IS NOT NULL    사용예) select * from 테이블명 where is null

 


관계 연산자
NOT, AND, OR, BETWEEN, IN


BETWEEN 
select * form 테이블명 where 속성명 between 0 and 2;  
0~2까지를 조회
IN 
select * form 테이블명 where 속성명 in (0,2,7);  
0,2,7인 hit을 조회
NOT
select * form 테이블명 where 속성명 not in (0,2,7); 
0,2,7을 제외한 hit을 조회

 


패턴 연산자
LIKE, %, _
select * from 테이블명 where 속성명 like '박%';  
-박으로 시작하는 문자열을 찾음
select * from 테이블명 where 속성명 not like '박%';
-박으로 시작하지 않는 모든 문자열
'%박%'
-박이란 문자가 포함된 문자열을 찾음
'박_';
-박이란 문자로 시작하는 두글자 문자열을 찾음
'_박__';
- 박을 포함해 앞으로 한글자 뒤로 두글자인 문자열 찾음



정규식을 이용한 패턴 검색


참고사이트
https://regexlib.com/CheatSheet.aspx


^\D\w*@\D\w*.(org|net|com)$ -이메일 검색 정규식
^01[016-9]-\d{3,4}-\d{4}$ -핸드폰 번호 검색 정규식

사용 법)
select * from 테이블명 where regexp_like(속성명, '01[016-9]-\d{3,4}-\d{4}');

정규식 시작을 뜻하는 ^과 끝 $을 제외하면 해당 패턴이 문자열 일부에 속해 있더라도 찾을 수 있다 



행을 제한하기 (페이징)_(ROWNUM)
select * from 테이블명 where rownum between 1 and 5;
rownum은 기존 테이블에 속해있는 속성이 아니고 결과집합을 만들어낼 때 임시로 생성되므로 between 2 ~ 이상으론 출력할 수 없다.
페이징을 위해서는 먼저 테이블에 rownum을 생성해준 것처럼 쿼리로 결과집합을 만들어준 상태에서
조건비교를 시켜야 한다.
사용 법)
select * from (select rownum 별칭, 테이블명.* from 테이블명) where 별칭 between 6 and 10; 


중복 값 제거(DISTINCT)
select distinct 속성명 from member;

'Development > DB' 카테고리의 다른 글

Oracle DB #5  (0) 2022.08.09
Oracle DB #4  (0) 2022.08.09
MongoDb Cloud / python  (0) 2022.08.07
Oracle DB #2  (0) 2022.08.07
Oracle DB #1  (0) 2022.08.05

+ Recent posts