가쟤의 해변일기 🐳

풀스택과정 DB - Having | ROLLUP | JDBC 본문

풀스택과정

풀스택과정 DB - Having | ROLLUP | JDBC

바닷가쟤 2025. 5. 21. 18:01

2025 05 21

  1. Having절
  2. RollUP절
💡 2025 05 21

1. Having절
2. RollUP절
3. JDBC 4단계 

 

예리한 분석을 위해서는 데이터 자체가 좋아야 하고, 남들이 생각해내지 못하는 feature를 집어낼 수 있어야 한다.

ex) 미국 레스토랑 데이터 - 성별, 식사 인원, 음식 총 비용, 흡연 여부 … → 팁 얼마 냈는지 예측

자기만의 주관, 분석이 필요하다. (의지하면 안 된다)

구획(구간)을 어떻게 설정하고 분석하는지도 중요

Having절

-- step 1.
SELECT deptno, AVG(sal) AvgSalary
FROM emp
WHERE avg(sal)>=2000
GROUP BY deptno;
-- 에러남. -> where절에서는 alias 사용 못 함, 그룹 함수 사용 못 함

-- step 2. 그룹핑 후 filter해야 함
SELECT deptno, AVG(sal) AvgSalary
FROM emp
GROUP BY deptno
HAVING avg(sal) >= 2000
ORDER BY 1;

GROUP한 후, 원하는 데이터만 display하고 싶을 때는

HAVING절을 사용해서 한 번 더 걸러줄 수 있다.

 

WHERE절은 GROUP 하기 전에 실행되는 반면에

HAVING절은 GROUP 한 후에 실행된다.

 

→ 그룹 함수는 WHERE절에서는 사용할 수 없고, HAVING절에서 사용된다 ❗

 

HAVING절은 GROUP BY절 뒤에 오는 것이 의미론적으로 더 맞다.

MySQL에서는 그룹 함수 중첩을 사용할 수 없다.

ROLLUP

그룹별 중간 합계나 총 합계를 위해서 사용한다.

확장된 GROUP BY다.

소계 사용 가능, 인수 순서를 잘 봐야 함.

JDBC

서버의 정보를 가지고 잇는 제품을 Driver라고 한다.

 

DAO 프로그램을 통해서 DB 서버에 연결하려면

사전에 반드시 이 드라이버가 프로그램 사이드 메모리에 로딩 되어져 있어야 한다.

 

프로젝트 > Build Path > Add Library > User Library > Add해서 라이브러리 이름 추가 > 다운 받은 경로 연결

  1. MySQL Driver를 해당 클래스 메모리에 로딩 ⭐⭐⭐
  2. DB 서버 접속 - 접속 성공하면 Connection 객체를 반환받고접속 성공하면 Connection 객체를 반환받고jdbc:mysql://127.0.0.1:3306/kosa?serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8
  3. 이후 작업은 Connection을 통해서 모든 작업이 이뤄진다.
  4. 이후 작업은 Connection을 통해서 모든 작업이 이뤄진다.
  5. 쿼리문을 실행 executeQuery()
    public class JDBCProcessTest1 {
    	public static void main(String[] args) {
    		// 1. 드라이버 로딩
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver"); // Driver.class 파일이 메모리에 로드된단 말
    			
    			// 여기에 코드 실행
    			System.out.println("✅ Driver loading Success...");
    			
    			// 2. 디비 서버 연결
    			String url = "jdbc:mysql://127.0.0.1:3306/kosa?serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8";	
    			
    			try {
    				Connection conn = DriverManager.getConnection(url, "root", "1234");
    				
    				// 3. PreparedStatement 생성
    				PreparedStatement ps = conn.prepareStatement("DELETE * FROM custom WHERE id=3");
    				System.out.println("PreparedStatement Creating...");
    			
    			
    			} catch (SQLException e) {
    				System.out.println("DB Connect Fail...");
    			}
    			
    		} catch (ClassNotFoundException e) {
    			System.out.println("❌ Driver loading Fail...");
    		}
    	}
    }
    
    위의 3단계로 실행된다 !+드라이버 로딩도 static으로 먼저 실행되게 함

그 다음 단계 - 주소, 아이디, 비번은 따로 빼야 함!

 

 

#1 JDBC의 실행 순서와 구성요소를 알아보자..

executeUpdate() — INSERT/DELETE/UPDATE (DML)

 

한 번 더 돌리면 Error → 이미 있으니까 ..

파일로 분리 → properties 파일

Hashtable - properties(String key - String value)

이건 막 호출하고 불러와야해서 복잡함..

→ Interface로 분리 !

 

이건 유출되면 안 되는 정보니까 Interface로 따로 분리했다.

public class CustomDAO {
	public CustomDAO() throws SQLException {
		Connection conn = DriverManager.getConnection(ServerInfo.URL, ServerInfo.USER, ServerInfo.PASS);
		System.out.println("서버 연결...");
		
		String query = "INSERT INTO custom (id, name, address) VALUES(?, ?, ?)";
		PreparedStatement ps = conn.prepareStatement(query);
		ps.setInt(1, 5);
		ps.setString(2, "엄혜경");
		ps.setString(3, "제주 애월읍");
		
		System.out.println(ps.executeUpdate() + "명 등록 성공 !!");
	}
}

그러고 DAO 클래스 만들어서 여기서 로직 작성, SQLException은 던지기!

public class JDBCProcessTest3 {

	public static void main(String[] args) {
		try {
			new CustomDAO();
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

	}
	
	static {
		try {
			Class.forName(ServerInfo.DRIVER_NAME);
			System.out.println("드라이버 로딩..");
		} catch(ClassNotFoundException e) {
			System.out.println(e.getMessage());
		}
	}

}

그러고 main에서 받아서 예외 처리해준다.

이게 완성인건 아니지만 DAO와 JDBC의 구조를 알기 위해서 이렇게 한 것 같다.

실제론 어떻게 사용하는지 내일 배우는데 궁금하다.!.!

728x90