TIL. MySQL

hyuko·2023년 1월 30일
0

산대특 국비과정

목록 보기
4/9

앞서 우리는

insert, delete, update 에대해 배웠다.

하지만 우리가 저장을 하고 수정을 하는 행위 이 외에 가장 중요한 것은
어떤 데이터를 어떻게 찾아오고 선택할 것이냐이다. 이 기능을 해주는 것이 sql에서
select 이다. 아래에서 기본적인 형태부터 보자


select * from table;
  • 기본 형태는 위와 같이 select * from table;

    해석하자면 선택하겠다. 어디서? table에서 하겠다.
    select 선택한다 * = 전체를 from 어디에서 table 명에서

그렇다면 table에서 전체를 선택하는 것은 알겠다!
우리가 원하는 것은 전체가 아니다. 원하는 정보를 때에 맞춰서 이것 저것
바꿔서 들고 오고 싶을 것이다.

java 에서는 조건을 주기 위해서 if 문을 쓴다.
sql 에서는 table 뒤에 where 조건절을 붙여 사용한다.


select * from table where id = '1';

여기서 where 뒤에는 조건이 온다. id가 1인 것 즉 ! 해석을 해보자면
찾는다 테이블에서 그런데 어디에서 찾느냐 id가 1인 것에서 찾겠다.
라고 해석이 가능하다.

그 후에 select 뒤의 값들을 전체로 두지 않고 우리가 원하는 값만 얻고싶으면
직접 명시를 해주게 되면 그 것만 받아올 수 있다.


Select 문의 활용

  • 앞서 우리가 select 는 선택 조회 등의 기능을 담고 있다고 했다.
  • 그리고 select 는 조건이 붙는다고 하였다 이 조건을 활용하는 방법에
    left outer join 이 있다.

select
	*
from
	user_mst um
        left outer join role_dtl rd on(rd.user_id = um.user_id)
        left outer join role_mst rm on(rm.role_id = rd.role_id)
    

해석을 하자면 그렇다. 왼쪽의 바깥에서 붙이겠다. 어디 왼쪽이냐?
즉 left outer join 의 왼쪽인 user_mst 에서 붙이겠다
role_dtl 을 붙이는데 조건은 이러하다 role_dtl의 user_id와
user_mst 의 user_id의 값이 같은 것 들끼리 붙이겠다.
밑의 조건도 그러한 개념으로 이해한다!


Join

  • inner join 은 교집합의 개념이다.
    : 모두 가지고 있는 애들을 조회한다.

두개의 비교하는 테이블에 비교하는 컬럼의 값이
두 곳 모두 들고 있어야 가능하다.

  • Outer join은 합집합의 개념이다

    • LEFT OUTER JOIN은 a 와 b라는 테이블이 있을 때
      a가 기준 테이블이고 b테이블이 붙여지는 테이블인 것이고
      이때 a의 정보는 전부 가지고오면서 b와 a의 공통적인
      부분을 a에 붙이겠다는 의미이다.

    • 이때 a에는 있지만 공통된 부분의 b에 a와 같은 값이
      없을 경우 null을 넣어서 반환된다.

    • a에서 b를 뺀 유일한 a값은 left outer join 후에
      where 조건절에서 b의 키값이 null이면 기준으로 잡아주면 된다.

  • Self join
    : 자기 자신의 테이블을 다시 더해주는 느낌 서브쿼리와 같이 쓰는편이다.


java 에서의 sql 예시

public class UserInsert {
	
	public int saveUser(User user) {
		int successCount = 0;
		DBConnectionMgr pool = DBConnectionMgr.getInstance();
		String sql = null;
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		
		try {
			connection = pool.getConnection();
			
			sql = "insert into user_mst\n"
					+ "values (0, ?, ?, ?, ?)";
			
			preparedStatement = connection.prepareStatement(sql);
			preparedStatement.setString(1, user.getUsername());
			preparedStatement.setString(2, user.getPassword());
			preparedStatement.setString(3, user.getName());
			preparedStatement.setString(4, user.getEmail());
			
			successCount = preparedStatement.executeUpdate(); // insert, update, delete 명령 실행 적용된 행의 수가 리턴이된다.
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return successCount;
	}
	
	public static void main(String[] args) {
		
		UserInsert userInsert = new UserInsert();
		
		User user = User.builder()
				.username("ababc")
				.password("1234")
				.name("ababc")
				.email("ababc@gmail.com")
				.build();
		
		int successCount = userInsert.saveUser(user);
		System.out.println("쿼리 실행 성공: " + successCount + "건");
		
		
	}

}


트랜잭션

데이터베이스의 상태를 변환시키는 하나의 논리적 기능을
수행하기 위한 작업 단위 또는 한꺼번에 수행되어야할 일련의
연산을 의미한다.

트랜잭션의 특징(ACID)

  1. Atomicity(원자성)
    • 트랜잭션이 데이터베이스에 모두 반영이 되던지 아예 반영되지 않아야 한다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하고 모두 완벽히 수행하지 않고 하나라도 오류가 발생한다면 트랜잭션은 모두 취소되어야한다.
  2. Consistency(일관성)
    • 트랜잭션의 작업처리 결과가 항상 일관성 있어야한다.
    • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 완료 후 상태가 같다.
  3. Isolation(독립성)
    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이더라도 다른 트랜잭션의 연산에 끼어들수 없다.
    • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
  4. Durability(지속성)
    • 트랜잭션이 성공적으로 완료되면 결과는 영구적으로 반영되어야한다.


트랜잭션의 Commit 과 Rollback

Commit
커밋 연산은 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때 하나의 트랜잭션이
끝났음을 알려주기 위해 사용하는 연산이다.

Rollback
하나의 트랜잭션처리가 비정상적으로 종료되어
데이터베이스의 일관성을 깨뜨렸을 때
일부 정상적으로 처리되었더라도 원자성을 구현하기 위해
모든 연산을 취소하는 연산이다.



트랜잭션의 상태


profile
백엔드 개발자 준비중

0개의 댓글