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();
}
}