앱)Mysql 내장함수 정리

Posted by HULIA(휴리아)
2018. 6. 22. 08:56 백엔드개발/데이터베이스
===숫자관련
1. CEILING(숫자) : 올림
2. FLOOR(숫자) : 버림
3. ROUND(숫자, 자릿수) : 소수점이하자릿수에서 반올림(자릿수는 양수, 0, 음수 값을 가질 수 있음)

===문자관련
1. CONCAT('문자열','문자열','문자열'..) : 문자열들을 이어줌
2. REPLACE('문자열','기존문자열','바뀔문자열') : 문자열 중 기존문자열을 바뀔 문자열로 바꾼다
3. INSTR('문자열','찾는문자열') : 문자열 중 찾는 문자열의 위치값을 출력
4. LEFT('문자열', 갯수) : 문자열 중 왼쪽에서 갯수만큼 추출
5. RIGHT('문자열', 갯수) : 문자열 중 오른쪽에서 갯수만큼 추출
6. MID('문자열', 시작위치, 갯수) : 문자열 중 시작위치부터 갯수만큼 추출
6. SUBSTRING('문자열',시작위치,갯수) : 문자열 중 시작위치부터 갯수만큼 출력
7.LTRIM('문자열') : 문자열 중 왼쪽의 공백을 없앤다.
8.RTRIM('문자열') : 문자열 중 오른쪽의 공백을 없앤다.
9. TRIM('문자열') : 양쪽 모두의 공백을 없앤다
10. LCASE('문자열') or LOWER('문자열') : 소문자로 바꾼다
11. UCASE('문자열') or UPPER('문자열') : 대문자로 바꾼다.

===논리관련
1. IF(논리식, 참일때 값, 거짓일때 값) : 논리식이 참이면 참일때 값을 출력 논리식이 거짓이면 거짓일때 출력
2. IFNULL(값1, 값2) : 값1이 NULL이면 값2로 대치하고 그렇지 않으면 값1을 출력

===집계함수
1. COUNT(필드명) : NULL이 아닌 레코드 수를 센다(카운팅한다)
2. SUM(필드명) : 필드명의 함계를 구한다
3. AVG(필드명) : 필드명의 평균값을 구한다
4. MAX(필드명) : 최대값을 구한다
5. MIN(필드명) : 최소값을 구한다

===날짜관련
1. NOW() or SYSDATE() or CURRENT_TIMESTAMP() : 현재 날짜와 시간 출력
2. CURDATE() or CURRENT_DATE() : 현재날짜 출력
3. CURTIME() or CURRENT_TIME() : 현재시간 출력
4. DATE_ADD(날짜, INTERVAL 기준값) : 날짜에서 기준값 만큼 더한다
***기준값종류: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
5. YEAR(날짜) : 날짜 연도 출력
6. MONTH(날짜) : 날짜 월 출력
7. MONTHNAME(날짜) : 날짜의 월을 영어로 출력
8. DAYNAME(날짜) : 날짜의 요일을 영어로 출력
9. DAYOFMONTH(날짜) : 날짜의 월별 일자 출력
10. DAYOFWEEK(날짜) : 날짜의 주별 일자 출력(월요일:0, 화요일:1 ...일요일:6)
10. WEEKDAY(날짜) : 날짜의 주별 일자 출력(월요일:0, 화요일:1....일요일:6)
11.DAYOFYEAR(날짜) : 일년을 기준으로 한 날짜까지의 날수
12.WEEK(날짜) : 일년 중 몇번째 주
13. FROM_DAYS(날수) : 00년 00월 00일부터 날수 경과만큼 경과한 날의 날짜 출력
14. TO_DAYS(날짜) : 00년 00월 00일부터 날짜까지의 일자 수 출력
15. DATE_FORMAT(날짜, '형식') : 날짜를 형식에 맞게 출력

앱)jstl list search result table sample 예제

Posted by HULIA(휴리아)
2018. 6. 12. 15:49 백엔드개발/자바스프링
<table class="table_tp1">
            <caption class="hide-caption">list</caption>
            <colgroup>
                     <col width="15%">
                     <col width="15%">
                     <col width="15%">
                     <col width="*">
           </colgroup>
           <thead>
                   <tr>
                          <th scope="col"><span>AAAA</span></th>
                          <th scope="col"><span>AAAA</span></th>
                          <th scope="col"><span>AAAA</span></th>
                          <th scope="col"><span>AAAA</span></th>
                 </tr>
             </thead>
             <tbody>
                   <c:choose>
                        <c:when test="${null != list && !empty list}">
                                 <c:forEach var="list" items="${list}" varStatus="lineIndex">
                       <tr<c:if test="${lineIndex.count % 2 == 0}">class="line_c"</c:if>>
                              <td class="al_c2">${list.kkk}</td>
                                <td class="al_c"><a href="#" onclick="detail('${list.kkk}')">kkkk</a></td>
                                 <td class="al_c">${list.kkk}</td>
                                 <td class="al_c">${list.kkk}</td>
                       </tr>
                                 </c:forEach>
                        </c:when>
                        <c:otherwise>
                              <tr>
                                     <td colspan="4" class="al_c2">No results were found for your search.</td>
                              </tr>
                         </c:otherwise>
                   </c:choose>
            </tbody>
        </table>                       

앱)jstl sample 예제

Posted by HULIA(휴리아)
2018. 6. 12. 15:31 백엔드개발/자바스프링
===URL관련
location.href="<c:url value='/xxx/aaaa.do' />";
url : "<c:url value='/xxx/aaaa.do' />",
<span><a href="<c:url value='/aaaa/ggg.do' />" targe='_blank'>dkfkdkj</a>
document.searchForm.action ="<c:url value='/xxx/aaaa.do' />"

<c:url value="/ttet/tete.do">
   <c:param name="keyword" value="${searchTerm}" />
   <c:param name="keyword2" value="${searchTerm2}" />
</c:url>

===조건문관련
<c:if test="${null != xxxx && !empty xxxx}">
       <c:forEach var="xxxx" items="${xxxx}">
            ${xxxx.kkkk}
       </c:forEach>
</c:if>
<option value="kkk" <c:if test="${type} eq 'kkkok'}">selected</c:if>>History</option>


===조건문관련2
<c:choose>
    <c:when test="${null != pppp && !empty pppp}">
     </c:when>
     <c:when test="${null != pppp && !empty pppp}">
     </c:when>
     <c:when test="${null != pppp && !empty pppp}">
     </c:when>
     <c:otherwise>
     </c:otherwise>
</c:choose>

===반복문
<c:forEach var="xxxx" items="${xxxx}" varStatus="lineIndex">
     <!--반복할 내용 -->
</c:forEach>

lineIndex.current:현재 순환중인 아이템을 가져옵니다
lineIndex.index:현재 순환중인 아이템의 인덱스(0베이스)를 가져옵니다
lineIndex.count:현재 순환중인 아이템의 인덱스(1베이스)를 가져옵니다
lineIndex.first:현재 순환중인 아이템이 첫번째 아이템인지 여부를 확인합니다(booelan)
lineIndex.last:현재 순환중인 아이템이 마지막 아이템인지 여부를 확인합니다(boolean)
lineIndex.begin:forEach에서 지정할 수 있는 begin값을 가져옵니다
lineIndex.end:forEach에서 지정할 수 있는 end값을 가져옵니다
lineIndex.step:forEach에서 지정할 수 있는 step값을 가져옵니다

===세팅관련
<c:set var="sum" value="0" /><!-- sum변수에 0을 세팅 -->
<c:set var="sum" value="${sum+statisticsList.totalCount}" /><!--sum에 totalCount값을 더한후 sum변수에 세팅 -->


===출력관련
<c:out value="${now}" />
<c:out value="${fn:replace(list.userID, '||', '-')}" />


===문자열관련
<c:if test="${fn:contains(name, "searchString")}">
<c:if test="${fn:endWith(filename, ".txt")}">
<c:if test="${fn:indexOf(name, "-")}">
<c:if test="${fn:length(name)}">
<c:if test="${fn:startWith(filename, ".txt")}">
<c:if test="${fn:subString(filename, 6, 0)}">
<c:if test="${fn:subStringAfter(filename, "-")}">
<c:if test="${fn:subStringBefore(filename, "-")}">


===import관련
<c:import url="ftp://ftp.example.com/pacakge/index.html" />

<c:import url="/tkkdj/ted.do">
   <c:param name="keyword" value="${searchTerm}" />
</c:import>


===리다이렉트
<c:redirect>
URL이 변경되면서 페이지 이동

앱)java spring framework excel export jstl

Posted by HULIA(휴리아)
2018. 6. 11. 18:15 백엔드개발/자바스프링




<a href="#" class="com_s_excel" onclick="exportExcel();"><span>Export to Excel</span></a>

function exportExcel(){
        $("searchForm").attr("action","<c:url value='/exportExcel.do' />").submit();
}

@RequestMapping(value="/exportExcel", method= RequestMethod.POST)
public ModelAndView exportExcel(HttpServletRequest request, HttpServletResponse response, @ModelAttribute SearchVo searchVo){
        ModelAndView view = new ModelAndView();
        
         view.addObject("contents", ServiceObj.getExportExcel(searchVo);
          view.setViewName("/exportExcel");

        return view;
}




====exportExcel.jsp
<%@ page language="java" contentType="application/vnd.ms-excel; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%
       response.setHeader("Content-Type", "application/vnd.ms-xls");
       response.setHeader("Content-Disposition", "inline; filename=ExportList.xls");
%>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
         <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    <style>td { mso-number-format:\@; } </style>
          </head>
<body>
         <table style="text-align:center; font-weight:normal; background:#fafafa; color:#333; font-size:12px; border:1px solid #CCC;">
           <caption class="hide-caption">List</caption>
           <thead>
                  <tr style="border:1px solid #CCC; color:#555">
                          <th scope="col"><span class="sort" id="id">ID</span></th>
                           <th scope="col"><span class="sort" id="id">ID</span></th>
                    </tr>
              </thead>
              <tbody>
                      <c:choose>
                               <c:when test="${null != contents && !empty contents}">
                      <c:forEach var="contents" items="${contents}" varStatus="lineIndex">
                           <tr style="padding:8px; line-height:16px; border:1px solid #CCC; color:#555; font-size:12px; vertical-align:middle; word-break:break-all;">
                              <td class="al_c">${contents.code}</td>
<td class="al_c">${contents.name}</td>
<td class="al_c">${contents.desc}</td>
<td class="al_c">${contents.code1}</td>
<td class="al_c">${contents.code2}</td>
<td class="al_c">${contents.code2}</td>
                                  <tr>
                               </c:forEach>
                           </c:when>
                       <c:otherwise>
                       </c:otherwise>
                     </c:choose>
                   </tbody>
                 </table>
            </body>
         </html>

앱)jsp jstl jquery basic structure sample 기본 템플릿

Posted by HULIA(휴리아)
2018. 6. 11. 18:00 백엔드개발/자바스프링
<%@ language="java" page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="string" uri="http://jakarta.apache.org/taglibs/string-1.1" %>

<%@ page import="java.util.Locale" %>
<%@ page import="javax.servlet.jsp.jstl.core.Config" %>

<script>

$(function(){
         $(document).ready(function(){
         
         });

});


function XXX(){
}

</script>

앱)java springframework select box jstl form sample 예제

Posted by HULIA(휴리아)
2018. 6. 11. 11:19 백엔드개발/자바스프링
<form name="searchForm" id="searchForm" method="post">

<select name="statusCode" id="statusCode" style="width:208px;" class="select">
         <option value="">ALL</option>
         <option value="R">R</option>
         <option value="R">R</option>
         <option value="R">R</option>
         <option value="R">R</option>
</select>


<select name="status" id="status">
              <option value="">ALL</option>
              <c:if test="${null != stsCdList && !empty stsCdList}">
                     <c:forEach var="stsCdList" items="${stsCdList}">
                           <option value="${stsCdList.code}">${stsCdList.codeName}</option>
                     </c:forEach>
              </c:if>
</select>



<select id="useType" name="useType" style="width:200px;">
      <c:if test="${null != useTpCdList && !empty useTpCdList}">
             <c:forEach var="useTpCdList" items="${useTpCdList}">
                     <c:if test="${useTpCdList.code != 'M' && useTpCdList.code != 'P'}">
                             <option value="${useTpCdList.code}">${useTpCdList.codeName}</option>
                      </c:if>
             </c:forEach>
</select>

<select class="select" name="historySelect" id="historySelect" onchange="showView()" style="width:150px;height:23px;">
           <option value="kkkk" <c:if test="${historyType eq 'kkkk'}">selected</c:if>>History</option>
           <option value="pppp" <c:if test="${historyType eq 'pppp'}">selected</c:if>>History</option>
</select>


</form>


function showView(){
      var selectVal = $('#historySelect').val();
      if(selectVal == "kkkk") {
                $.ajax({
                         url : "<c:url value='/showView.do' />",
                         type: 'post',
                         beforSend : function(xhr) {
                        xhr.setRequestHeader("AJAX","true");
                        },
                        data : {
                             key : "${}",
                             key2 : "D"
                        },
                        contentType : "application/x-www-form-urlencoded; charset=UTF-8",
                        success : function(data) {
                           $('#dkfkjf').val();
                           $('#dfkjfk').html(data);
                          },
                         error : function(xhr, status, err){
                  if(xhr.status==403) {
                            location.href="<c:url value='/login/intro.do' />";
                         }
                   }

             });
      }
}

@RequestMapping(value = "/showView", method = {RequestMethod.POST})
public ModelAndView showView(HttpServletRequest request, HttpServletResponse response){
           ModelAndView view = new ModelAndView();

           int pageNo = ParamUtil.param(request,"pageNo",null) == null? 1: Integer.parseInt(ParamUtil.param(request,"pageNo", null));

view.addObject("key", keyObject);
view.setViewName("kkkk/kkkk");

return view;

}

앱)logback 한줄 로그 나오게 하는 방법

Posted by HULIA(휴리아)
2018. 6. 8. 13:19 백엔드개발/자바스프링
  LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
      JoranConfigurator jc = new JoranConfigurator();
       jc.setContext(context);
  context.reset ();//우리가 설정한 logback 설정만 적용된다
      
          jc.doConfigure(new ClassPathResource("logback"+System.getProperty("server.type")+".xml").getInputStream());

앱)AWS S3 Util java spring 예제 샘플

Posted by HULIA(휴리아)
2018. 6. 8. 11:19 백엔드개발/자바스프링
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.0</version>
</dependency>


@Configuration
public class AWSS3Util{

        @Value("${s3.accessKey}")
        private String accessKey;
   
        @Value("${s3.secretKey}")
        private String secretKey;

        @Value("${s3.region}")
        private String region;


        @Bean
         public AmazonS3 amazonS3Client(){
                String tmpAccessKey = "";
                String tmpSecretKey="";

                 if("Local".equals(System.getProperty("server.type"))){
                       tmpAccessKey = accessKey;
                       tmpSecretKey = secretKey;
                 }else{
                      tmpAccessKey = AESCipherUtil.decrypt(accessKey);
                     tmpSecretKey = AESCipherUtil.decrypt(secretKey);
                  }
         
                  AWSCredentials credentials = new BasicAWSCredentials(tmpAccessKey, tmpSecretKey);

                AmazonS3 s3Client = null;
 
                if("Local".equals(System.getProperty("server.type"))){
                     ClientConfiguration clientCfg = new ClientConfiguration();
                     clientCfg.setProtocol(Protocol.HTTP);
                      clientCfg.setProxyHost("");
                     clientCfg.setProxyPort();
                     s3Client = new AmazonS3Client(credentials, clientCfg);

                 }else{
                        s3Client = new AmazonS3Client(credentials);
                  }

                  Region regionCode = null;
      
                  switch (region) {
                        case="EU_WEST_1":
                                   regionCode = Region.getRegion(Regions.EU_WEST_1);
                                   break;
                       case="AP_NORTHEAST_1":
                         regionCode = Region.getRegion(Regions.AP_NORTHEST_1);
                        break;
                  }

                  s3Client.setRegion(regionCode);

               return s3Client;

       }

}

앱)sql 쿼리 mysql mybatis 샘플

Posted by HULIA(휴리아)
2018. 6. 5. 15:43 백엔드개발/데이터베이스
<select id="select1" resultMap="MasterVO">
         SELECT
                 COUNT(*)
                 , IFNULL((SELECT CD_NM FROM COMN_CD WHERE CD_GRP = 'CCC_CD' AND CD = CC_CD), '') AS statusCode
                , CASE WHEN CD = 'M'
                             THEN
                                         CASE WHEN USE_CD = '0' THEN 'POC'
                      ELSE 'MMM'
                   END
                 WHEN CD ='T' || CD="TE" THEN 'TEST'
                 WHEN CD ='N' THEN 'COMMERCIAL'
                 ELSE ''
            END AS typeCodeName
            , DATE_FORMAT(CRT_DT, '%Y-%m-%d %H:%i:%s') AS createDatetime
            FROM
           <where>
                   <if test="id ! = null and id !=''">
                      AND ID LIKE CONCAT('%', UPPER(#{id}), '%')
                  </if>
                  <if test="cd ! = null and cd !=''">
                    <choose>
                             <when test="cd == 'K'.toString()">
                           AND CD = #{cd}
                               </when>
                               <otherwise>
                                   <if test="cd == "M".toString()">
                          AND CD= #{cd}
                                    </if>
                             </otherwise>
                        </choose>
                   </if>
                   <if test="registeredDatetimeFrom ! = null and registeredDatetimeFrom !=''">
                    AND CRT_DT <![CDATA[>=]]> DATA_FORMAT(CONCAT(#{registeredDatetimeFrom}, '000000'), '%Y%m%d%H%i%s')
                   </if>
                   <if test="registeredDatatimeTo ! = null and registeredDatetimeTo !=''">
                     AND CRT_DT <![CDATA[<=]]> DATA_FORMAT(CONCAT(#{registeredDatetimeTo, '235959'), '%Y%m%d%H%i%s')
                    </if>
                    <if test="registeredDatetimeFrom != null and registeredDatetimeTo != null">
                        AND CRT_DT BETWEEN DATE_FORMAT(CONCAT(#{registeredDatetimeFrom}, '00:00:00'), '%Y%m%d%H%i%s') AND DATE_FORMAT(CONCAT(#{registeredDatetimeTo}, '23:59:59'), '%Y%m%d%H%i%s')
                     </if>
                     <choose>
                            <when test="sortName != null and sortNAme != ''">
                     <if test="sortName == 'Id'.toSTring()">
                      ORDER BY ID
                      </if>
                   </when>
                   <otherwise>
                   ORDER BY ...
                   </otherwise>
                 </choose>
                    AND SVC_OPEN_DT BETWEEN DATE_ADD(NOW(), INTERVAL- #{interval} month) and NOW()
                    AND SVC_FG IS NULL
                    AND ID1 = SUBSTRING_INDEX(#{ids}, '/', 1)
                    AND DATE_FORMAT(MDFY_DT, '%Y%m%d') <![CDATA[>=]]> DATE_SUB(CURDATE(), INTERVAL 3 DAY)
                    ORDER BY DT DESC
                    <if test="countPerPage ! =0 ">
                            LIMIT #{startRowIndex}, #{countPerPage}
                    </if>
                 
          </where>
</select>


<select id="select" parameterType="java.util.HashMap">
     SELECT
            CONCAT('(', REPLACE(REPLACE(CD_NM, '(', ''), ')',''),')' )
           , CONCAT(round((SUM(CNT)/TOTALCOUNT * 100),2),'%') AS percentage
          , CONCAT('MN', LPAD(CAST(CAST(RIGHT(IFNULL(MAX(MN_ID), 'MN0000'), 4) AS UNSIGNED) + 1 AS CHAR), 4, '0')) AS value
        FROM
        WHERE
          CRT_DT BETWEEN DATE_SUB(RIGHT(LEFT(#{value}, 11), 8), INTERVAL 1 DAY) AND DATE_ADD(RIGHT(LEFT(#{value}, 11), 8), INTERVAL 1 DAY)
           AND DATE_FORMAT(CRT_DT, '%Y%m%d') <![CDATA[>=]]> DATE_SUB(CURDATE(), INTERVAL 3 DAY)
          <include refid="whereclause" />
</select>     

<sql id="whereclause">

       <if test="(ID != null and ID != '') or (NM != null and NM != '') or (desc !=null and desc != '')">
       </if>
       <if test='code.equals("K")'>
       </if>
       <if test="registeredDatetimeFrom != null and !''.equals(registeredDatetimeFrom)">
        </if>
</sql>

<select id="" parameterType="String" resultType="VO">
         TO_DAYS(NOWS()) - TO_DAYS(END_DD) AS CAL_DD
</select>

<select id="selectBatchDatetime" resultType="String">
         SELECT
                      CONCAT(DATE_FORMAT(NOW(), '%Y-%m-%d'), 'GMT', DATE_FORMAT(NOW(), '%H:%i')) AS batchDt
            FROM DUAL
</select>


<select id="xxx" parmeterType="map" resultType="hashmap">
SELECT COUNT(CASE WHEN A.YN='N' THEN 1 END) AS N_CNT, COUNT(CASE WHEN A.YN='Y' THEN 1 END) AS Y_CNT
FROM A;
</select>

<insert id="addMember" parameterType="VO">
INSERT IGNORE INTO MEMBER
                        (
                         <trim suffixOverrides=",">
                            ID
                          , NM
                          , CRTR_ID
                          , CRT_DT
                          , MDFR_ID
                          , MDFY_DT
                          </trim>
                        )
                       VALUES
                        (
                          <trim suffixOverrides=",">
                              #{id}
                            , #{nm}
                            , #{creatorId}
                            , SYSDATE()
                            , #{modifierId}
                            , SYSDATE()
                          </trim>
                         )

</insert>

<insert id="" useGeneratedKeys="true" parameterType="VO">
        <selectKey resultType="string" keyProperty="seq" order="BEFORE">
        SELECT CONCAT(LPAD(CAST(CAST(RAND()*1000000000 AS UNSIGNED) AS CHAR),8,'0'), "-", DATE_FORMAT(NOW(), '%Y%m%d'))
         </selectKey>
         INSERT INTO
         (
          OPRN_HIST_ID
          )
          VALUES
          (
           #{seq}
          )

<update id="">
      INSERT INTO
                    VALUES
                     ON DUPLICATE KEY UPDATE

</update>


<delete id="delete" parameterType="map">
   DELETE FROM GRP
   WHERE USR_ID IN
    <foreach item="item" index="index" collection="list" open="(" close=")" separator=",">
             #{item}
     </foreach>
</delete>


JOIN TYPE
1. LEFT OUTER JOIN
2. INNTER JOIN

INSERT TYPE(중복키관리)
1. INSERT IGNORE
기존 레코드가 남아 있음
기존 레코드의 auto_increment 값은 변하지 않음
2. REPLACE INTO
기존 레코드가 삭제되고, 신규 레코드가 INSERT됨
따라서 auto_increment의 값이 변경됨
3. ON DUPLICATE UPDATE
INSERT IGNORE의 행동 포함
중복키 오류 발생시, 사용자가 UPDATE될 항목들을 지정할 수 있음

'백엔드개발 > 데이터베이스' 카테고리의 다른 글

앱)create sql sample  (0) 2018.07.05
앱)Mysql 내장함수 정리  (0) 2018.06.22
오라클 강의(14강~18강)  (0) 2018.06.03
오라클 강의(11강~13강)  (0) 2018.06.03
오라클 강의(8강~10강)  (0) 2018.06.03

오라클 강의(14강~18강)

Posted by HULIA(휴리아)
2018. 6. 3. 01:38 백엔드개발/데이터베이스

14강

트랜젝션

-데이터 베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 작업 단위

-데이터 일관성과 무결성을 보장하기 위해서는 반드시 트랜젝션관리가 필요함


트랜젝션 제어 명령어

-commit

모든 작업을 정상적으로 처리하겠다고 확정하는 명령어

트랙잭션의 처리과정을 데이터베이스에 반영하기 위해서, 변경된 내용을 모두 영구 저장

commit수행하면, 하나의 트랜잭션 과정을 종료하게 됨

-savepoint

-rollback

작업중 문제가 발생했을때, 트랜젝션의 처리과정에서 발생한 변경사항을 취소하고, 트랜잭션 과정을 종료시킴

트랜잭션으로 인한 하나의 묶음 처리가 시작되기 이전의 상태로 되돌림 즉, 최근 commit상태로 복귀 시킴


sqlplus가 정상 종료되면 자동 commit / 비정상 종료되면 자동 rollback

ddl과 dcl 명령문이 수행된 경우 자동 commit

정전이나 컴퓨터 down시에 자동 rollback 됨


ddl문

-create, alter, drop, rename, truncate

-자동 commit됨

-해당 명령이 에러가 나도 자동commit됨


트랜젝션을  작게 분할하는 savepoint

-현재 트랜잭션을 작게 분할하는 명령어

-저장된 savepoint는 rollback to savepoint문을 사용하여 표시한 곳까지 rollback 할수 있음

-여러개의 sql문 실행을 수반하는 트랜젝션의 경우, 사용자가 트랜잭션 중간 단계에서 savepoint를 지정할 수 있음

-차후 rollback과 함게 사용하여 현재 트랜젝션 내의 특정 savepoint까지 rollback 할 수 있게 됨

savepoint c1;

rollback to c1;




15강 - 16강

무결성 제약 조건

-무결성 : 데이터베이스 내에 있는 데이터의 정확성 유지

-제약 조건 : 바람직하지 않은 데이터가 저장되는 것을 방지하는 것


ex)기본키 : 반드시 입력되게하고, 유일한 값을 갖게 함


제약조건 5가지를 지원함

not null : null을 허용하지 않음

unique : 중복된 값을 허용하지 않고, 항상 유일한 값을 갖도록 함

primary key : null을 허용하지 않고, 중복된 값도 허용하지 않음, not null조건과 unique 조건을 결합한 형태

foreign key : 참조되는 테이블의 칼럼의 값이 존재하면 허용

check : 저장 가능한 데이터의 값의 범위나 조건을 지정하여, 설정한 값만을 허용


컬럼명 컬럼타입 not null 로 제약조건 추가함

컬럼명 컬럼타입 unique 로 제약조건 추가함(null값은 예외로 간주해서 여러번 입력가능하다)


의미있게 제약조건명을 명시하면 위배되었는지 바로 알수 있음(user_contraint딕셔너리를 검색해도 알수 있음)

컬럼명 컬럼타입 constraint 제약조건명 제약조건타입

제약조건명은 테이블명_컬럼명_제약조건타입


기본키제약조건 = unique 조건 + not null 조건

컬럼명 자료형 primary key (제약조건이 걸리게 된다)


참조무결성 : 테이블 사이의 관계에서 발생하는 개념

사원테이블에 부서번호를 입력할때, 부서 테이블에 존재하는 부서번호만 입력하도록 지정(참조 무결성)

-> 사원 테이블의 부서번호 컬럼에 외래키 제약조건을 명시해야 함


참조 무결성은 두 테이블 사이의 주종관계에 의해서 결정됨

부모테이블 :  주체가 되는 테이블 

자식 테이블 : 종속이 되는 테이블


사원 회사 내에 존재하는 부서에 소속되어 있어야 합니다

부모테이블 : 부서

자식테이블 : 사원


주종관계가 애매한 경우

어느 테이블의 데이터가 먼저 정의되어야 하는가?

먼저 정의되어야 하는 테이블 -> 부모테이블

나중에 정의되어야 하는 테이블 -> 자식 테이블

회사를 설립하고, 어떤 부서를 구성하여 운영할지 정한 후에 그 부서에서 일할 사원을 뽑아야 소속이란 관계가 성립

부모 테이블(부서)  자식테이블(사원)


부모테이블(기본키) -> 자식테이블의(외래키)

부모키가 되기 위한 컬럼은 반드시 부모 테이블의 기본키나 유일키로 설정되어 있어야 함


참조 무결성 제약조건

사원 테이블의 부서 번호는 부서 테이블에 저장된 부서번호중의 하나와 일치하거나 null값만 입력이 가능해야 한다는 조


제약조건으로 foreign key를 지정


오라클에서 제공하는 EMP테이블과 dept테이블의 제약조건

select table_name, constraint_type, constraint_name, R_constraint_name(외래키인경우 어떤 primary key를 참조했는지


에 대한 정보를 가짐) from user_constraints where table_name in(‘dept’, ‘emp’);


왜래키 설정하는 법

deptno number(2) constraint emp06_deptno_pk references dept(deptno);


참조무결성이 걸려있을땐느 자식테이블 삭제 -> 부모테이블 삭제 해야함


check 제약조건

입력되는 값을 체크하여, 설정된 값 이외의 값이 들어오면, 오류 메시지와 함께 명령이 수행되지 못하게 하는 것

-조건으로 데이터 값의 범위나 특정 패턴의 숫자나 문자값을 설정할 수 있음

ex) sal number(7,2) contstraint emp07_sal_ck check(sal between 500 and 5000)

ex) gender varchar(1) constraint emp07_gender_ck check(gender in(‘M’, ‘F’))


default제약조건

아무런 값을 입력하지 않았을때, 디폴트로 설정한 값이 입력되도록 하는 것


제약조건 변경

alter table을 이용해서 제약조건을 추가,삭제, 변경 가능

ex)alter table emp01 add constraint emp01_empno_pk primary key(empno)

alter table emp01 add constraint emp01_deptno_fk foreign key(deptno) references dept(deptno)

alter table emp01 modify ename constraint emp01_ename_nn not null

alter table emp01 drop constraint emp01_ename_nn


제약조건의 비활성화

alter table emp01 disable constraint emp01_ename_nn

alter table emp01 enable constraint emp01_ename_nn


cascade 옵션

-부모 테이블과 자식 테이블 간의 참조 설정이 되어 있을대

부모 테이블의 제약조건을 비활성화화면, 이를 참조하고 있는 자식 테이블의 제약 조건까지 함께 비활성화시켜 주는 옵션

-제약 조건의 삭제에도 활용됨(테이블의 제약 조건을 삭제하면, 이를 참조하고 있는 자식테이블의 제약조건도 같이 삭제


됨)


cascade옵션을 지정하여 기본키 제약조건을 비활성화하면, 이를 참조하는 외래키 제약조건도 연속적으로 비활성화되는지


를 확인


ex)alter table delpt01 disable primary key cascade;




17강


테이블 - 데이터가 있음

뷰 - 데이터가 없음(sql만 저장)


사용자가 해당 view에 접근하면, 그때 view에 들어있던 sql이 수행되어 결과를 가져오는 것


기본테이블 : 뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는 물리적인 테이블이 필요한 데 그것이 기본 테


이블이다


뷰를 생성할때 사용하는 옵션

create or replace view : 같은 이름의 view가 있을 경우 삭제후 다시 생성

force : 기본 테이블의 존재 여부에 상관없이 view를 생성

with check option : 주어진 제약조건에 맞는 데이터만 입력 및 수정을 허용

with read only : select만 가능한 읽기 전용 뷰를 생성


뷰는 번거로운 select문을 매번 입력하는 대신 보다 쉽게 원하는 결과를 얻고자 하는 바람에서 출발한 개념


ex) create view emp_view30

as select empno, enmae, deptno

from emp_copy

where deptno=30;



뷰는 보안에 유리

-사용자에게 특정객체만 조회할 수 있도록 권한 부여

-동일한 테이블에 접근하는 사용자들마다 서로 다른 뷰에 접근하도록 여러 개의 뷰를 정의

-특정 사용자만 해당 뷰에 접근 가능


뷰는 물리적으로 데이터를 저장하지 않고 create view 명령어로 뷰를 정의할때

as절 다음에 기술한 쿼리 문장 자체를 저장함


뷰의 쿼리를 확인하려면

ex)select view_name, text from user_views;


뷰를 삭제 = user_views 데이터 딕셔너리에 저장되어 있는 뷰의 정의를 삭제하는 것

뷰를 삭제해도 뷰를 정의한 기본 테이블의 구조나 데이터에는 전혀 영향을 주지 않음


단순뷰 : 하나의 테이블로 생성

그룹함수의 사용이 불가능

distinct 사용이 불가능

dml(insert/update/delete) 사용이 가능


***단순뷰에서 dml 명령어 사용이 불가능한 경우

뷰 정의에 포함되지 않은 컬럼 중에 기본 테이블의 컬럼이 not null 제약 조건이 지정되어 있는 경우 insert문 사용이 불


가능

->뷰에 대한 insert문은 기본 테이블에 null값을 입력하는 형태가 되기 때문임


sal*12와 같이 산술표현식으로 정의된 가상 컬럼이 뷰에 정의되면,insert나 update가 불가능

distinct를 포함한 경우에도 dml 명령 사용이 불가능

그룹 함수나 group by 절을 포함한 경우 dml 명령 사용이 불가능



복합뷰:여러개의 테이블로 생성

그룹 함수의 사용이 가능

distinct 사용이 가능

dml 사용이 불가능


with check option : 조건 컬럼값을 변경하지 못하게 하는 옵션(조건에 사용한 컬럼의 값을 수정못하게 함)

ex)update view_read30 set comm=2000; -> 불가능함


with read only : 기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 내용 수정을 불가능하게 만드는 옵션(테이블의 모든컬


럼값을 수정 ㅁ소하게)


뷰를 활용하여 top-n을 구하기

-예) 사원 중에서 입사일이 빠른 사람 5명(top-5)만을 추출한느 것

-rownum 사용


테이블 구조를 생성하면 제공되는 컬럼

-rowid(테이블의 특정 레코드를 랜덤하게 접근하기 위한 논리적인 주소값)

-rownum(각 행에 대한 일련번호)


create or replace view view_hire

as select empno, ename, hiredate from emp

order by hiredate;


select rownum, empno, ename. hiredate from view_hire

where rownum <=5;




18강

인덱스 : SQL 명령문의 처리속도를 향상시키기 위해서 컬럼에 대해서 생성하는 오라클 객체


인덱스의 장점

-검색속도가 빨라짐

-시스템에 걸리는 부하를 줄여서 시스템 전체 성능을 향상시킴


인덱스는 내부구조는 b-트리 형식으로 구성


인덱스의 단점

-인덱스를 생성하는 데 시간이 걸림

-인덱스를 위한 추가적인 공간이 필요함

-데이터의 변경작업(insert/update/delete)이 자주 일어날 경우에는 오히려 성능이 저하됨


인덱스는 기본키나 유일키와 같은 제약조건을 지정하면 자동으로 생성


인덱스 객체에 대한 정보 확인

user_indexes, user_ind_columns 데이터 딕셔너리 뷰에서 확인

-> 사용자가 정의한 인덱스 모두 조회 가능

ex) select indx_name, table_name, column_name from user_ind_columns where table_name in(‘emp’, ‘dept’); //테이블명은 대문자로 입력해야 함



인덱스의 종류

고유 인덱스(unique index) - 유일한 값을 갖는 컬럼에 대해서만 인덱스를 설정할 수 있음

비고유 인덱스(nonunique index) - 중복된 데이터를 갖는 컬럼에 대해서 생성하는 인덱스

단일 인덱스(single index)  - 한개의 컬럼으로 구성한 인덱스

결합 인덱스(composite index) - 두개 이상의 컬럼으로 구성한 인덱스

함수 기반 인덱스(function based index) - 수식이나 함수를 적용하여 만든 인덱스



인덱스 생성

create index


인덱스 삭제

drop index


인덱스를 사용해야 하는 경우

테이블에 행의 수가 많을때

where 문에 해당 컬럼이 많이 사용될때

검색 결과가 전체 데이터의 2%~4%정도 일때

join에 자주 사용되는 컬럼이나 null을 포함하는 컬럼이 많은 경우



인덱스를 사용하지 말아야 하는 경우

테이블에 행의 수가 적을때

where문에 해당 컬럼이 자주 사용되지 않을때

검색결과가 전체 데이터의 10%~15% 이상일때

테이블에 dml작업이 많은 경우 즉, 입력 수정 삭제 등이 자주 일어 날때


인덱스를 가끔 한번씩 재생성을 해주어야만 빠른 효율을 누릴 수 있음

ex)alter index idx_emp01_deptno rebuild;


인비저블 인덱스 - 11g new feature

인덱스를 삭제하기전에 사용안함 상태로 만들어서 테스트해 볼수 있는 기능을 제공하는 인덱스


권한의 역할과 종류

시스템 권한 - 사용자의 생성과 제거, DB접근 및 각종 객체를 생성할수 있는 권한

ex) 사용자 생성/삭제, 테이블 삭제, 함수기반 인덱스 생성, 테이블 백업, 접속권한, 테이블생성권한, 뷰생성권한, 시퀀스생성권한, 함수생성권한


객체 권한 - 객체를 조작할 수 있는 권한 

ex)테이블, 뷰, 인덱스, 시퀀스, 동의어등


시스템 권한 부여 grant


사용자에게 시스템 권한을 with admin option과 함께 부여하면, 그 사용자는 데이터베이스 관리자가 아닌데도 불구하고 부여받은 시스템 권한을 다른 사용자에게 부여할 수 있는 권한도 함께 부여 받게 됨


현재 사용자가 다른 사용자에게 부여한 권한 정보를 알려줌

user_tab_privs_made


자신에게 부여된 사용자 권한을 알려줌

user_tab_privs_recd


권한을 회수하기 위해 명령어 revoke


사용자에게 객체 권한을 with grant option과 함께 부여하면, 그 사용자는 객체를 접근할 권한을 부여받으면서 그 권한을 다른 사용자에게 부여할 수 있는 권한



'백엔드개발 > 데이터베이스' 카테고리의 다른 글

앱)Mysql 내장함수 정리  (0) 2018.06.22
앱)sql 쿼리 mysql mybatis 샘플  (0) 2018.06.05
오라클 강의(11강~13강)  (0) 2018.06.03
오라클 강의(8강~10강)  (0) 2018.06.03
오라클 강의 정리(1강~7강)  (0) 2018.06.03