java - sql和java查询数据

标签 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

        }

类似地,为了获得年份明智的计数,我也在做同样的事情。

最佳答案

您对 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 等于 students 表中的 id 列。从命名的角度来看,我期望有一个 students.college_id 列,并且 students.idstudents 表中标识学生的主键,而不是学院。

关于java - sql和java查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334323/

相关文章:

java - 如何从 Sharepoint 服务器获取网站集对象

sql - ROW_NUMBER() 与 DISTINCT

mysql - 在mysql中连接两个表时使用一个表的限制

java - JDBC 连接无法从 apache Spark 连接 Teradata

java - 在远程sql服务器中插入记录

java - 内存峰值尝试加载大量对象并流式传输到 csv

java - 使用 Spring Data 预填充数据

java - 将时区转换为 3 个字符 ZoneId

sql - 根据子查询中的值更新查询

mysql - DBeaver 错误解决 Maven 依赖项