08章 分组查询子查询原生SQL

Posted Fighting`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了08章 分组查询子查询原生SQL相关的知识,希望对你有一定的参考价值。

一、分组查询

使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计

1.1 聚合函数:常被用来实现数据统计功能

① count() 统计记录条数

② sum() 求和

③ min() 求最小值

④ max() 求最大值

⑤ avg() 求平均值

例子:查询所有员工的平均工号

注:select语句查询出来只有一个值,因此不能用list(),list投影出来的是一个集合。在这里提供uniqueResult()方法

     /*
     * 分组查询  所有员工的平均工号   
     */
    
    @Test
    public void avgTest(){
        Query query=session.createQuery("select avg(empId) from Emp");
        Object count=query.uniqueResult();
        System.out.println(count);
    }

输出结果:

 


 

二、子查询

子查询语句应用于HQL查询语句的where子句中。

子查询关键字:

all:子查询语句返回的所有记录

any:子查询语句返回的任意一条记录

some:和“any”意思相同

in:与“=any”意思相同

exists:子查询语句至少返回一条记录


 

例子:查询所有员工工资都小于2000的部门

     /*
     * 子查询   查询所有员工工资都小于2000的部门
     */
    
    @Test
    public void childTest(){
        List<Dept> list=session.createQuery("from Dept d where 2000>all(select e.sal from d.emps e) and d.emps.size>0").list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
    }

输出结果:

 


 

 

三、原生SQL查询和命名查询

注:对于原生SQL查询方式,使用Session的createSQLQuery()方法来创建SQLQuery对象,createSQLQuery()方法的参数是底层数据库的sql语句,SQLQuery接口继承了Query接口。该语句不能返回强类型的Dept对象,需使用addEntity()封装到一个Dept实体类

例子:查询部门名称

     /*
     * 原生sql
     */
    
    @Test
    public void sqlTest(){
        SQLQuery query=session.createSQLQuery("select * from dept1").addEntity(Dept.class);
        List<Dept> list=query.list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
    }
    

输出结果:


 

命名查询:在映射文件中定义字符串形式的查询语句

将SQL语句配置到一个文件

如图所示:

以上是关于08章 分组查询子查询原生SQL的主要内容,如果未能解决你的问题,请参考以下文章

sql子查询可以再分组吗

MySQL 3 数据处理函数汇总数据分组数据子查询

SQL之复杂查询与视图

SQL之复杂查询与视图

分组的SQL子查询问题,平均

SQL 示例查询解决方案(按技术分组和子查询技术)