728x90
데이터베이스 (= Schema)
데이터를 효율적으로 보관하고 꺼내볼 수 있는 곳
ANSI SQL
표준 text format
DBMS
데이터베이스를 관리하기 위한 SW
- 동시 접근 가능
ex. MySQL, Oracle, DB2
table: 데이터를 구별해 놓는곳 (= Domain: 문제영역)
방법론이 중요하다 💫
여기 화면에서 짜는 것이 아니라!
설계가 되어있는 것을 보고 입력해야한다!
SQL DataBase
//user 생성
-- 새로운 사용자 'ureca'를 생성하고, 모든 호스트('%')에서 접속할 수 있도록 설정
CREATE USER 'ureca'@'%' IDENTIFIED BY 'ureca';
-- 'ureca' 사용자에게 모든 데이터베이스 및 테이블에 대한 모든 권한을 부여하고,
-- 다른 사용자에게도 권한을 부여할 수 있도록 설정 (WITH GRANT OPTION)
GRANT ALL PRIVILEGES ON *.* TO 'ureca'@'%' WITH GRANT OPTION;
-- 권한 변경 사항을 즉시 반영
FLUSH PRIVILEGES;
create database testDB; -- 데베 만들기
show databases; -- 데베들 보여줘
create database testDB; -- 데베 만들기
drop database testDB; -- 데베 삭제
show databases; -- 데베들 보여줘
varchar vs char
varchar가 더 좋음, 공간 낭비 없음
Transaction
한번에 처리해야할 일의 단위
--테이블 생성
CREATE TABLE `ureca`.`member` (
`name` VARCHAR(45) ,
`age` INT
);
-- 테이블 구조 변경
ALTER TABLE `ureca`.`member`
ADD COLUMN `id` VARCHAR(45) NOT NULL ,
ADD COLUMN `pw` VARCHAR(45) NOT NULL ,
CHANGE COLUMN `name` `name` VARCHAR(50) NOT NULL ,
CHANGE COLUMN `age` `age` INT NOT NULL ,
//DROP COLUMN age,
ADD PRIMARY KEY (`id`);
select * from member; -- member 테이블의 모든 데이터를 조회
select * from member where age = 20; -- 나이가 20인 member만 조회
delete from member where age = 20; -- 나이가 20인 member만 삭제
start transaction; -- 트랜잭션 시작
delete from member; -- member 테이블의 모든 데이터 삭제
truncate table member; -- member 테이블의 모든 데이터 초기화
drop table member; -- member 테이블 자체를 삭제
rollback; -- 트랜잭션 취소(이전 상태로 되돌림-start transction 이전 상태로 돌아감)
commit; -- 트랜잭션 확정(변경 내용 저장)
update member
set name='전은수'
where id='b'; -- id가 b인 멤버의 이름을 전은수로 변경
update member
set age = 20; -- 모든 나이를 20으로 변경
-- 테이블 삭제
DROP TABLE `ureca`.`member` ;//구조도 삭제, rollback 불가
-- 데이터 전부 삭제
DELETE FROM `ureca`.`member`; //구조는 남김, rollback 가능
TRUNCATE TABLE `ureca`.`member` ; //구조는 남김, rollback 불가
-- 데이터 삽입
INSERT INTO member(id,pw,name,age)
VALUES
('a', 'a', '홍길동', 20),
('b', 'b', '전은수', 30),
('c', 'c', '전지현', 40);
-- 데이터 변경
update member
set name='전은수'
where id='b';
-- 데이터 삭제
delete from member
where id='a';
-- 데이터 조회
select *
from member;
JDBC
package test1;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
public class MyWorkbench {
static Connection con;
public static void main(String[] args) throws Exception { //exception처리를 안 하고 jvm에 넘기겠다
Frame f = new Frame(); // 창 생성
TextArea ta = new TextArea(); // 텍스트 출력
Panel p = new Panel(); //
TextField tf = new TextField(35); // 입력 창 생성
f.add(ta); // 창에 텍스트 출력할 수 있게 해줌
f.add(p, BorderLayout.SOUTH); // 판넬의 위치, 남쪽
p.add(tf); // 판넬에 입력 창 넣어줌
dbSet(); // MySQL 연결
tf.addActionListener(e -> { // 입력 창에 SQL문 처리
String sql = tf.getText().trim().toLowerCase(); // SQL 문 입력받기
try {
PreparedStatement stmt = con.prepareStatement(tf.getText()); // SQL 실행 준비 (작업을 준비시켜 놓고 STMT에 나타내게해주는)
StringBuilder result = new StringBuilder("\n>>> " + tf.getText() + "\n"); // 실행한 SQL도 기록
if (sql.startsWith("select")) { // 입력한 텍스트가 'select'로 시작한다면
// SELECT 문 처리
ResultSet rs = stmt.executeQuery(); // sql 전송
ResultSetMetaData metaData = rs.getMetaData(); // 입력한 텍스트의 데이터 가져오기?
int columnCount = metaData.getColumnCount(); // 데이터의 행 수 카운트
// 컬럼명 출력
for (int i = 1; i <= columnCount; i++) { // 데이터의 행을 돌면서
result.append(metaData.getColumnName(i)).append("\t");
}
result.append("\n");
// 데이터 출력
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
result.append(rs.getString(i)).append("\t");
}
result.append("\n");
}
} else if (sql.startsWith("insert")) {
// INSERT
int rowsAffected = stmt.executeUpdate();
result.append(rowsAffected).append(" row(s) insert 완료.");
} else if (sql.startsWith("update")) {
// UPDATE
int rowsAffected = stmt.executeUpdate();
result.append(rowsAffected).append(" row(s) update 완료.");
} else if (sql.startsWith("delete")) {
// DELETE
int rowsAffected = stmt.executeUpdate();
result.append(rowsAffected).append(" row(s) delete 완료.");
}
// 결과를 기존 내용과 합쳐서 출력
ta.append(result.toString() + "\n");
} catch (SQLException e1) {
ta.append("\nSQL Error: " + e1.getMessage() + "\n");
}
});
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(500, 400);
f.setVisible(true);
}
private static void dbSet() throws Exception { //exception을 호출한 쪽으로 넘기기
//드라이버 작업
//1. Driver 등록
Class.forName("com.mysql.cj.jdbc.Driver"); //드라이버 다운로드할 때 이름 기억하기
//2. Connection (connection 객체도 드라이버에서 만들어줘야 함)
con = DriverManager.getConnection("jdbc:mysql://localhost/ureca", "ureca", "ureca"); //DB주소, 유저 정보, 유저 비번
}
}
728x90
'💡 URECA > 🗒️ 스터디 노트' 카테고리의 다른 글
[URECA] Day 27 | Backend(2) (1) | 2025.03.05 |
---|---|
[URECA] Day 26 | SQL(2) (1) | 2025.03.04 |
[URECA] Day 24 | Git(2) (3) | 2025.02.27 |
[URECA] Day 23 | Git (0) | 2025.02.26 |
[URECA] Day22 | 알고리즘 | 그래프 응용(백트래킹, 위상 정렬) (0) | 2025.02.25 |