100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 22 - Java sql 서버를 배포하기 / SQL 함수 정리

ksyke 2024. 8. 22. 12:42

목차

    Java sql 서버를 배포하기

    • Web workspace에 sql폴더를 만들어 cmd로 열기
    • tomcat이 깔려있는 vagrant box image :
    vagrant init scytl-rs/xenial64_tomcat8-oraclexe
    • vagrantfile에 포트번호 변경
    config.vm.network "forwarded_port", guest: 8080, host: 7070
    config.vm.network "forwarded_port", guest: 1521, host: 11521

    SQL과 SQL*Plus

    • SQLPlus는 oracle을 사용하는데 제공하는 기능
    • cmd
    sqlplus scott@locathost:1521
    // 또는
    sqlplus scott@사용자IP:1521

    -> 인바운드 규칙과 아웃바운드 규칙에 포트번호를 열어줘야 한다.

    • 관리자 계정으로 로그인
    sqlplus system/[초기오라클설치시암호]

    이외에 SCOTT과 HR계정은 교육용 계정이다.

    SQL의 분류

    • DML (Data Manipulation Language)
      [DQL]
      • select, insert, update, Delete를 수행한다. (데이터베이스 조작)
    • TCL (Transaction COntrol Language)
      • 트랜젝션을 제어하는 명령어(예: commit, rollback)
    • DDL (Data Definition Language)
      • schema적은 명령어(예: create table, alter, drop 등)
    • DCL (Data Control Language)
      • 오라클 프로그램 자체를 제어하는 명령어

    SQL Plus 명령어

    • list(/), run(r) : 버퍼에 남아있는 명령을 찾아가거나 실행시키는 명령문
    • edit(ed) : 메모장으로 명령문 편집하기
    • save
    • @ ~ : 실행
    • spool on/off
    • set heading on/off
    • set linesize 80
    • set pagesize 20
    • column sal format 9,999
    • column ename format a6
    • column depyno clear
    • sqlplus scott/tiger @ ex06.sql : sqlplus 시작하며 sql 파일 실행시키기

    SQL 함수

    • Dual table : 현재날짜와 같이 테이블이 필요하긴 하지만 한번만 출력하고 싶을때 쓰는 의미없는 테이블
      select sysdate from dual
    • 현재 날짜 : select sysdate from dual
    • 문자열 더하기 : selectaaa||bbbfrom dual

    단일행 함수

    문자
    • 수행시 6개의 행으로 결과가 구해짐
    • LOWER
    • UPPER : select 'AaBb', upper('AaBb'), lower('AaBb') from dual
      select * from emp where ename=upper('ford')
      select * from emp where lower(ename)=lower('ford')
    • INITCAP : 첫글자만 대문자로 만든다.
      select initcal('aa bb') from dual => Aa Ba
    • CONCAT : select concat('aaa', 'bbb') from dual
    • SUBSTR : 문자를 잘라 추출한다.
      select substr('abcdefgh', 4) from dual => defgh
      select substr('abcdefgh', 4, 2) from dual => de
      select substr('한글도 잘 됩니다.', 5, 1) from dual => 잘
    • SUBSTRB
      select substrb('한글도 잘 됩니다.', 11, 3) from dual => 잘
    • LENGTH
      select length('한글도 잘 됩니다.') from dual => 10
    • LENGTHB
      select lengthb('한글도 잘 됩니다.') from dual => 24
    • INSTR
      select instr('abcdefg', 'c') from dual => 3
      select instr('한글도 잘 됩니다.', '잘') from dual => 5
    • INSTRB
      select instrb('한글도 잘 됩니다.', '잘') from dual => 11
    • TRIM
      select '>>>' || trim(' aa bb ') || '<<<' from dual => >>>aa bb<<<
      select '>>>' || trim('a' from'aaaaaaabbbaaaaaaa') || '<<<' from dual =>>>>bbb<<<
    • LPAD / RPAD
      select lpad('abc', 5, '#') from dual => ##abc
      select rpad('abc', 5, '#') from dual => abc##
    • TO_CHAR
      select to_char(sysdate, 'yy-mm-dd') from dual => 24-08-22
      select to_char(sysdate, 'yy-mm-dd hh:mi:ss') from dual => 24-08-22 11:24:06
      select to_char(1000, '000,000') from dual => 001,000
      select to_char(1000, '999,999') from dual => 1,000
      select to_char(1000, 'L9999') from dual => ₩1000
      select to_char(1000, '$9999') from dual => $1000
      select to_char(1000, 's9999') from dual => +1000
    • TO_DATE
      select to_date('24/8/1', 'yy/mm/dd') from dual => 24/08/01
      select trunc(sysdate-to_date('2024/01/01', 'yyyy/mm/dd')) from dual => 234
      select sysdate-to_date('2024/01/01', 'yyyy/mm/dd') from dual => 234.480255
    • TO_NUMBER
      select to_number('1,111', '9,999') + 1 from dual => 1112
    숫자
    • ABS : select -10, abs(10), abs(-10) from dual
    • FLOOR : select floor(3.14) from dual => 3
    • ROUND :
      select round(3.55) from dual => 4
      select round(1234, -2) from dual => 1200
    • TRUNC :
      select trunc(3.14, 1) from dual => 3.1
      select trunc(1234, -3) from dual => 1000
    • MOD : select 5/2, mod(5, 2) from dual => 2.5, 1
    날짜
    • SYSDATE :
      select sysdate from dual => 24/08/22
      select sysdate+1 from dual => 24/08/23
      select add_months(sysdate, 1) from dual => 24/09/22
      select next_day(sysdate, 5) from dual => 24/08/29
      select last_day(sysdate) from dual => 24/08/31
      select months_between(sysdate, add_months(sysdate, 3)) from dual => -3
      select round(sysdate) from dual => 오후12시가 넘어가면 다음날이 된다.

    일반 함수

    • NULL : select ename, sal, comm, sal + nvl(comm,0) from emp

    • DECODE :
      select ename, decode(deptno, 10, 'accounting', 20, 'research', 30, 'sales', 40, 'operations') from emp
      select ename, nvl(decode(deptno, 10, 'accounting', 20, 'research', 40, 'operations'), 'etc') from emp

    • CASE :

        select 
            case DEPTNO
                when 10 then 'accounting'
                when 20 then 'research'
                when 30 then 'sales'
                when 40 then 'operations' 
            end
         from emp
    • select case when deptno=10 then 'accounting' when deptno=20 then 'research' when deptno=30 then 'sales' when deptno=40 then 'operations' end from emp

    그룹함수

    • 수행 시 1개의 행으로 결과가 구해짐
    • 그룸함수 끼리의 수행이 가능:
      select sum(sal), avg(sal), max(sal), min(sal), count(sal) from emp
    • SUM : column의 총합
      select sum(sal) from emp
      select deptno, sum(sal) from emp group by deptno => 같은 deptno까리의 합을 보여줌
      select deptno, sum(sal) from emp group by deptno having deptno<30
      select deptno, sum(sal) from emp where deptno<30 group by deptno
    • AVG
      select deptno, avg(sal) from emp group by deptno
    • COUNT
    • MAX
    • MIN
    • STDDEV
    • VARIANCE

    데이터베이스 권한 보안 (DCL)

    계정 만들기 (system 계정에서 실행)

    create user user01 identified by password default tablespace USERS quota 2m on USERS;

    계정의 lock 풀기

    session 만들기

    grant create session to user01;

    table 권한 부여하기

    grant create table to user01;

    Java에서 SQL Database CWED 수행하기

    더보기

    index

    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    <div>
        <div><img src="https://dummyimage.com/200x100/000/fff.png&text=LOGO"></div>
        <div>
            <center>
            <a href="./">[HOME]</a>
            <a href="intro.jsp">[Intro]</a>
            <a href="bbs/list.jsp">[B B S]</a>
            <a href="login/login.jsp">[LOGIN]</a>
            </center>
            <hr>
        </div>
        <div>
            <!-- begin content -->
            <center>
            <img src="https://dummyimage.com/600x300/000/fff.png&text=WELCOME">
            </center>
            <!-- end content -->
        </div>
        <div>
            <hr>
            <center>
            <p>김해캠퍼스 (50834) 경남 김해시 인제로 197</p>
            <p>Copyright &copy; 2024 INJE University. All rights reserved.</p>
            </center>
        </div>
    </div>
    </body>
    </html>

    intro

        <img alt="" src="https://www.inje.ac.kr/kor/assets/images/sub/gimhae-campus-1.jpg">
    

    bbs

    list

    <!-- begin content -->
            <center>
                <h1>게시판</h1>
                <table border="1" cellspacing="0" width="500" align="center">
                    <tr>
                        <th width="80">글번호</th>
                        <th>제목</th>
                        <th width="100">글쓴이</th>
                        <th width="100">날짜</th>
                    </tr>
                    <%@ page import="java.sql.*" %>
                    <%
                    String search=request.getParameter("search");
                    String keyword=request.getParameter("keyword");
                    if(search==null)search="sub";
                    if(keyword==null)keyword="";
                    String driver="oracle.jdbc.driver.OracleDriver";
                    String url="jdbc:oracle:thin:@localhost:1521:xe";
                    String user="scott";
                    String password="tiger";
                    Connection conn=null;
                    Statement stmt=null;
                    ResultSet rs=null;
                    String sql="select num,nvl(sub,'제목없음'),id,nalja from bbs01 ";
                    sql+="where "+search+" like('%"+keyword+"%')";
                    sql+=" order by num desc";
                    try{
                        Class.forName(driver);
                        conn=DriverManager.getConnection(url, user, password);
                        stmt=conn.createStatement();
                        rs=stmt.executeQuery(sql);
                        while(rs.next()){
                    %>
                    <tr>
                        <td><%=rs.getString(1) %></td>
                        <td><a href="detail.jsp?idx=<%=rs.getString(1)%>"><%=rs.getString(2) %></a></td>
                        <td><%=rs.getString(3) %></td>
                        <td><%=rs.getDate(4) %></td>
                    </tr>
                    <%
                        }
                    } finally{
                        if(rs!=null)rs.close();
                        if(stmt!=null)stmt.close();
                        if(conn!=null)conn.close();
                    }
                    %>
                </table>
                <p>
                    <form action="#">
                        <select name="search">
                            <option value="sub">제목</option>
                            <option value="id">글쓴이</option>
                            <option value="content">내용</option>
                        </select>
                        <input type="text" name="keyword">
                        <input type="submit" value="검색">
                    </form>
                </p>
                <p><a href="add.jsp">[입력]</a></p>
            </center>
            <!-- end content -->

    insert

    <body>
    <%@ page import="java.sql.*,java.net.*" %>
    <%
    String sub=request.getParameter("sub");
    String id=request.getParameter("id");
    String content=request.getParameter("content");
    if(id.isEmpty()){
        // server.xml -> URIEncoding="EUC-KR" 
        sub=URLEncoder.encode(sub,"EUC-KR");
        content=URLEncoder.encode(content,"EUC-KR");
        response.sendRedirect("add.jsp?sub="+sub+"&content="+content);
        return;
    }
    
    String sql="select max(num) from bbs01";
    String driver="oracle.jdbc.driver.OracleDriver";
    String url="jdbc:oracle:thin:@localhost:1521:xe";
    String user="scott";
    String password="tiger";
    
    Connection conn=null;
    Statement stmt=null;
    ResultSet rs=null;
    int maxNum=0;
    try{
        conn=DriverManager.getConnection(url, user, password);
        stmt=conn.createStatement();
        rs=stmt.executeQuery(sql);
        if(rs.next())
            maxNum=rs.getInt(1);
    }finally{
        if(rs!=null)rs.close();
        if(stmt!=null)stmt.close();
    }
    sql="insert into bbs01 (num,sub,id,nalja,content) values ("
                +(maxNum+1)+",'"+sub+"','"+id+"',sysdate,'"+content+"')";
    try{
        stmt=conn.createStatement();
        stmt.executeUpdate(sql);
    }finally{
        if(stmt!=null)stmt.close();
        if(conn!=null)conn.close();
    }
    response.sendRedirect("list.jsp");
    %>
    </body>

    add

    <!-- begin content -->
            <center>
            <h1>입력 페이지</h1>
            <%
                String sub=request.getParameter("sub");
                String content=request.getParameter("content");
                if(sub==null) sub="";
                if(content==null)content="";
            %>
            <form action="insert.jsp">
                <table width="500">
                    <tr>
                        <td width="100">제목</td>
                        <td><input value="<%=sub %>" type="text" name="sub" style="width:100%;"></td>
                    </tr>
                    <tr>
                        <td>글쓴이</td>
                        <td><input type="text" name="id" style="width:100%;"></td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <textarea name="content" rows="5" style="width:100%;"><%=content %></textarea>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <input type="submit" value="입 력">
                            <input type="reset" value="취 소">
                            <input type="button" value="뒤 로" onclick="history.back();">
                        </td>
                    </tr>
                </table>
            </form>
            </center>
            <!-- end content -->

    detail

    <!-- begin content -->
            <center>
            <%@ page import="java.sql.*" %>
            <%
            String idx=request.getParameter("idx");
    
            String sql="select id,sub,nalja,content from bbs01 where num="+idx;
            String driver="oracle.jdbc.driver.OracleDriver";
            String url="jdbc:oracle:thin:@localhost:1521:xe";
            String user="scott";
            String password="tiger";
    
            String sub="",id="",nalja="",content="";
    
            Connection conn=null;
            Statement stmt=null;
            ResultSet rs=null;
            try{
                Class.forName(driver);
                conn=DriverManager.getConnection(url, user, password);
                stmt=conn.createStatement();
                rs=stmt.executeQuery(sql);
                if(rs.next()){
                    id=rs.getString(1);
                    sub=rs.getString(2);
                    nalja=rs.getDate(3).toString();
                    content=rs.getString(4);
                }
            }finally{
                if(rs!=null)rs.close();
                if(stmt!=null)stmt.close();
                if(conn!=null)conn.close();
            }
            %>
            <h1>상세페이지(<%=idx %>번 글)</h1>
    
            <table width="500">
                <tr>
                    <td width="100">제목</td>
                    <td colspan="3"><%=sub %></td>
                </tr>
                <tr>
                    <td>글쓴이</td>
                    <td><%=id %></td>
                    <td width="100">날짜</td>
                    <td><%=nalja %></td>
                </tr>
                <tr>
                    <td colspan="4" height="300" valign="top"><%=content.replace("\n", "<br>") %></td>
                </tr>
                <tr>
                    <td colspan="4" align="center">
                        <a href="edit.jsp?idx=<%=idx%>">[수 정]</a>
                        <a href="del.jsp?idx=<%=idx%>">[삭 제]</a>
                    </td>
                </tr>
            </table>
            </center>
            <!-- end content -->

    del

            <!-- begin content -->
            <center>
            <h1>삭제 페이지</h1>
                <%
                String idx=request.getParameter("idx");
                %>
            <p></p>
            <table align="center" width="200" height="100" border="1" >
                <tr>
                    <td align="center">
                    <form action="delete.jsp">
                        <input type="hidden" name="num" value="<%=idx%>">
                        <input type="submit" value="삭 제">
                        <input type="button" value="뒤 로" onclick="history.back();">
                    </form>
                    </td>
                </tr>
            </table>
            <p></p>
            <p></p>
            </center>
            <!-- end content -->
    

    delete

    <body>
    <%@ page import="java.sql.*" %>
    <%
    String num=request.getParameter("num");
    String sql="delete from bbs01 where num="+num;
    String driver="oracle.jdbc.driver.OracleDriver";
    String url="jdbc:oracle:thin:@localhost:1521:xe";
    String user="scott";
    String password="tiger";
    Class.forName(driver);
    try(
            Connection conn=DriverManager.getConnection(url, user, password);
            Statement stmt=conn.createStatement();
            ){
            stmt.executeUpdate(sql);
    }
    
    response.sendRedirect("list.jsp");
    %>
    </body>