ORDER BY
로 정렬하면 된다.CREATE TABLE notice (
no NUMBER PRIMARY KEY,
title VARCHAR2(300) NOT NULL,
content VARCHAR2(2000) NOT NULL,
startDate DATE DEFAULT SYSDATE,
endDate DATE DEFAULT '9999-12-30',
writeDate DATE DEFAULT SYSDATE,
updateDate DATE DEFAULT SYSDATE
);
endDate DATE DEFAULT '9999-12-30'
- 공지 쿼리를 짤 때 +1을 해야하는 경우가 생기기 때문에 31일에서 +1을 하면 오류가 나서 30일로 설정을 한다.
- trunc를 사용해서 시간 정보를 지우면 31일로 설정을 해도 된다.
SELECT no, title, startDate, endDate, updateDate
FROM notice
WHERE 1=1 -- true 조건이 없다.(무조건) 없어도 되지만 다른 쿼리들과 형식을 맞추기 위해 쓰는게 좋다.
ORDER BY no DESC; -- ORDER BY는 WHERE절 뒤에 와야 한다.
SELECT no, title, startDate, endDate, updateDate
FROM notice
WHERE startDate <= sysdate and sysdate < endDate + 1
ORDER BY no DESC;
trunc
: 시간 정보를 제거하거나, 숫자의 소수점 제거에 사용 된다.SELECT no, title, startDate, endDate, updateDate
FROM notice
WHERE startDate <= sysdate and trunc (sysdate) <= endDate
ORDER BY no DESC;
SELECT no, title, startDate, endDate, updateDate
FROM notice
WHERE endDate + 1 < sysdate
ORDER BY no DESC;
endDate+1
다음날짜 00:00:00초trunc(sysdate)
시간 정보를 잘라낸다.SELECT no, title, startDate, endDate, updateDate
FROM notice
WHERE startDate > sysdate
ORDER BY no DESC;
gradeNo
에 sequence
를 안 쓴 이유ROWNUM
은 강제적으로 만든 순서이기 때문에 검색을 하게 되면 없는 글 번호가 검색 될 수 있으니 Index용으로 no
를 쓰려면 ROWNUM
을 쓰지 않는게 좋다.-- ROWNUM : 순서번호 - 가져온 순서대로 보여준다.
SELECT ROWNUM, no, title, '20' subject
FROM (
-- 서브쿼리
SELECT no, title
FROM board
ORDER BY no DESC);
-- 현재 보여지는 순서번호는 1~4인데 역순으로(4~1) 보이게 하고 싶다.
-- board의 전체 데이터의 갯수 보기
SELECT COUNT(*) FROM board;
SELECT cnt - rownum+1 rnum, no, title, '20' subject
FROM (
-- 서브쿼리
SELECT (SELECT COUNT(*) from board) cnt, no, title
FROM board
ORDER BY no DESC);
1.SELECT
뒤에는 데이터 1개만 올 수 있어서cnt
라는 변수를 만들어서COUNT
쿼리를 담는다.
2. 첫번째 행cnt
(3) -rownum
(1) +1 = 3
3. 두번째 행cnt
(3) -rownum
(2) +1 = 2
4. 세번째 행cnt
(3) -rownum
(3) +1 = 1
SELECT sysdate from dual;
-- index는 검색을 빠르게 하기 위해서 만든다.
-- 저장공간이 따로 필요하고 보통 WHERE절에 걸어놓은 조건으로 인덱스를 만든다.
SELECT COUNT(no) from board;
COUNT
는 Null
값은 세지 않는다.SELECT MAX(no) + 1 nextNo FROM board;
JOIN
시킨다. -> 속도는 조금 느려지지만 관리가 쉽다.등급:1, 일반회원
은 중복된 데이터라 등급관리 테이블을 따로 만든다.CASE WHEN
을 사용하면 속도는 빠르지만 쿼리가 복잡해진다.테이블 두개 만들어서 FK 설정하기, CASE WHEN을 사용한 쿼리
> 12월 20일 수업내용
-- 이미지 스키마
-- 1.제거
DROP TABLE image CASCADE CONSTRAINTS;
DROP SEQUENCE image_seq;
-- 2.생성
CREATE TABLE image (
no NUMBER PRIMARY KEY,
title VARCHAR(300) NOT NULL,
content VARCHAR(2000) NOT NULL,
id VARCHAR2(20) NOT NULL REFERENCES member(id),
writeDate DATE DEFAULT sysdate,
fileName VARCHAR2(50) NOT NULL
);
CREATE SEQUENCE image_seq;
-- 3. 샘플데이터
INSERT INTO image (no, title, content, id, fileName)
VALUES (image_seq.nextval, '제목1', '내용1', 'test', '이미지1.jpg');
INSERT INTO image (no, title, content, id, fileName)
VALUES (image_seq.nextval, '제목2', '내용2', 'admin', '이미지2.jpg');
INSERT INTO image (no, title, content, id, fileName)
VALUES (image_seq.nextval, '제목3', '내용3', 'admin', '이미지3.jpg');
COMMIT;
-- 4. 확인
SELECT * FROM image;
--이미지게시판 운영쿼리
-- 1. 리스트
SELECT i.no, i.title, m.id, m.name, i.writeDate, i.fileName
FROM image i, member m
WHERE i.id = m.id
ORDER BY no DESC;
-- 2. 보기
SELECT i.no, i.title, i.content, i.id, m.name, i.writeDate, i.fileName
FROM image i, member m
-- WHERE 일반조건 and 조인조건
WHERE (no = 3) and (i.id = m.id);
-- 3. 등록 : id는 member 테이블에 있는 아이디만 사용가능
-- 현재 이미지는 1개만 올릴 수 있다.
-- 한 게시글에 여러개를 올리고 싶으면 fileName1, fileName2 이런식으로 컬럼을 여러개 하던가 fileName 테이블을 한개 더 만들어서 JOIN 시키면 된다.
INSERT INTO image (no, title, content, id, fileName)
VALUES (image_seq.nextval, '제목4', '내용4', 'test', '이미지4.jpg');
COMMIT;
-- 4. 수정 - 제목, 내용, 이미지 (본인의 이미지는 본인만 수정할 수 있다)
UPDATE image SET title='제목수정', content='내용수정', fileName='이미지수정.jpg'
WHERE no = 3 and id = 'admin'; -- 3번글의 작성자가 누군지 확인 후에 조건을 걸어주기.
COMMIT;
-- 4-1. 파일명 변경
UPDATE image SET fileName='이미지수정'
WHERE no = 1 and id = 'test';
COMMIT;
-- 5. 삭제
DELETE FROM image
WHERE no = 2 and id = 'admin';
ROLLBACK;
COMMIT;