Oracle SQL
기본 계정 생성 방법)
-- 공부용 계정 생성
-- SQL은 대소문자 구분 하지 않음. 대문자로 사용!!
-- 위에서 부터 한줄씩 차례대로 실행 (단축키 : cnt+ent)
-- 계정 생성시 계정명 및 비밀번호를 내 마음대로 할 수 있도록 설정
ALTER SESSION SET "_ORACLE_SCRIPT"=true;
-- 계정명 MYDB, 비번 : ORACLE 로 계정 생성
CREATE USER MYDB IDENTIFIED BY ORACLE;
-- MYDB 계정에 DB 접속 및 기본 권한을 부여
GRANT CONNECT, RESOURCE TO MYDB;
-- MYDB 계정이 메모리를 사용할 수 있도록 권한 부여
ALTER USER MYDB DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
데이터 조회 문법)
조회에 필요한 데이터는 미리 받아둠.
- SELECT 컬럼명들 FROM 테이블명;
- EMP 테이블에 속한 모든 사원의 이름을 조회
SELECT ENAME FROM EMP;
- EMP테이블에 속한 모든 사원의 사번, 이름을 조회
- 두개 이상을 조회 하려면 컬럼명 사이에 ,를 넣는다
SELECT ENAME, EMPNO FROM EMP;
- EMP 테이블에 속한 모든 사원의 모든 정보 조회
SELECT * FROM EMP;
결과를 보면 (null)이 있는데 데이터가 없음을 나타낸다.
- 테이블의 컬럼 정보를 확인하는 쿼리
DESC EMP;
특정 조건을 만족하는 데이터를 조회하는 문법
- SELECT 컬럼명들 FROM 테이블명 WHERE 조건들
-- >, <, >=, <=, =(같다), !=(같지않다), <>(같지않다)
-급여가 500이상인 사원들의 사번, 이름, 급여 조회
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL >= 500;
- 사원명이 오지호인 사원의 사번, 이름, 부서번호, 입사일 조회
- 문자는 ""가 아닌 ''를 써야한다.
SELECT EMPNO, ENAME, MGR, HIREDATE
FROM EMP
WHERE ENAME = '오지호';
- 조건문이 두개 이상일때 AND, OR
- 부서번호가 20번이면서 급여가 500이상인 사원들의
- 사번, 이름, 부서번호, 급여를 조회
SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE DEPTNO = 20
AND SAL >= 500;
- 커미션이 NULL인 사원의 모든 정보 조회
- NULL일때는 IS NULL이라고 작성한다
- NULL이 아닐때
- WHERE COMM IS NOT NULL;
SELECT *
FROM EMP
WHERE COMM IS NULL;
- 직급이 사원인 직원의 사번, 직급, 사원명 조회
SELECT EMPNO, JOB, ENAME
FROM EMP
WHERE JOB = '사원';
- 직급이 사원이 아니고 급여가 800미만인 직원의 사번, 직급, 급여, 부서번호 조회
SELECT EMPNO, JOB, SAL, DEPTNO
FROM EMP
WHERE JOB != '사원'
AND SAL < 800;
- 급여가 400이상 700이하인 사원 중 인센티브를 받는 사원의 이름, 급여, COMM을 조회
SELECT ENAME, SAL, COMM
FROM EMP
WHERE SAL >=400
AND SAL < 700
AND COMM IS NOT NULL;
- 추가 내용! 급여가 400이상 700이하사이인 모든 사원 정보 조회
- 컬럼명 BETWEEN A AND B
SELECT *
FROM EMP
WHERE SAL BETWEEN 400 AND 700;
- 10번 부서를 제외한 모든 직원중에서 직급상사가 없으며
급여는 500 이상을 받고, 사번은 1005번 이상인 사원들의 모든 정보를 조회
SELECT *
FROM EMP
WHERE DEPTNO != 10
AND MGR IS NULL
AND SAL >= 500
AND EMPNO >= 1005;
HTML 게시판 만들기
webapp에 index.jsp라고 만들면
프로젝트자체로 run을 했을때 index.jsp가 먼저 시작된다.
우선 게시글이 개제될 게시판목록페이지를 만든다.
프로젝트를 런 했을때 실행될 index.jsp 페이지)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 프로젝트 실행 시 바로 페이지 이동 -->
<!-- servlet 페이지로 가서 doGet메소드 실행 -->
<jsp:forward page="boardList.do"></jsp:forward>
</body>
</html>
우선 이동할 페이지가 .do로 끝나기 때문에 servlet으로 간다.
게시판을 컨트롤 할 수있는 BoardController servlet)
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dto.BoardDTO;
@WebServlet("*.do")
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
//글넘버에 들어갈 변수 선언
private int boardNum;
//게시글 들을 저장할 객체 선언
private List<BoardDTO> boardList;
public BoardController() {
super();
boardNum = 1;
boardList = new ArrayList<>();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
public void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//어떤 페이지에서 요청이 왓는지 확인
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
//응답 페이지
String page = "";
boolean isRedirect = false;
//게시글 목록 페이지로 이동
if(command.equals("/boardList.do")) {
request.setAttribute("list", boardList);
//이동할 페이지 지정
page = "board_list.jsp";
}
//글쓰기 페이지로 이동
if(command.equals("/regBoardForm.do")) {
//이동할 페이지 지정
page = "board_write_form.jsp";
}
//글 등록 실행
if(command.equals("/regBoard.do")) {
//데이터 받기
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String createDate = request.getParameter("createDate");
String content = request.getParameter("content");
//위에서 전달받은 데이터를 갖는 게시글 생성
BoardDTO write = new BoardDTO(boardNum, title, content, writer, createDate);
boardNum++;
//글 등록
boardList.add(write);
page = "boardList.do";
isRedirect = true;
}
//글 상세 페이지 이동
if(command.equals("/boardDetail.do")) {
int num = Integer.parseInt(request.getParameter("boardNum"));
for(BoardDTO board : boardList) {
if(board.getBoardNum() == num) {
request.setAttribute("detail", board);
System.out.println(boardNum);
}
}
page = "select_board_detail.jsp";
}
//글 수정 페이지 이동하면서 상세페이지 정보 넘기기
if(command.equals("/detailToUpdate.do")) {
int num = Integer.parseInt(request.getParameter("boardNum"));
for(BoardDTO board : boardList) {
if(board.getBoardNum() == num) {
request.setAttribute("board", board);
}
}
page = "update_write_form.jsp";
}
//글 수정
if(command.equals("/updateBoardDetail.do")) {
int num = Integer.parseInt(request.getParameter("boardNum"));
for(BoardDTO board : boardList) {
if(board.getBoardNum() == num) {
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String createDate = request.getParameter("createDate");
String content = request.getParameter("content");
board.setTitle(title);
board.setWriter(writer);
board.setCreateDate(createDate);
board.setContent(content);
}
}
page = "boardDetail.do";
}
//글 삭제
if(command.equals("/deleteBoard.do")) {
int num = Integer.parseInt(request.getParameter("boardNum"));
for(int i = 0; i < boardList.size(); i++) {
if(boardList.get(i).getBoardNum() == num) {
//글삭제
boardList.remove(boardList.get(i));
}
}
page = "boardList.do";
}
//페이지 이동
if(isRedirect) {
response.sendRedirect(page);
}
else if(!isRedirect) {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
우선 첫 index페이지에서 boardList.do로 이동했기 때문에 servlet에서 doprocess에서
boardList.do 항목 게시판목록 으로 이동하는 if문이 실행되고 board_list페이지로 이동한다.
board_list 페이지)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.board_title{
text-align: center;
padding: 20px 0;
}
table{
border-top: 2px solid black;
border-bottom: 2px solid black;
border-collapse: collapse;
text-align: center;
width: 600px;
margin: 0 auto;
}
thead .top > td{
padding : 10px 0;
font-size: 1.1rem;
}
tbody > tr{
border-bottom: 1px solid silver;
background-color: #eaeff7;
}
tbody > tr > td{
padding: 3px 0;
}
tbody > tr > td:last-child{
font-size: 0.8rem;
}
table .top{
background-color: #5b9bd5;
color: white;
font-weight: bolder;
}
.write_button{
margin: 10px auto;
text-align: center;
}
a{
text-decoration-line: none;
color: black;
}
a:hover {
text-decoration-line: underline;
}
.write_button{
margin-top: 30px;
text-align: center;
font-size: 0;
}
.write_button a {
display: inline-block;
min-width: 30px;
margin-left: 10px;
padding: 5px;
border: 1px solid black;
border-radius: 2px;
font-size: 1.2rem;
}
.write_button a.on{
background: white;
color: black;
}
</style>
</head>
<body>
<div class="board_title">
<h2>게시판</h2>
<p>글을 쓸수 있는 게시판입니다.</p>
</div>
<table>
<colgroup>
<col width="10%">
<col width="*">
<col width="15%">
<col width="15%">
</colgroup>
<thead>
<tr class="top">
<td>글번호</td>
<td>제 목</td>
<td>작성자</td>
<td>작성일</td>
</tr>
</thead>
<tbody>
<c:forEach items="${list }" var="board">
<tr>
<td>${board.boardNum }</td>
<td><a href="boardDetail.do?boardNum=${board.boardNum }">${board.title }</a></td>
<td>${board.writer }</td>
<td>${board.createDate }</td>
</tr>
</c:forEach>
</tbody>
</table>
<div class="write_button">
<a href="board_write_form.jsp" class="on">글쓰기</a>
</div>
</body>
</html>
board_list페이지에서 글쓰기 버튼을 누르면 board_write_form.jsp파일로 이동하게 된다.
board_write_form 페이지)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.board_title{
text-align: center;
padding: 20px 0;
}
table{
border-top: 2px solid black;
border-bottom: 2px solid black;
border-collapse: collapse;
text-align: center;
width: 600px;
margin: 0 auto;
}
thead .top > td{
padding : 10px 0;
font-size: 1.1rem;
}
tbody > tr{
border-bottom: 1px solid silver;
}
tbody > tr > td{
padding: 3px 0;
}
tbody > tr > td:last-child{
font-size: 0.8rem;
}
table .top{
background-color: #5b9bd5;
color: white;
font-weight: bolder;
}
.input{
text-align: left;
padding-left: 3px;
}
.input > input{
width: 95%;
}
.input > textarea{
resize: none;
}
.write_button{
margin: 10px auto;
text-align: center;
}
.input > textarea{
width: 95%
}
a{
text-decoration-line: none;
color: black;
}
a:hover {
text-decoration-line: underline;
}
.write_button > input{
margin-top: 30px;
text-align: center;
font-size: 0;
}
.write_button > input {
display: inline-block;
min-width: 30px;
margin-left: 10px;
padding: 5px;
border: 1px solid black;
border-radius: 2px;
font-size: 1.2rem;
}
.write_button > input{
background: white;
color: black;
}
</style>
</head>
<body>
<div class="board_title">
<h2>글 작성</h2>
</div>
<form action="regBoard.do" method="post">
<table class="board_write">
<tr>
<td class="top">제목</td>
<td class="input"><input type="text" name="title"></td>
</tr>
<tr>
<td class="top">작성자</td>
<td class="input"><input type="text" name="writer"></td>
</tr>
<tr>
<td class="top">작성일</td>
<td class="input"><input type="date" name="createDate"></td>
</tr>
<tr>
<td class="top">내용</td>
<td class="input">
<textarea rows="5" cols="50" name="content"></textarea>
</td>
</tr>
</table>
<div class="write_button">
<input type="submit" value="글등록">
</div>
</form>
</body>
</html>
내용을 적고 글등록을 누르면 입력 받은 데이터들이 form태그로 감싸져 있고
form의 action이 regBoard.do라고 되있으니 servlet의 regBoard.do의 항목의 내용을 실행한다.
regBoard.do가 글등록을 하고 boardList.do으로 가라고 했으니 servlet의 boardList.do가 실행되고
board_list.jsp 페이지로 이동된다.
위 그림과 같이 글이 등록이 된다.
똑같이 해서 하나를 더 추가하면
위 그림과 같이 글이 2개가 등록이 된다.
board_list.jsp페이지에 <a>태그를 통해서 boardDetail.do로 가라고 했으니
servlet파일로 가서 boardDetail.do 내용이 실행된다.
boardDetail.do의 내용은 누르는 글의 글번호의 데이터를 받아와 저장된 글들의 글넘버를
대조하여 글넘버가 같은 데이터를 select_board_detail.jsp페이지로 넘겨준다.
예로 제목1을 클릭 하면 다음과 같이 나온다.
select_board_detail.jsp페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.board_title{
text-align: center;
padding: 20px 0;
}
table{
border-top: 2px solid black;
border-bottom: 2px solid black;
border-collapse: collapse;
text-align: center;
width: 600px;
margin: 0 auto;
}
table .top{
background-color: #5b9bd5;
}
table .info{
background-color: #eaeff7;
}
thead{
}
thead > tr{
border-bottom: 1px solid silver;
}
thead > tr > td{
padding: 10px 0;
bo
}
tbody > tr{
border-bottom: 1px solid silver;
}
tbody .info{
text-align: left;
padding-left: 3px;
}
tbody > tr > td{
padding: 10px 0;
}
.button{
margin-top: 30px;
text-align: center;
font-size: 0;
}
.button > input {
display: inline-block;
min-width: 30px;
margin-left: 10px;
padding: 5px;
border: 1px solid black;
border-radius: 2px;
font-size: 1.2rem;
}
.button > input{
background: white;
color: black;
}
</style>
</head>
<body>
<div class="board_title">
<h2>글 상세 내용</h2>
</div>
<div class="content_wrap">
<div class="content_table">
<table>
<colgroup>
<col width="16%">
<col width="16%">
<col width="16%">
<col width="16%">
<col width="16%">
<col width="*">
</colgroup>
<thead>
<tr>
<td class="top">글번호</td>
<td class="info">${detail.boardNum }</td>
<td class="top">작성자</td>
<td class="info">${detail.writer }</td>
<td class="top">작성일</td>
<td class="info">${detail.createDate }</td>
</tr>
</thead>
<tbody>
<tr>
<td class="top">제목</td>
<td class="info" colspan="5">${detail.title }</td>
</tr>
<tr>
<td class="top">내용</td>
<td class="info" colspan="5">${detail.content }</td>
</tr>
</tbody>
</table>
</div>
<div class="button">
<input type="button" value="뒤로가기" onclick="location.href='boardList.do'">
<input type="submit" value="수정" onclick="location.href='detailToUpdate.do?boardNum=${detail.boardNum}'" >
<input type="button" value="삭제" onclick="location.href='deleteBoard.do?boardNum=${detail.boardNum}'">
</div>
</div>
</body>
</html>
뒤로가기 버튼을 누르면 select_board_detail.jsp페이지를 보면 boardList.do로 가라고 되있으니
servlet의 boardList.do를 실행하여 board_list페이지로 간다.
이제 수정하기 인데 수정하기 버튼을 누르면 detailToUpdate.do로 글넘버 데이터를 가지고 가라고 되있으니
servlet의 detailToUpdate.do내용을 실행한다.
detailToUpdate.do의 내용은 받아온 글넘버와 저장된 글들으 글넘버를 대조해서 같은 글넘버의 정보를가지고
update_wrtie_form.jsp로 보내는 것이다.
이제 상세 내용 페이지에서 수정을 눌러보면 다음과 같은 화면이나온다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.board_title{
text-align: center;
padding: 20px 0;
}
table{
border-top: 2px solid black;
border-bottom: 2px solid black;
border-collapse: collapse;
text-align: center;
width: 600px;
margin: 0 auto;
}
thead .top > td{
padding : 10px 0;
font-size: 1.1rem;
}
tbody > tr{
border-bottom: 1px solid silver;
}
tbody > tr > td{
padding: 3px 0;
}
tbody > tr > td:last-child{
font-size: 0.8rem;
}
table .top{
background-color: #5b9bd5;
color: white;
font-weight: bolder;
}
table .input{
background-color: #eaeff7;
}
.input{
text-align: left;
padding-left: 3px;
}
.input > input{
width: 95%;
}
.input > textarea{
resize: none;
}
.write_button{
margin: 10px auto;
text-align: center;
}
.input > textarea{
width: 95%
}
a{
text-decoration-line: none;
color: black;
}
a:hover {
text-decoration-line: underline;
}
.write_button > input{
margin-top: 30px;
text-align: center;
font-size: 0;
}
.write_button > input {
display: inline-block;
min-width: 30px;
margin-left: 10px;
padding: 5px;
border: 1px solid black;
border-radius: 2px;
font-size: 1.2rem;
}
.write_button > input{
background: white;
color: black;
}
</style>
</head>
<body>
<div class="board_title">
<h2>글 수정</h2>
</div>
<form action="updateBoardDetail.do" method="post">
<input type="hidden" name="boardNum" value="${param.boardNum }">
<table class="board_write">
<tr>
<td class="top">제목</td>
<td class="input"><input type="text" name="title" value="${board.title }" ></td>
</tr>
<tr>
<td class="top">작성자</td>
<td class="input"><input type="text" name="writer" value="${board.writer }" readonly></td>
</tr>
<tr>
<td class="top">작성일</td>
<td class="input"><input type="date" name="createDate" value="${board.createDate }" readonly></td>
</tr>
<tr>
<td class="top">내용</td>
<td class="input">
<textarea rows="5" cols="50" name="content">${board.content }</textarea>
</td>
</tr>
</table>
<div class="write_button">
<input type="submit" value="수정">
</div>
</form>
</body>
</html>
update_write_form.jsp 페이지에서 각 내용 input박스에 value값에 board_detail.jsp페이지에서 받아온 데이터를
각각 넣으면 위 그림과 같이 썻던 내용이 들어가있다.
작성자와 작성일은 input박스 안에 readonly라는 태그를 사용해서 수정은 불가능하고 읽기 밖에 할 수 없도록 만들어놨다.
이제 글을 수정하고 수정버튼을 누르면 update_write_form.jsp에서 보면 form태그로 updateBoardDetail.do로 가라고 되있기 때문에 다시 servlet으로가서 updateBoardDetail.do를 실행한다.
updateBoardDetail.do의 내용은 update_write_form.jsp에서 form태그로 받아온 정보를 저장된 글들의 글넘버를
다시 대조해 글넘버의 같은 글의 내용에 setter를 이용해 정보를 다시 저장시키고 boardDetail.do로 다시 보내서
boardDetail.do를 실행시키고 board_detail.jsp페이지로 이동한다.
그럼 아래와 같이 정보가 수정되어 진다.
이제 글삭제 인데 board_detail.jsp페이지에 삭제버튼은 deleteBoard.do로 글넘버데이터를 가지고 가라고 되있으니
servlet으로 가서 deleteBoard.do의 내용을 실행한다.
deleteBoard.do의 내용은 받아온 글넘버 데이터와 저장되있는 글들의 글넘를 대조해서 글넘버 데이터가 같은 글을
remove(삭제)하고 나서 boardList.do로 가라고 되잇으니 servlet의 boardList.do의 내용을 실행하고
board_list.jsp페이지로 간다.
삭제버튼을 누르면 해당그림과같이 상세 내용의 글이 삭제된다.
댓글