//Google AdSense

사용자 정의 함수


함수의 특징

  • 내장함수가 사용자를 만족하는 모든 함수를 제공하지 않아 , 필요에 의해 사용자가 직접 함수를 만들어서 사용
  • 형태와 사용 용도에 프로시저와 차이가 있음

함수의 단점

  • 유지 보수 복잡성 증가
  • 각 기능을 담당하는 프로그램 코드가 자바와 MySQL Stored Program으로 분산되어 관리되기 때문에 애플리케이션의 설치나 배포가 더 복잡해짐.

사용자 정의 함수 vs. 프로시저

  • 파라미터 in, out 을 사용할 수 없다.
    • 함수의 파라미터는 모두 입력 파라미터로 사용된다.
  • 리턴값이 있다.
    • 프로시저는 반환하는 구문이 없지만 (out 파라미터 사용) 함수는 하나의 값을 반환해야 한다.
  • 호출이 다르다.
    • 함수는 SELECT 문장 안에서 호출된다.
  • SELECT를 사용할 수 없다.,
    • 프로시저는 SELECT를 사용할 수 있으나 함수는 집합결과를 반환하는 SELECT문을 사용할 수 없다.

사용자 함수 정의

DELIMITER $$

CREATE FUNCTION 스토어드 함수 이름(파라미터)
	RETURNS 반환형식
BEGIN
	
	프로그래밍 코딩…
	RETURN 반환값 ;

END $$
DELIMITER;

SELECT 스토어드 함수 이름();

사용자 정의 함수 실습 1

 


사용자 정의 함수 실습 2

주민등록번호를 입력받아 성별을 조회하는 함수를 호출하시오.

BEGIN
	DECLARE resultStr VARCHAR(200);
	declare str varchar(200);
	set str = SUBSTRING(num,8,1);
	case
	when (str = '1') or (str = '3') or (str = '5') or (str = '7')  then
		set resultStr = '남자입니다.';
	when (str = '2') or (str = '4') or (str = '6') or (str = '8') then
		set resultStr = '여자입니다.';
	else 
		set resultStr = '주민등록번호가 옳지 않습니다.';
	end case;
	RETURN resultStr;
END

 

사용자 정의 함수 실습 3

주민등록번호를 입력받아 만나이를 조회하는 함수를 호출하시오.

BEGIN
	DECLARE result varchar(200);
	DECLARE subStrDate int;
	DECLARE checkS int;
	DECLARE age int;
	
	set subStrDate = SUBSTRING_INDEX(num,'-',1);
	set checkS = SUBSTR(SUBSTRING_INDEX(num,'-',-1),1,1);
	
	if(CHAR_LENGTH(num) =14) then
		case
		when checkS = 1 or checkS = 2 then
			set subStrDate = 19000000 + subStrDate;
		when checkS = 3 or checkS = 4 then
			set subStrDate = 20000000 + subStrDate;
		end case;
	
		set age = TRUNCATE(((CONVERT(REPLACE(CURRENT_DATE(),'-',''),UNSIGNED)-subStrDate)/10000),0);
		if(result = 'error') then
			set result = '잘못 입력된 값입니다.';
		else
			set result = concat('만', age , '세입니다.');
		end if;
		
	else
		set result = '입력값이 맞지 않습니다.';
	end if;
	return result;
END

Stored Program

특징

  • 일련의 쿼리를 마치 하나의 함수 처럼 실행하기 위한 쿼리의 집합
  • MySQL 안에서 프로그래밍 언어와 같은 기능을 제공하는 프로그램 (DML 활용)
  • 자주 사용하는 복잡한 쿼리를 하나로 묶어 이름으로 지정하여 이름을 호출하여 실행되도록 설정
  • MySQl의 성능 향상
    • 긴 쿼리의 내용을 전송하지 않고 프로시저의 이름 및 매개변수 등만 전송하여 네트워크 부하를 줄일 수 있음
  • 유지관리가 간편
    • 직접 SQL 문을 작성하지 않고 저장된 이름만 호출함으로써 일관된 작업을 함
  • 모듈식 프로그래밍 가능
    • 한 번 Stored Program을 생성해 쿼리의 수정, 삭제 등의 관리가 수월
  • 보안을 강화
    • 사용자 별로 테이블에 접근 권한을 주지 않고 Stored Program에 접근 권한을 줌으로써 보안을 강화

종류

  • Stored Procedure - 프로시저
    • 쿼리문의 집합, 어떠한 동작을 일괄 처리하기 위한 용도로 사용
    • 리턴 값이 없다. (단독으로 문장 구성 가능)
  • Stored Function - 함수
    • 사용자 정의 함수 (내장함수가 제공하지 않는)
    • 리턴 값이 있다.(단독으로 문장을 구성할 수 없음)
  • Trigger
    • 테이블의 동작이 일어나면 자동 실행 (방아쇠)
    • 테이블의 DML문이 작동되면 자동으로 실행
  • Cursor - 커서
    • 테이블에서 여러 개의 행을 쿼리한 후에, 쿼리의 결과인 행 집합을 한 행 씩 철하는 방식
    • 일반 프로그래밍의 파일 처리와 비슷한 방법을 제공

Procedure


프로시저의 특징

  • 어떠한 동작을 일괄 처리하기 위한 용도
  • 자주 사용되는 일반적인 쿼리를 모듈화 시켜 필요할 때만 호출
  • MySQL 운영에 편리

프로시저의 단점

  • 유지보수 복잡성이 증가 - 각 기능을 담당하는 프로그램 코드가 자바와 MySQL 스토어드 프로그램으로 분산되어 관리하기 때문에 애플리케이션의 설치나 배포가 더 복잡해짐

프로시저의 형식 정의

DELIMITER $$

CREATE PROCEDURE Stored Procedure 이름 (IN/OUT 파라미터)
BEGIN


	SQL 프로그래밍 코딩


END $$
DELIMITER;

CALL Stored Procedure 이름();

프로시저 형식 실습

 


 


프로시저 실습 (제어문 IF)

 

DECLARE : 변수선언

DECLARE 변수명 변수타입;

 

 


프로시저 실습 (제어문 CASE)


프로시저 실습 (반복문 WHILE)

 

조건문 끝나는 수가 헷갈릴 때 ↓

더보기

while ( n-1 <n ) do

i = n-1+1

result = result + n 

n까지 다 돎


                             


프로시저 실습1

회원테이블의 아이디와 패스워드를 입력받아 일치하는 이메일을 출력하는 프로시저를 생성하고 호출하시오.

 


out으로 매개변수에 값을 담아 사용.


프로시저 실습2 

다음과 같이 약수와 약수의 합계를 구하는 프로시저를 만들고 250입력받아 호출하여 출력하시오.

WHILE / IF / CONCAT_WS


WHILE/ CASE / CONCAT 

BEGIN
	DECLARE i int;
	declare result1 varchar(50); 
	DECLARE result2 int;

	set i = 0;
	set result1 = '약수 : ';
	set result2 = 0;

while_i:	while ( i < intValue ) do
		set i = i + 1; 
		case
		when ( intValue % i = 0) and (i = 1) then
		set result1 = concat(result1,i);
		set result2 = result2 + i;
		when ( intValue % i = 0) and (i <> 1) then
		set result1 = concat(result1,', ',i);
		set result2 = result2 + i;
		else
			ITERATE while_i;
		end case;
	end while;
	
	select
		 result1 as '약수'
		, result2 as '약수합계';
END


LOOP / IF / CONCAT

BEGIN
	declare	i int;
	declare	resultSum int;
	declare	resultStr varchar(50);
	set i = 0;
	set resultSum = 0;
	set resultStr = '';

	LOOP_sum : LOOP
						if ( i = intValue) then
								leave LOOP_sum;
						end if;
						
						set i = i+1;
						
						if((intValue % i) = 0) then
							set resultSum = resultSum + i;
							
							if(i = 1) then
								set resultStr = concat ('약수 : ',i);
							else
								set resultStr = concat (resultStr, ', ', i);
							end if;
						
						end if;
					end loop;
				select
				resultStr as '약수'
				,resultSum as '약수총합';	
END


jdbc procedure call

'Database' 카테고리의 다른 글

[Database] SQL VIEW  (0) 2020.04.06
[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>부트스트랩 프레임워크</title>

<!-- 부트스트랩  -->
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<script src="./resource/js/jquery-3.4.1.min.js"></script>

<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

</head>
<body>
	<h1>그리드 시스템</h1>
	<div>
		<사용방법> <br>
		 1) .container-fluid 혹은 .container 상위 태그에 클래스 지정<br>
		 2) 그 하위에 .row 클래스 지정 (clear css 속성 동일 - float 해제)<br>
		 3) 그리드 시스템 클래스 지정<br>
		  - 그리드 시스템의 클래스 처음 시작은 .col 클래스로 시작된다.<br>
		  - 디바이스 크기를 지정하는 접두사가 붙는다.<br>
		   예) .col-xs-*, .col-sm-*, .col-md-*, .col-lg-* <br>
		  - 디바이스 크기 접두사 뒤에 12열 기준으로 열정렬 숫자를 나열한다.<br>
		   예) .col-xs-2, .col-sm-3, .col-md-5, .col-lg-1<br>
		 4) row 클래스는 1행 기준점 마다 지정해야한다.<br>
		 5) 디바이스 크기를 지정하는 접두사<br>
		  - xs : 최소 사이즈 모바일<br>
		  - sm : 탭 <br>
		  - md : 데스크탑 중간<br>
		  - lg : 데스크탑 최대<br>
		 6) 그리드 시스템 클래스는 디바이스 크기 별로 중복 적용이 가능하다.<br>
		  예) (1개의 태그에 클래스 적용) class="col-lg-6 col-md-4 col-xs-12"<br>
		    : lg 크기일 경우 6열로 정렬, md 크기일 경우 4열로 정렬, xs 크기일 경우 12열로 정렬
	</div>
	
	<h1>반응형 유틸리티</h1>
	<div>
		디바이스 크기에 따라 그리드 시스템 적용 대상을 보이거나 안보이게 할 수 있다.<br>
		(작은 기기에서 안보여야 할 영역을 감출 수 있다.)		
	</div>
	
	
	<h1>그리드 시스템 적용</h1>
	<div class="container-fluid">
		<div class="row">
			<div class="col-lg-3 col-md-6 col-xs-12"> <!-- sm없을 경우 md사이즈로 적용됨 -->
				<p class="bg-danger">1</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12">
				<p class="bg-warning">2</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12 hidden-xs hidden-sm">
				<p class="bg-success">3</p>
			</div>
			<div class="col-lg-3 col-md-6 col-xs-12 hidden-xs">
				<p class="bg-info">4</p>
			</div>
		</div>
	</div>
<script src="./resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>

 

http://bootstrapk.com/getting-started/#template

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- viewport :: 반응형 웹이 되도록 하는 중요 키워드-->
    <!-- 위 3개의 메타 태그는 *반드시* head 태그의 처음에 와야합니다; 어떤 다른 콘텐츠들은 반드시 이 태그들 *다음에* 와야 합니다 -->
    <title>부트스트랩 101 템플릿</title>

    <!-- 부트스트랩 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
    <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>부트스트랩 프레임워크</title>

<!-- 부트스트랩  -->
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<script src="./resource/js/jquery-3.4.1.min.js"></script>

<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->

</head>
<body>
	<h1>아이콘</h1>
	<div>
		콤포넌트에 소개된 아이콘의 클래스를 유지하면 아이콘이 출력된다.
	</div>
	<button type="button" class="btn btn-info" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	
	<a href="http://naver.com/" class="btn btn-success" >
		<span class="glyphicon glyphicon-tower" ></span>
	</a>
		
	<i class="glyphicon glyphicon-leaf"></i>
	
	<h1>드롭다운</h1>
	<div class="dropdown">
		<button class="btn btn-warning dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
			Dropdown
			<span class="caret"></span>
		</button>
		<ul class="dropdown-menu">
			<li role="presentation"><a href="#">유니스야 </a></li>
			<li role="presentation" class="divider"></li>
			<li role="presentation"><a href="#">카레 먹고싶어</a></li>
			<li role="presentation" class="divider"></li>
			<li role="presentation"><a href="#">다은이</a></li>
			<li role="presentation"><a href="#">바부..</a></li>
		</ul>
	</div>
	
	<h1>버튼그룹</h1>
	<div class="btn-group">
		<button type="button" class="btn btn-danger">Left</button>
		<button type="button" class="btn btn-success">Middle</button>
		<button type="button" class="btn btn-info">Right</button>
	</div>
	<div class="btn-group btn-group-lg">
		<button type="button" class="btn btn-danger">Left</button>
		<button type="button" class="btn btn-success">Middle</button>
		<button type="button" class="btn btn-info">Right</button>
	</div>
	
	<h1>크기를 알리는 클래스 접두사</h1>
	<div>
		대략적으로 크기를 지정할 수 있는 클래스 옵션이 있으며, 대표 클래스 다음 대표클래스-* 형태로 클래스를 지정하여 크기를 조절할 수 있다.
		<br>
		예) btn btn-lg
		<br>
		크기 종류
		<br>
		대표클래스-xs < 대표클래스-sm < 대표클래스-md < 대표클래스-lg	
	</div>
	<button type="button" class="btn btn-info btn-xs" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	<button type="button" class="btn btn-info btn-sm" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	<button type="button" class="btn btn-info btn-md" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button> 
	<button type="button" class="btn btn-info btn-lg" >
		<span class="glyphicon glyphicon-asterisk" ></span>
	</button>
	
	<h1>양쪽 정렬 버튼</h1>
	<div>부모의 태그 가로 사이즈 100% 지정하여 정렬</div>
	<div class="btn-group btn-group-justified" role="group" aria-label="...">
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Left</button>
		</div>
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Middle</button>
		</div>
		<div class="btn-group" role="group">
			<button type="button" class="btn btn-default">Right</button>
		</div>
	</div>
	
	<h1>색상을 표기하는 클래스 접두사</h1>
	<div>
		색상을 표기할 때 '대표클래스-*' 형태로 사용 가능하며 	대략적으로 테마별 옵션은 아래의 6가지 옵션으로 지정하여 쓰도록 하고 있다.
		<br>
		대표클래스-default<br>
		대표클래스-danger<br>
		대표클래스-warning<br>
		대표클래스-success<br>
		대표클래스-info<br>
		대표클래스-primary<br>
	</div>
	<button type="button" class="btn btn-default">default</button>
	<button type="button" class="btn btn-danger">danger</button>
	<button type="button" class="btn btn-warning">warning</button>
	<button type="button" class="btn btn-success">success</button>
	<button type="button" class="btn btn-info">info</button>
	<button type="button" class="btn btn-primary">primary</button>
	
	<h1>폼 태그 기본 클래스</h1>
	<div>기본적으로 폼태그에 들어가는 클래스가 있다.<br> 
		form-control : 부모의 가로 사이즈를 기준으로 100% 정렬 
	</div>
	<input type="text" class="form-control">
	<select class="form-control">
		<option> :: 선택 :: </option>
	</select>
	<textarea class="form-control"></textarea>
	
	<h1>입력 그룹</h1>
	<div class="input-group">
		<span class="input-group-addon" id="basic-addon1">@</span>
		<input type="text" class="form-control" placeholder="Username">
	</div>
	
	<div class="input-group">
		<span class="input-group-addon" id="basic-addon1">
			<input type="checkbox"> 체크하기
		</span>
		<input type="text" class="form-control" placeholder="Username">
	</div>
	
	<div class="input-group">
		<input type="text" class="form-control" placeholder="Username">
		<span class="input-group-btn">
			<button type="button" class="btn btn-warning">버튼</button>
		</span>
	</div>
	
	
	<h1>active 클래스</h1>
	<div>
		active는 현재 위치 혹은 강조를 표기하는(활성화) 클래스이다.
	</div>
	
	<h1>탭</h1>
	<ul class="nav nav-tabs">
	  <li class="active"><a href="#">Home</a></li>
	  <li class="active"><a href="#">Profile</a></li>
	  <li><a href="#">Messages</a></li>
	</ul>

	<h1>네비게이션 바</h1>	
	<div>
		- nav 태그에 navbar 대표 클래스가 있어야 하며, navbar-* 접두사로 색상 변경이 가능하다.
		<br>
		- navbar-header 클래스는 브랜드(로고)와 반응형에 관련된 메뉴 아이콘의 요소가 들어있다.
		<br>
		- collapse navbar-collapse 클래스는 실제 보이는 메뉴를 나열할 수 있다.
	</div>
	<nav class="navbar navbar-inverse">
	  <div class="container-fluid">
	    <!-- Brand and toggle get grouped for better mobile display -->
	    <div class="navbar-header">
	      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-navbar">
	        <span class="sr-only">Toggle navigation</span>
	        <span class="icon-bar"></span>
	        <span class="icon-bar"></span>
	        <span class="icon-bar"></span>
	      </button>
	      <a class="navbar-brand" href="#">Brand</a>
	    </div>
	
	    <!-- Collect the nav links, forms, and other content for toggling -->
	    <div class="collapse navbar-collapse" id="bs-navbar">
	      <ul class="nav navbar-nav navbar-left">
	        <li><a href="#">Link</a></li>
	        <li><a href="#">Zelda</a></li>
	        <li><a href="#">WolfLink</a></li>
	      </ul>
	    </div><!-- /.navbar-collapse -->
	  </div><!-- /.container-fluid -->
	</nav>	
	
	<h1>data-target 속성</h1>
	<div>
		버튼 태그에 data-target 속성이 존재할 경우 이벤트를 발동시킬 대상을 말하는 것이며, data-target에 명시된 대상은 존재해야 한다.
		<br>
		ex) data-target="선택자" : 선택자와 일치하는 타겟이 있어야 함.
	</div>

	<h1>라벨</h1>
	<div>
		인라인 속성 태그를 기준으로 사용 가능하며, 주로 span 태그에 적용한다.
		<br>
		라벨에도 색상기준 접두사로 옵션을 붙여 사용할 수 있다.
		<br>
		대표 클래스 : label
		<br>
		색상옵션 : label-*
		<br>
		* : default, danger, warning, success, info, primary 
	</div>
	
	<span class="label label-default">default</span>
	<span class="label label-danger">danger</span>
	<span class="label label-warning">warning</span>
	<span class="label label-success">success</span>
	<span class="label label-info">info</span>
	<span class="label label-primary">primary</span>
	
	<h1>뱃지</h1>
	<span class="badge badge-default">default</span>
	
	<h1>alert</h1>
	<div>
		알림을 텍스트로 표현할 때<br>
		대표 클래스 alert <br>
		옵션 클래스 alert-*<br>
		* : danger, warning, success, info<br><br>
	</div>
		<span class="alert alert-danger">danger</span>
		<span class="alert alert-warning">warning</span>
		<span class="alert alert-success">success</span>
		<span class="alert alert-info">info</span>
	
	<h1>패널</h1>
	<div>
		대표 클래스 panel <br>
		옵션 클래스 panel-* <br>
		* : default, danger, warning, success, info, primary
				
		panel 클래스의 하위 태그<br>
		panel-heading, panel-body, panel-footer 클래스를 가진 태그로 이루어져 있다.<br>
	</div>
	<div class = "panel panel-default">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
		<div class="panel-footer">footer</div>
	</div>
	<div class = "panel panel-danger">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
		<div class = "panel panel-warning">
	<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-success">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-info">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	<div class = "panel panel-primary">
		<div class="panel-heading">heading</div>
		<div class="panel-body">body</div>
	</div>
	
	<h1>모달</h1>
	<div>
		레이어 팝업 - 레이아웃을 설정하고 css 조정으로 팝업 효과가 보이도록 만드는 콤포넌트
	</div>
	<!-- Button trigger modal -->
	<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">
	  Launch demo modal
	</button>
	
	<!-- Modal -->
	<div class="modal fade" id="myModal">
	  <div class="modal-dialog">
	    <div class="modal-content">
	      <div class="modal-header">
	        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
	        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
	      </div>
	      <div class="modal-body">
	        ...
	      </div>
	      <div class="modal-footer">
	        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
	        <button type="button" class="btn btn-info">Save changes</button>
	      </div>
	    </div>
	  </div>
	</div>
	
	<h1>pull-left, pull-right</h1>
	<div>
		인라인 요소 처럼 텍스트 등을 정렬할 때 사용
	</div>
	<h1>
		pull-left테스트
		<small class="pull-left">pull-left</small>
	</h1>
	<h1>
		pull-right테스트
		<small class="pull-right">pull-right</small>
	</h1>	
	
	<h1></h1>
<script src="./resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>

ajaxEx01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사 + ajax 아이디 중복 검사</title>
<script type="text/javascript" src="<%=request.getContextPath()%>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		제출실습1. '성명, 아이디, 패스워드, 패스워드 확인, 이메일, 성별'을
		유효성 검사를 하는 코드를 작성하고, 아이디는 아이디 중복검사를 하도록 하여라.
		(아이디 중복검사 ajax : 중복검사하는 jsp 페이지는 직접 만들고 작성하시오.)
	*/
	$(function() {
		$('#btn').click(function() {
			var valName = $('#name').val();
			var valId = $('#id').val();
			var valPass = $('#pass').val();
			var valCPass = $('#cPass').val();
			var valEmail = $('#email').val();
			var idCheck = $('#idCheck').attr('idCheck');
			
			if(valName == null || valName == undefined || valName == ""){ alert('성명을 입력해주세요.'); $('#name').focus(); return;} 
			if(valId == null || valId == undefined || valId == ""){ alert('아이디를 입력해주세요.'); $('#id').focus();  return;}
			if(idCheck == "" || idCheck == "N"){alert('아이디 중복확인를 해주세요'); $('#idCheck').focus(); return;}
			if(valPass == null || valPass == undefined || valPass == ""){ alert('패스워드을 입력해주세요.'); $('#pass').focus(); return;} 
			if(valCPass == null || valCPass == undefined || valCPass == ""){ alert('패스워드 확인을 입력해주세요.'); $('#cPass').focus(); return;} 
			if(valPass != valCPass){ alert('패스워드와 패스워드 확인이 같지 않습니다.'); $('#pass').val(""); $('#cPass').val(""); $('#pass').focus(); return;}
			if(valEmail == null || valEmail == undefined || valEmail == ""){ alert('이메일을 입력해주세요.'); $('#email').focus(); return;}
			if(!$('.gender').prop('checked')){ alert('성별을 체크해주세요.'); $('.gender')[0].focus(); return;}
			$('#login').submit();
		});
		
		$('#idCheck').click(function(){

				var valId = $('#id').val();	
				
				var request = $.ajax({
					url: "<%=request.getContextPath() %>/idcheck.jsp", //통신할 url
					method: "POST", //통신할 메서드 타입
					data: { id : valId }, //전송할 데이타
					dataType: "json"
				});	 
				
				request.done(function( data ) {
					console.log(data.result)
					if(data.result == 'Y'){
						$('#idCheck').attr('idCheck','Y');
						alert('사용 가능한 아이디입니다.');
					} else{
						$('#idCheck').attr('idCheck','N');
						alert('사용할 수 없는 아이디입니다.');
					}	
				});	 
				request.fail(function( jqXHR, textStatus ) {
				  alert( "Request failed: " + textStatus );
				});			
				
			});		
	})
	
</script>
</head>
<body>

	<form action="#" method="post" id="login">
		<table>
			<tr><td>성명</td><td><input type="text" id="name"></td><td></td></tr>
			<tr><td>아이디</td><td><input type="text" id="id"></td><td><button type="button" idCheck="" id="idCheck">아이디 중복확인</button></td></tr>
			<tr><td>패스워드</td><td><input type="password" id="pass"></td><td></td></tr>
			<tr><td>패스워드 확인</td><td><input type="password" id="cPass"></td><td></td></tr>
			<tr><td>이메일</td><td><input type="text" id="email"></td><td></td></tr>
			<tr><td>성별</td><td>남 <input type="radio" class="gender" name="gender" value="남">	여  <input type="radio" class="gender" name="gender" value="여"> </td><td></td></tr>
			<tr><td></td><td></td><td><button type="button" id="btn">회원가입</button></td><tr>
		</table>
	</form>
</body>
</html>

idcheck.jsp

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.*" %>
<%
/*
 	id001, id002, id003은 데이터베이스 조회 하에 존재하는 아이디라고 가정한다.
*/

Gson gson = new Gson();
Map map = new HashMap();

String id = request.getParameter("id");

if( !"".equals(id) && id != null){
	if("id001".equals(id) || "id002".equals(id) || "id003".equals(id)){
		map.put("result", "N");
	} else {
		map.put("result", "Y");}
}
String result = gson.toJson(map);
out.print(result);
%>

 


<풀이>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>유효성 검사 + ajax 아이디 중복 검사</title>
<style type="text/css">
	.input-group{margin-bottom: 10px;}
	.input-group label { 
		color: #424242; 
		font-size: 15px; 
		padding-right: 10px; 
	}
</style>
<script type="text/javascript" src="<%=request.getContextPath() %>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		제출실습1. '성명, 아이디, 패스워드, 패스워드 확인, 이메일, 성별' 을
		유효성 검사를 하는 코드를 작성하고, 아이디는 아이디 중복검사를 하도록하여라.
		(아이디 중복검사 ajax : 중복검사하는 jsp 페이지는 직접 만들고 작성하시오.)			
	*/
	$(function(){
		
		/************************************************
		아이디 중복 체크 함수
		작성자 : 홍길동
		작성일 : 2020-04-08
		'아이디 중복검사', '회원가입' 버튼클릭시 같은 코드로 
		확인하도록 하기위해서 함수로 별도 제작
		2곳에서 사용하고 비동기화로 체크가 동시에 불가능하여
		동기화로  ajax 통신하도록 설정
		*************************************************/		
		var userIdCheck = function(){
			
			var userId = $('[name="userId"]').val();
			var getCheckData;
			
			//ajax 동기화
			var request = $.ajax({
				url: "ajaxIdCheck.jsp", //통신할 url
				method: "POST", //통신할 메서드 타입
				data: { userId : userId }, //전송할 데이타
				dataType: "json",
				async : false //동기화시키기
			});	 
			request.done(function( data ) {
				if(data != undefined && data != ''){
					//동기화임으로 getCheckData에 결과값 받아
					//아래 코드에서 처리 가능
					getCheckData = data;
				}
			});	 
			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
			
			//동기화 방식으로 하여 결과값을 받아 올수 있어
			//getCheckData 데이타 체크
			if(getCheckData == undefined || getCheckData.result == 'Y'){
				alert('사용할 수 없는 아이디 입니다.');
				$('[name="idCheck"]').val('N');
				return true;
			}else{
				$('[name="idCheck"]').val('Y');
			}
			return false;
		}
		
		/************************************************
		유효성 검사 함수
		작성자 : 홍길동
		작성일 : 2020-04-08
		반복되는 작업을 최소화 하기위해서 함수로 유효성 검사 제작
		함수 리턴값이 true 일경우 에러  
		!!객체에 담긴 키 정의 내역
		1) target : 체크 대상
		2) compareTarget : 체크 대상의 값과 비교 할 대상 - 값이 있을 경우 target과 비교
		3) lenTarget : 데이타 갯수 체크 대상 - 값이 존재할 경우 length가 0이면 안됨
		4) msg : 에러 발생시 출력할 문구
		*************************************************/			
		var valueChecks = function(checkObj){
				
			var target = checkObj.target; //값 체크 대상
			var compareTarget = checkObj.compareTarget; //값과 일치 비교 대상
			var lenTarget = checkObj.lenTarget; //데이타 갯수 
			var msg = checkObj.msg; //에러 발생시 문구
			var isCheck = false; //정상일 경우 false 에러일경우 true 반환
						
			if(target != undefined){
				if(compareTarget != undefined){
					if(target.val() != compareTarget.val()){						
						alert(msg);
						compareTarget.val('')
						compareTarget.focus();
						isCheck = true;
					}
				}else if(lenTarget != undefined){
					if(lenTarget.length == 0){
						alert(msg);
						target.eq(0).focus();
						isCheck = true;
					}
				}else{
					if(target.val() == ''){						
						alert(msg);
						target.focus();
						isCheck = true;
					}						
				}
			}else{
				isCheck = true;
			}
			
			return isCheck;
		}
		
		//회원가입 클릭 이벤트
		$('#joinBtn').click(function(){	
			if(valueChecks({target : $('[name="userName"]'), 	msg : '회원명을 입력해주세요.'})) return;
			if(valueChecks({target : $('[name="userId"]'), 		msg : '회원아이디를 입력해주세요.'})) return;						
			if(valueChecks({target : $('[name="userPw"]'), 		msg : '패스워드를 입력해주세요.'})) return;			
			if(valueChecks({target : $('[name="userPw"]'), 		msg : '패스워드가 틀립니다.', compareTarget : $('[name="userPwCheck"]')})) return;
			if(valueChecks({target : $('[name="userEmail"]'), 	msg : '이메일을 입력해주세요.'})) return;
			if(valueChecks({target : $('[name="userGender"]'), 	msg : '성별을 입력해주세요.', lenTarget : $('[name="userGender"]:checked')})) return;
			if(valueChecks({target : $('[name="idCheck"]'), 	msg : '아아디 중복검사를 실행 해주세요.'})) return;	
			if(userIdCheck()) return;	//아이디 중복 검사 한번더 실시		
			$('#joinFrom').submit();
			
		});
		//아이디 중복검사 클릭 이벤트
		$('#userIdCheck').click(function(){
			if(!userIdCheck()){
				alert('사용할 수 있는 아이디 입니다.');
			}
		});
				
	});
</script>
</head>
<body>
	<form id="joinFrom" action="./ajaxEx01.jsp" method="post">
	
		<input type="hidden" name="idCheck">
		
		<div class="input-group">
			<label>회원명 </label>
			<input type="text" name="userName">
		</div>
		<div class="input-group">
			<label>아이디 </label>
			<input type="text" name="userId">
			<button type="button" id="userIdCheck">아이디 중복 검사</button>
			<div id="userIdMsg"></div>
		</div>
		<div class="input-group">
			<label>패스워드 </label>
			<input type="password" name="userPw">
		</div>
		<div class="input-group">
			<label>패스워드 확인 </label>
			<input type="password" name="userPwCheck">
		</div>
		<div class="input-group">
			<label>이메일 </label>
			<input type="text" name="userEmail">
		</div>
		<div class="input-group">
			<label>			
				<input type="radio" name="userGender" value="남">
				남
			</label>
			<label>			
				<input type="radio" name="userGender" value="여">
				여
			</label>
		</div>
		
		<button type="button" id="joinBtn"> 회원가입 </button>
	</form>
</body>
</html>

 

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%
	/*
		데이타 베이스에서 조회하였다는 가정하에
		아래 데이타 나열.
		나열된 데이타는 이미 존재하는 아이디
		id001, id002, id003
	*/	
	String userId = request.getParameter("userId");
	//Gson 인스턴스화(객체화)
	Gson gson = new Gson();		
	//Map을 객체화 하기
	Map map = new HashMap();
	if(
		   "id001".equals(userId) 
		|| "id002".equals(userId) 
		|| "id003".equals(userId)
		|| "".equals(userId)
		|| userId == null
	){		
		map.put("result", "Y");
	}else{
		map.put("result", "N");
	}
	String result = gson.toJson(map);
	out.print(result);
%>

 

'JavaScript' 카테고리의 다른 글

[BootStrap] grid / responsive-utilities  (0) 2020.04.08
[BootStrap] components / modals  (0) 2020.04.08
[JQuery] ajax 실습  (0) 2020.04.07
[JQuery + Ajax] html, json call / gson  (0) 2020.03.31

ajaxSearchData.jsp

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.google.gson.Gson" %>
<%@ page import="java.util.*" %>
<%
	/*
		배열 선언시 배열의 크기를 지정 후에 선언(인스턴스화)이 가능하다.
		혹은 배열 선언 동시에 값을 지정하여 선언(인스턴스화)해야한다.
	*/
/* 	// String[] str = new String[배열크기];
	String[] str1 = new String[10];
	//인덱스로 접근하여 배열에 값을 삽입 
	str1[0] = "홍길동";
	
	//값이 있는 상태로 배열 선언
	String[] str2 = new String[]{"홍길동"}; */

	Map stepMap = null;

	
	String step = request.getParameter("step");
	String searchData = request.getParameter("searchData");
	
	if("1".equals(step)){
		stepMap = new HashMap();
		stepMap.put("정보기술",new String[]{"정보기술전략","정보기술개발"});
		stepMap.put("통신기술",new String[]{"유선통신구축","무선통신구축"});
		stepMap.put("방송기술",new String[]{"방송제작기술","방송플랫폼기술"});
	}
	if ("2".equals(step)){
		stepMap = new HashMap();
		stepMap.put("정보기술전략",new String[]{"SW아키텍처","응용SW엔지니어링"});
		stepMap.put("정보기술개발",new String[]{"IT시스템관리","IT기술교육"});
		stepMap.put("유선통신구축",new String[]{"교환시스템구축","구내통신구축"});
		stepMap.put("무선통신구축",new String[]{"무선통신시스템구축","전송시스템구축"});
		stepMap.put("방송제작기술",new String[]{"중계방송","방송품질관리"});
		stepMap.put("방송플랫폼기술",new String[]{"라디오방송","지상파TV방송"});
	}
	//맵 객체가 생성 되었다면
	if (stepMap != null){
		Gson gson = new Gson();
		//맵이 객체화 되면서 담긴 데이터를 Map 클래스의 get 메서드로 조회하여 Json으로 출력
		String json = gson.toJson(stepMap.get(searchData));
		out.print(json);
	} else { //객체 생성이 되지 않았다면
		out.print("{}");
	}
		

	
%>

내가 만든 야매 화면

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> 
<title>ajax 실습</title>
<script type="text/javascript" src="<%=request.getContextPath()%>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*  
		예제 경로 : https://ncs.go.kr/unity/th03/ncsSearchMain.do
		실습 1. ajax를 활용하여 select 태그로 위의 예제 경로 처럼 중, 소, 세분류의 데이터가 출력되도록 하여라.
				호출 경로 : ajaxSearchData.jsp
	*/
$(function() {
	$('#midSelect').change(function() {
		var step = 1;
		
		var searchData = $(this).val()[0];
		console.log(step);
		console.log(searchData);
		
		var request = $.ajax({
			  url: "<%=request.getContextPath()%>/ajaxSearchData.jsp", //통신 할 url
			  method: "POST", // 통신할 메서드 타입
			  data : {step : step , searchData : searchData},
			  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
		});
		
		request.done(function(data) {
			var txt = "";	
			console.log(data);
			for (var i =0; i < data.length ; i++){
				txt += '<option value="'
				txt += data[i]
				txt += '">'
				txt += data[i]
				txt += '</option>'
			}
			console.log(txt);
			$('#smallSelect').html(txt);
			$('#tinySelect').html("");
		})
		request.fail(function( jqXHR, textStatus ) {
		  alert( "Request failed: " + textStatus );
		});
	});
	
	$('#smallSelect').change(function() {
		var step = 2;		
		var searchData = $(this).val()[0];
		console.log(step);
		console.log(searchData);		
		var request = $.ajax({
			  url: "<%=request.getContextPath()%>/ajaxSearchData.jsp", //통신 할 url
			  method: "POST", // 통신할 메서드 타입
			  data : {step : step , searchData : searchData},
			  dataType: "json" //전송받은 데이터를 변화시킬 컨텐츠 타입	
		});
		
		request.done(function(data) {
			var txt = "";	
			console.log(data);
			
			for (var i =0; i < data.length ; i++){
				txt += '<option value="'
				txt += data[i]
				txt += '">'
				txt += data[i]
				txt += '</option>'
			}
			console.log(txt);
			$('#tinySelect').html(txt);
		})	
		request.fail(function( jqXHR, textStatus ) {
		  alert( "Request failed: " + textStatus );
		});
	});
})
	
</script>

</head>
<body>
	<!-- select 태그에 multiple 속성이 추가될 경우 option 태그의 내용이 펼쳐진 상태로 선택을할 수 있으며, 다중 선택도 가능하게 된다. -->
	<select multiple="multiple" id="midSelect">
		<option value="정보기술">정보기술</option>
		<option value="통신기술">통신기술</option>
		<option value="방송기술">방송기술</option>
	</select>
	<select multiple="multiple" id="smallSelect">
	</select>
	<select multiple="multiple" id="tinySelect">
	</select>
</body>
</html>

풀이

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax 실습</title>
<script type="text/javascript" src="<%=request.getContextPath() %>/resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
	/*
		//예제 경로 : https://www.ncs.go.kr/unity/th03/ncsSearchMain.do
		실습1. 위의 예제 경로 처럼 중분류, 소분류, 세분류의 데이타가
		select 테그에 데이타가 출력되도록 하여라.(ajax활용)
		호출경로 : ajaxSearchData.jsp
	*/
	$(function(){
		$('#step1, #step2').change(function(){
			
			var searchData = $(this).val();
			var step = $(this).attr('data-step');	
			
			console.log(searchData, step);
						
			var request = $.ajax({
				url: "<%=request.getContextPath() %>/ajaxSearchData.jsp", //통신할 url
				method: "POST", //통신할 메서드 타입
				data: { searchData : searchData[0], step : step }, //전송할 데이타
				dataType: "json" 
			});	 
			
			request.done(function( data ) {
				
				if(data.length != undefined){
					var html = '';
					for(var i=0; i < data.length; i++){
						html += '<option value="' +data[i]+ '">';
						html += data[i];
						html += '</option>';
					}
					if(step == '1'){
						$('#step2').html(html);
					}else{
						$('#step3').html(html);
					}
				}				
			});	 
			request.fail(function( jqXHR, textStatus ) {
			  alert( "Request failed: " + textStatus );
			});
		});
	});
</script>
</head>
<body>
	<!-- 
		select 테그에  multiple 속성이 추가 될경우 option 테그의 내용이 펼쳐진 상태로
		선택을 할 수 있으며, 다중 선택도 가능하게 된다.
	-->
	<select multiple="multiple" id="step1" data-step="1">
		<option value="정보기술">정보기술</option>
		<option value="통신기술">통신기술</option>
		<option value="방송기술">방송기술</option>
	</select>
	<select multiple="multiple" id="step2" data-step="2">
	</select>
	<select multiple="multiple" id="step3" data-step="3">
	</select>
</body>
</html>

 

코드가 더러워서 그렇지 야매도 꽤 잘 굴러갔음~

 

게임 전적검색을 주제로 정했다.

 

요구사항분석

전적 검색 요구사항 분석
① 전적 검색을 위해 유저 닉네임을 입력해야 한다. 
② 유저는 닉네임 및 티어 정보를 유지해야 한다.
③ 유저는 닉네임으로 식별한다.
④ 챔피언에 대한 챔피언 번호, 챔피언 이름을 유지해야 한다.
⑤ 챔피언은 챔피언 번호로 식별한다.
⑥ 스펠에 대한 스펠 번호, 스펠명을 유지해야 한다.
⑦ 스펠은 스펠 번호로 식별한다.
⑧ 아이템에 대한 아이템 번호, 아이템 명을 유지해야 한다.
⑨ 아이템은 아이템 번호로 식별한다.
⑩ 대전에 대한 대전 번호, 유저 닉네임, 챔피언 레벨, 챔피언 이름, 아이템7, 스펠1, 스펠2, kda, 피해량, cs는 유지 해야한다.
⑪ 대전에서 아이템1, 아이템2, 아이템3, 아이템4, 아이템5, 아이템6, 와드는 null값일 수도 있다.
⑫ 대전은 대전 번호와 유저 닉네임으로 식별한다.


테이블 살짝 뽑기

id 테이블

 

챔피언 테이블

 

아이템 테이블

 

스펠 테이블
대전 테이블


요구사항목록


요구사항정의서 **유스케이스명세서**

(참고용)


테이블명세서

 

테이블 이름

ID

속성이름

데이터타입

널 허용

기본값

기본키

외래키

제약조건

num

INT

N

 

PK

   

id

VARCHAR

N

       

테이블 이름

챔피언

속성이름

데이터타입

널 허용

기본값

기본키

외래키

제약조건

챔피언코드

VARCHAR

N

 

PK

   

챔피언명

VARCHAR

N

       

테이블 이름

아이템

속성이름

데이터타입

널 허용

기본값

기본키

외래키

제약조건

아이템코드

VARCHAR

N

 

PK

   

아이템명

VARCHAR

N

       

테이블 이름

스펠

속성이름

데이터타입

널 허용

기본값

기본키

외래키

제약조건

스펠코드

VARCHAR

N

 

PK

   

스펠명

VARCHAR

N

       

테이블 이름

대전

속성이름

데이터타입

널 허용

기본값

기본키

외래키

제약조건

대전num

INT

N

 

PK

   

id

VARCHAR

N

  PK    

레벨

INT

N

       

챔피언

VARCHAR

N

     

 

아이템1

VARCHAR

Y

       

아이템2

VARCHAR

Y

 

     

아이템3

VARCHAR

Y

 

     
아이템4 VARCHAR Y        
아이템5 VARCHAR Y        
아이템6 VARCHAR Y        
아이템7 VARCHAR N        
스펠1 VARCHAR N        
스펠2 VARCHAR N        
KDA VARCHAR N        
피해량 VARCHAR N        
와드 VARCHAR Y        
CS VARCHAR N        

 


처음 해보는 일이라 생각 하기가 어렵다~

'Diary' 카테고리의 다른 글

[Java] Array, ArrayList  (0) 2020.04.16
200413  (0) 2020.04.13
200324  (0) 2020.03.24
20200304  (0) 2020.03.04

사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.

VIEW의 특징

  • 기본테이블로부터 유도된 테이블이기에 테이블과 같은 형태의 구조이며 조작도 테이블과 거의 같다.
  • 가상 테이블이기에 테이터의 논리적 독립성을 제공한다.
  • 뷰를 통해서만 데이터를 접근하여 뷰에 나타나지 않는 데이터 보안에 도움
  • 필요한 데이터만 뷰로 정의해서 처리하기에 관리가 용이하고 명령문이 간단함.

VIEW의 단점

  • 가상 테이블이기에 데이터의 논리적 독립성을 제공한다.
  • ALTER VIEW 문을 사용할 수 없다. (뷰의 정의를 변경할 수 없다.)
  • 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다. (사용하지 않는 것이 바람직.)

MySQL VIEW의 제약사항

  • 뷰의 정의는 select 구문이 허용하는 wher, group by와 같은 것을 모두 포함 가능.
  • TEMPORARY 뷰를 만들 수 없다.
  • 뷰와 함께 연결되는 트리거를 만들 수 없다,.
  • 뷰 정의에 있는 select 구문은 다음과 같은 구성을 포함할 수 없다.
    • from절 안 서브쿼리
    • TEMPORARY 테이블로 참조
    • 사용자 변수로 참조

view 생성 실습

1

회원 별 구매이력 중 구매금액이 가장 높은 금액의 상품명을 추출하여 회원아이디와 이메일을 포함한 뷰테이블을 생성하시오.

SELECT
	m.m_id								AS v_id
	,m.m_email							AS v_email
	,g.g_name							AS v_g_name
	,MAX(g.g_price* o.o_amount)	AS v_max_amt
FROM
	tb_order AS o
	INNER join
	tb_goods AS g
	on
	o.o_g_code = g.g_code
	INNER join
	tb_member AS m
	ON 
	m.m_id = o.o_id
GROUP BY m.m_id;


 

CREATE VIEW v_max_amt_member
AS 
SELECT
	m.m_id								AS v_id
	,m.m_email							AS v_email
	,g.g_name							AS v_g_name
	,MAX(g.g_price* o.o_amount)	AS v_max_amt
FROM
	tb_order AS o
	INNER join
	tb_goods AS g
	on
	o.o_g_code = g.g_code
	INNER join
	tb_member AS m
	ON 
	m.m_id = o.o_id
GROUP BY m.m_id;

 

2

tb_test 테이블을 다음과 같이 조회하시오.

SELECT
	t.t_season AS '계절'
	,SUM(if(t.t_name = '김성주',t.t_amount,0)) AS '김성주'
	,SUM(if(t.t_name = '정동영',t.t_amount, 0)) AS '정동영'
	,SUM(t.t_amount) AS '합계'
FROM
	tb_test AS t
GROUP BY t.t_season
;

 

3

매자별 구매이력 중 상품별로 구매수량이 20개 이상인 상품의 목록을 추출하여 다음과 같이 조회하시오.

SELECT
 	m.m_name AS '구매자'
 	,GROUP_CONCAT(DISTINCT g.g_name ORDER BY g.g_name) AS '상품명'
FROM
	tb_member AS m
	INNER JOIN
	tb_order AS o
	ON
	m.m_id = o.o_id
	INNER JOIN
	tb_goods AS g
	ON
	o.o_g_code = g.g_code
WHERE
	o.o_amount >= 20
GROUP BY m.m_name;

 

'Database' 카테고리의 다른 글

[Database] 프로시저  (0) 2020.04.13
[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25

+ Recent posts