[TIL] 구디아카데미 16일차: 샘플DB설치하기, SQL SELECT문 ORDER BY절, WHERE절, 동적쿼리

Mijin·2023년 5월 5일
0

TIL

목록 보기
15/21
post-thumbnail

오늘은 mockaroo에서 만든 DB가 아닌 실제 샘플DB를 설치하고 이를 이용하여 쿼리를 연습하였다.

✅MariaDB 명령프롬프트 이용한 DB추가

  1. 샘플DB파일 압축해제
  2. MariaDB command prompt 실행
  3. cd 명령으로 압축해제 폴더로 이동 (ex: cd c:\employees)
  4. mysql -u root -p명령으로 DB접속
  5. source employees.sql; 실행
  6. exit명령어로 종료
  7. HeidiSQL에서 설치된 DB확인

✅동적쿼리

동적쿼리는 파라미터값에 따라 달라질 수 있는 쿼리를 말한다

✅컬럼별 정렬(ORDER BY절)

	/*
		데이터를 가져오기 위한 sql
		SELECT 
        	emp_no empNo, 
            birth_date birthDate, 
            first_name firstName, 
            last_name lastName, 
            gender gender, 
            hire_date hireDate
		FROM employees
		ORDER BY emp_no ASC
		LIMIT ?, ?
		# order by를 지정하지 않고 select에 기본키(emp_no)가 있으면 기본키 오름차순으로 정렬된다 
        -> 변수 col과 ascDesc의 초기값
	*/
	String col = "emp_no";
	String ascDesc = "ASC";
	if(request.getParameter("col") != null 
			&& request.getParameter("ascDesc") != null) {
		col = request.getParameter("col");
		ascDesc = request.getParameter("ascDesc");
	}
	
	String sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate 
					FROM employees ORDER BY "+col+" "+ascDesc+" LIMIT ?, ?";
	// 컬럼과 정렬방식 파라미터에 따라 쿼리가 달라진다

✅데이터 검색(WHERE절)

성별에 따라 달라지는 출력결과

	/*
		SELECT 
			emp_no empNo,
			birth_date birthDate,
			first_name firstName,
			last_name lastName,
			gender gender,
			hire_date hireDate
		FROM employees
		LIMIT ?,?
	*/
	//쿼리생성
	String sql = null;
	PreparedStatement stmt = null;
	if(gender.equals("")) {
		sql = "select emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate from employees limit ?,?";
		stmt = conn.prepareStatement(sql); // ? 2개
		stmt.setInt(1,startRow);
		stmt.setInt(2,rowPerPage);
	} else {
		sql = "select emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate from employees where gender = ? limit ?,?";
		stmt = conn.prepareStatement(sql); // ? 3개
		stmt.setString(1, gender);
		stmt.setInt(2,startRow);
		stmt.setInt(3,rowPerPage);		
	}
    /* 
    	gender를 선택하지 않으면 전체 데이터를 보여주고 성별을 선택하면 
        where절이 추가되어 해당 성별만 보여준다
   */

💪느낀점

  • 정렬과 검색을 따로따로 구현할 때는 크게 어렵지 않았는데 모든 조건을 함께 구현하려고 하니 복잡도가 훨씬 증가한다.
    각각의 상황에 맞게 쿼리를 분기해야 해서, 모든 경우의 수를 놓치지 않도록 꼼꼼하게 코드를 작성해야겠다.
  • 무작정 코드를 줄이기 보다는 깔끔하면서도 가독성이 좋은 코드를 작성하기 위해 고민하자.
profile
개발자로 가는 길 🏃‍♀️

0개의 댓글