학원일기

21일

걷는 청년 2024. 7. 24. 11:52

 

 

SQL 마무리. 간단한 백업과 복구

 

-- MariaDB(MySQL)를 설치하게 되면 가장 먼저 사용되는 계정은 root 계정
-- root 계정의 경우 관리자 계정이기 때문에 데이터베이스에 대한 모든 권한을 가지고 있다
-- 때문에 실제 서비스에 사용되는 DB의 경우 실질적인 관리자만 root 계정을 사용하고
-- 이외의 DB 사용자들은 용도에 맞는 권한을 부여받은 계정을 이용하는 것이 데이터베이스를 관리하는 데 있어서 좋은 방식이다

-- 간단한 백업과 복구
-- https://www.lesstif.com/dbms/mysqldump-db-backup-load-17105804.html

 

 

CREATE DATABASE ourdb;
USE ourdb;
SHOW TABLES;

CREATE TABLE good(NO INT PRIMARY KEY, NAME VARCHAR(10));
INSERT INTO good VALUES(1,'재형이');
INSERT INTO good VALUES(2,'보현이');


-- cmd 창에서	cd C:\Program Files\MariaDB 10.6\bin
-- mysqldump -uroot -p123 ourdb > c:\work\kbs_backup.sql
-- kbs_backup.sql 백업 파일 작성 성공

DROP DATABASE ourdb;
SHOW DATABASES;

-- 백업 파일로 db 복구
CREATE DATABASE ourdb;
USE ourdb;
SHOW TABLES;
-- mysql -uroot -p123 ourdb < c:\work\kbs_backup.sql

SHOW TABLES;
DESC good;
SELECT * FROM good;

 

 

 

저장 프로시저(Stroed Procedure)

 

쿼리문들의 집합으로, 어떤 동작을 여러쿼리를 거쳐서 일괄적으로 처리할 때 사용한다.
절차적인 프로그래밍을 사용한다. ( SQL + <변수, 제어문 등>)
저장 프로시저를 실무에서 사용하는 이유는
- SQL Server의 성능을 향상 시킬 수 있다.
- 유지보수 및 재활용 측면에서 좋다.
- 셋째, 보안을 강화할 수 있다.
- 네트워크의 부하를 줄일 수 있다.

클라이언트에서 서버로 쿼리의 모든 텍스트가 전송될 경우 네트워크에는 큰 부하가 발생하게 된다. 
하지만 저장 프로시저를 이용한다면 저장프로시저의 이름, 매개변수 등 몇글자만 전송하면 되기 때문에 부하를 크게 줄일 수 있다.

 

 

USE mydb;

-- ex1
delimiter // -- // 대신 $$도 가능
CREATE OR REPLACE PROCEDURE sp_1(a INT, b INT)
BEGIN -- PROCEDURE 본체 시작
DECLARE X,Y INT DEFAULT 0;	-- 변수 선언. 대소문자 구분 없다
SET X = 10;	-- 변수에 값 대입
SELECT X,Y;	-- 콘솔로 출력
SELECT X+Y; -- 두 변수의 합을 반환
END; -- PROCEDURE 본체 끝
//
delimiter ;

CALL sp_1(1,3);
CALL sp_1(100,35);

SHOW PROCEDURE STATUS;
SHOW CREATE PROCEDURE sp_1;

-- ex2
delimiter //
CREATE OR REPLACE PROCEDURE sp_2()
BEGIN
SELECT * FROM jikwon WHERE jikwon_no < 5;
SELECT * FROM buser;
END
//
delimiter ;

CALL sp_2();

-- ex3
delimiter //
CREATE OR REPLACE PROCEDURE sp_3(para1 INT, para2 INT)
BEGIN
SELECT * FROM jikwon WHERE jikwon_no = para1;
SELECT * FROM jikwon WHERE jikwon_no = para2;
END
//
delimiter ;

CALL sp_3(3,8);

-- ex4 : if
delimiter //
CREATE OR REPLACE PROCEDURE sp_4(IN jik VARCHAR(20) CHARSET UTF8, num int)
BEGIN
SELECT jik;
SELECT * FROM jikwon WHERE jikwon_jik=jik;
if(num = 10) then SELECT * FROM jikwon WHERE buser_num=10;
ELSEIF(num = 10) then SELECT * FROM jikwon WHERE buser_num=20;
ELSE SELECT * FROM jikwon WHERE buser_num NOT IN(10,20);
END if;

END
//
delimiter ;

CALL sp_4('대리', 20);
CALL sp_4('부장', 30);

-- ex5 : while
delimiter //
DROP PROCEDURE if EXISTS sp_5 //
CREATE PROCEDURE sp_5()
BEGIN
DECLARE X INT;
DECLARE str VARCHAR(255);
SET X = 1;
SET str = '';

while X <=5 DO
	SET str = CONCAT(str, X, ',');
	SET X = X + 1;
END while;

SELECT str;
END
//
delimiter ;

CALL sp_5;

-- ex6
delimiter //
DROP PROCEDURE if EXISTS sp_6 //
CREATE PROCEDURE sp_6()
BEGIN
DECLARE X INT;
DECLARE str VARCHAR(255);
SET X=1;
SET str='';

repeat
	SET str = CONCAT(str, X, ',');
	SET X = X + 2;
until X > 5
END repeat;

SELECT str;
END
//
delimiter ;

CALL sp_6;

-- 사용자 정의 함수 만들기
-- ex1 : BMI 계산 함수 만들기
-- 표준체중(BMI값 22 기준) = 신장(cm) * 신장(cm) * 22 / 10000

delimiter $$
CREATE OR REPLACE FUNCTION fu_1(height INT) RETURNS DOUBLE
BEGIN
	RETURN height * height * 22 / 10000;
END
$$
delimiter ;

SELECT fu_1(168); -- 몸무게를 반환

-- ex2 : 직원 전체의 연봉 평균 반환
delimiter $$
CREATE OR REPLACE FUNCTION fu_2() RETURNS double
BEGIN
	DECLARE r DOUBLE;
	SELECT AVG(jikwon_pay) INTO r FROM jikwon;	-- 평균을 구해 변수 r에게 치환
	RETURN r;
END
$$
delimiter ;

SELECT fu_2();

-- ex3 : 각 직원 연봉의 10%를 반환
delimiter $$
CREATE OR REPLACE FUNCTION fu_3(NO INT) RETURNS INT
BEGIN
	DECLARE pay INT;
	SET pay = 0;
	SELECT jikwon_pay * 0.1 INTO pay FROM jikwon WHERE jikwon_no = NO;
	RETURN pay;
END
$$
delimiter ;

SELECT fu_3(9);

SELECT jikwon_no, jikwon_name, jikwon_pay, fu_3(jikwon_no) AS donate 
FROM jikwon WHERE jikwon_pay IS NOT NULL AND jikwon_jik='사원';

-- ex4 : 각 직원 부서명 반환
delimiter $$
CREATE OR REPLACE FUNCTION fu_4(NO INT) RETURNS VARCHAR(10) CHARSET utf8
BEGIN
	DECLARE bname VARCHAR(10) CHARSET UTF8;
	SELECT buser_name INTO bname FROM buser 
	WHERE buser_no=(SELECT buser_num FROM jikwon WHERE jikwon_no = NO);
	RETURN bname;
END
$$
delimiter ;

SELECT fu_4(3);

-- ex5 : 부서번호를 입력하면 부서명 반환
delimiter $$
CREATE OR REPLACE FUNCTION fu_5(bNO INT) RETURNS VARCHAR(10) CHARSET utf8
BEGIN
	DECLARE bname VARCHAR(10) CHARSET UTF8;
	SELECT buser_name INTO bname FROM buser WHERE buser_no= bNO;
	RETURN bname;
END
$$
delimiter ;

SELECT fu_5(20);

SELECT jikwon_no, jikwon_name, jikwon_pay, fu_5(buser_num) AS buser_name 
FROM jikwon WHERE jikwon_pay IS NOT NULL AND jikwon_jik='사원';

-- 사용자 정의 함수 작성
-- 문1) jikwon 테이블에 대해 부서번호가 있으면 부서명을 없으면 '임시직'을 반환하는 함수 작성

delimiter $$
CREATE OR REPLACE FUNCTION exf_1(no INT) RETURNS VARCHAR(10) CHARSET utf8
BEGIN
	DECLARE bname VARCHAR(10) CHARSET UTF8;
	SELECT buser_name INTO bname FROM buser 
	WHERE buser_no=(SELECT buser_num FROM jikwon WHERE jikwon_no = no);
	RETURN nvl(bname, '임시직');
	RETURN bname;
END
$$
delimiter ;

SELECT exf_1(5);

-- 문2) 고객번호를 입력하면 나이를 출력하는 함수 작성 

delimiter $$
CREATE OR REPLACE FUNCTION exf_2(NO INT) RETURNS INT
BEGIN
	DECLARE age INT;
	SELECT TIMESTAMPDIFF(YEAR, cast(SUBSTR(gogek_jumin,1,6) AS DATE), NOW()) INTO age FROM gogek
	WHERE gogek_no=NO;
	RETURN age;
END
$$
delimiter ;

SELECT exf_2(3);

 

dbForge Studio를 활용한 다이어그램 만들기 실습

 

 

 

 

 

 

자바 AWT, Frame, Layout

 

 

//1. AWT(Abstract Window Toolkit)

//1) AWT란?
//- GUI프로그래밍(윈도우 프로그래밍)을 위한 도구
//- Java로 구현하지 않고 OS의 컴포넌트를 그대로 사용(OS 종속적)

//2) Swing
//- AWT를 확장한 GUI프로그래밍 도구
//- AWT보다 더 많은 종류의 컴포넌트 제공
//- OS의 컴포넌트를 사용하지 않고 Java로 구현

//3) AWT의 구성
//- AWT관련 패키지는 모두 java.awt로 시작
//- AWT컴포넌트의 최상위 조상은 java.awt.Component 클래스(메뉴 관련 컴포넌트 제외)

//4) Container
//- 다른 컴포넌트를 포함할 수 있는 컴포넌트
//- 독립적인 컨테이너: 독립 사용 가능, 다른 컴포넌트나 종속적 컨테이너를 포함 가능
//- 종속적인 컨테이너: 독립 사용 불가(다른 컨테이너에 포함)
//- add()를 사용해서 추가
//- 컨테이너에 담기는 컴포넌트는 컨테이너의 설정을 따름(변경 가능)

// LayoutManager 참조 : https://m.blog.naver.com/so_yuns/222172786073
// Frame : BorderLayout이 기본
// Panel : FlowLayout이 기본

 

 

package pack7gui;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Ex43FrameLayout extends Frame{ // 컨테이너
	Panel pn1 = new Panel(); // 컨테이너(Visual Object를 담는 그릇)의 일종
	Panel pn2 = new Panel();
	Panel pn3 = new Panel();
	Panel pn4 = new Panel();
	Panel pn5 = new Panel();
	Panel pn6 = new Panel();
	TextField txtBun, txtIrum;
	Button btnGo;
	
	
	public Ex43FrameLayout() {
		// 배치 관리자로 화면 디자인
		setLayout(new GridLayout(2, 1)); // Frame의 레이아웃을 변경
		
		// 첫번째 행 디자인
		Label lbl1 = new Label("bunho:"); // 메세지 컴포넌트
		txtBun = new TextField("10", 20); // 키보드로 자료 입력 가능
		pn1.add(lbl1); // Panel에 Label 객체 담기
		pn1.add(txtBun); // Panel에 TextField 객체 담기
		pn1.setBackground(Color.YELLOW); // Panel 배경색 변경
		super.add(pn1); // Frame에 Panel을 넣음
		
		// 두번째 행 디자인
		
		super.setTitle("레이아웃 연습");
		super.setBounds(200, 200, 400, 300);
		super.setVisible(true);
		
		super.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	public static void main(String[] args) {
		new Ex43FrameLayout();
		
	}

}

 

 

 

 

 

 

'학원일기' 카테고리의 다른 글

22일  (1) 2024.07.24
20일  (2) 2024.07.24
19일  (0) 2024.07.24