sql和java查询数据

时间:2018-03-17 09:11:06

标签: java sql jdbc

我有两张桌子,一张包含大学名称和大学ID,而另一张包含不同学院的学生一年级入学。

我想要的是打印不同学院一年入学的学生人数和每年注册的学生总数。

目前我正在做的是从第一张桌子获取大学ID,然后运行一年的for循环并计算学生人数。

每次创建新的PreparedStatement时,内部for循环都会发生,我觉得这样做有点贵。

是否有更好的方法来运行SQL查询以获取所需的数据。

我目前使用的代码位于

之下
PreparedStatement pstmt = conn.prepareStatement("select id from college where type_flag = '1' order by full_form");

ResultSet rs = pstmt.executeQuery();

while (rs.next()) {


    for (int i = 1964; i < 2019; i++) {
        String pstmt11 = "select count(*) from students where id=" + rs.getInt("id") + "AND year = " + i;
        //System.out.println(pstmt11);
        PreparedStatement pstmt1 = conn.prepareStatement(pstmt11);
        //pstmt1.setInt(1, rs.getInt("case_type"));
        ResultSet rs1 = pstmt1.executeQuery();

        while (rs1.next()) {
            //Here I am getting the count

        }

同样地,为了获得年度明智,我也在做同样的事情。

1 个答案:

答案 0 :(得分:2)

您对PreparedStatement的使用并未真正使用预先准备好的声明。您只应使用值的占位符准备一次,然后使用setInt()传递值。

PreparedStatement pstmt = conn.prepareStatement("select id from college where type_flag = '1' order by full_form");
PreparedStatement pstmt1 = conn.prepareStatement("select count(*) from students where id=? and year=?");

ResultSet rs = pstmt.executeQuery();

while (rs.next()) {

    for (int i = 1964; i < 2019; i++) {
        int id = rs.getInt("id");
        pstmt1.setInt(1, id);
        pstmt2.setInt(2, i);
        ResultSet rs1 = pstmt1.executeQuery();
        while (rs1.next()) {
            //Here I am getting the count
        }
    }
}

您还应该为第一个语句使用占位符。

但是不需要循环或两个语句。您想要的只需一个查询即可完成:

select id, year, count(*)
from students
where id in (select id 
             from college
             where type_flag = '1')
and year between 1964 and 2018
group by id, year;

我很惊讶college.id等于id表中的students列。从命名角度来看,我原本期望students.college_id列,而students.idstudents表格的主键,用于识别学生,而非学院。