[TIL] 구디아카데미 20일차: HashMap, SQL GROUP BY절

Mijin·2023년 5월 5일
0

TIL

목록 보기
19/21
post-thumbnail

✅외래키(Foreign Key)

다른 테이블의 기본키를 참조하는 키이다.

✅HashMap

  • VO타입(클래스) 대신 HashMap<키 타입, 값 타입>에 조회한 데이터를 저장한다
  • HashMap은 테이블에 없는 컬럼(count등)을 출력할 때 사용한다
	// VO타입대신 HashMap타입을 사용
	
	HashMap<String, Object> map = null; 
	// map이라는 이름을 가진 키(String), 값(Object)의 HashMap타입 변수 -> Object에는 모든 타입이 들어올 수 있다
	// rs.next()가 '참'일때만 map을 만들면 되기 때문에 초기값은 null
	if(rs.next()){
		// System.out.println(rs.getString("localName"));
		// System.out.println(rs.getString("country"));
		// System.out.println(rs.getString("worker"));
		map = new HashMap<String, Object> ();
		map.put("localName", rs.getString("localName")); // map.put(키이름, 값)
		map.put("country", rs.getString("country"));
		map.put("worker", rs.getString("worker"));
	} // 한 행의 HashMap을 만들고 rs의 값을 넣는다
	System.out.println((String)map.get("localName")); // rs.getString("localName")(Object타입)이 String으로 형변환되어 출력된다 
	
	PreparedStatement stmt2 = null;
	ResultSet rs2 = null;
    // 테이블에 없는 country, worker컬럼 출력
	String sql2 = "SELECT local_name localName, '대한민국' country, 'admin' worker FROM local";
	stmt2 = conn.prepareStatement(sql2);
	System.out.println(stmt2 + " <--localListByMap stmt2");
	rs2 = stmt2.executeQuery();
	
	ArrayList<HashMap<String, Object>> list2 = new ArrayList<HashMap<String, Object>>();// HashMap<String,Object>타입의 ArrayList를 만든다
	while(rs2.next()){
		HashMap<String, Object> m = new HashMap<String, Object>();
		m.put("localName", rs2.getString("localName")); // map.put(키이름, 값)
		m.put("country", rs2.getString("country"));
		m.put("worker", rs2.getString("worker"));
		list2.add(m);
	} // HashMap타입의 m에 rs의 값을 저장하고 만들어진 행을 list2에 추가한다

✅GROUP BY절

GROUP BY절이 있어야 집계함수를 이용할 수 있다
(이전에 GROUP BY절 없이 사용한 COUNT는 GROUP BY NULL이 생략된 형태)

  • GROUP BY : 컬럼별 집계후 집계함수(COUNT, SUM, AVG, MAX, MIN)를 사용하여 집계결과 출력
  • WITH ROLLUP : GROUP BY의 확장절로 group by되지 않은 전체 집계함수의 결과도 같이 출력
  • IFNULL(x, y) 함수 : x의 값이 null이면 y값으로 출력, null이 아니면 x값 출력
  • UNION ALL 집합연산자 : 두 select쿼리의 결과를 결합
    출처: https://cafe.naver.com/jjdev
-- GROUP BY절 집계함수
SELECT local_name, AVG(board_no) FROM board GROUP BY local_name;

SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name;

-- WITH ROLLUP
SELECT IFNULL(local_name, '전체'), COUNT(local_name)
FROM board
GROUP BY local_name WITH ROLLUP;

-- UNITON ALL
SELECT local_name, COUNT(local_name) FROM board GROUP BY local_name
UNION ALL
SELECT '전체', COUNT(local_name) FROM board;

💪느낀점

과제할 때 필요한 SQL을 조금씩 배워서 적용하고 있다.
SQL을 잘 사용하면 훨씬 간단하게 원하는 내용을 출력할 수 있기 때문에 앞으로 과제나 프로젝트를 위해 충분한 연습을 해야겠다.

profile
개발자로 가는 길 🏃‍♀️

0개의 댓글