SQL语句之排序、聚合、分组、分页查询

DQL高级查询

在查询之前,我们也先准备好一些数据

-- 创建db2数据库
CREATE DATABASE db2;
-- 使用db2数据库
USE db2;
-- 数据student数据表
CREATE TABLE student (
 id INT, -- 编号
 NAME VARCHAR(20), -- 姓名
 age INT, -- 年龄
 sex VARCHAR(5), -- 性别
 address VARCHAR(100), -- 地址
 math INT, -- 数学
 english INT -- 英语
);

-- 添加表记录
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','
杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩
',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港
',99,99),(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);

在这里插入图片描述

DQL 排序查询

– 使用order by指定字段进行排序,desc 降序 asc 升序,默认不写为升序

-- 排序查询
SELECT 字段列表 FROM 表名 ORDER BY 排序列

-- 按照english英语成绩进行排序,默认为升序排列
SELECT * FROM student ORDER BY english;
-- 按照english英语成绩进行排序,desc表示降序
SELECT * FROM student ORDER BY english DESC;
-- 按照english英语成绩进行排列,asc表示升序
SELECT * FROM student ORDER BY english ASC;

-- 先按math升序排列,如果math成绩相同,再按照english升序排列
SELECT * FROM student ORDER BY math ASC,english ASC;

下图为最后一条sql语句排序的结果集
在这里插入图片描述

DQL 聚合函数

聚合函数指在查询数据时可以将一列数据进行纵向的计算。掌握下面几个聚合函数

函数名意义语法格式
count求指定列的个数count(列名)
min求指定列的最小值min(列名)
max求指定列的最大值max(列名)
sum求指定列的和sum(列名)
avg指定列的平均值avg(列名)
-- 聚合函数查询的语法
SELECT 聚合函数(列名) FROM 表名

COUNT函数

-- 注意:如果类中有NULL值,不算个数

-- 求student表中math列有多少条记录,结果为8
SELECT COUNT(math) FROM student;
-- 求student表中english列有多少条记录,结果为7,因为有一个NULL值
SELECT COUNT(english) FROM student;

-- 查询所有列个数【比较常用】
SELECT COUNT(*) FROM student;

MIN函数

- 查询math的最小值
SELECT MIN(math) FROM student;

MAX函数

-- 查询math的最大值
SELECT MAX(math) FROM student;

SUM函数

-- 查询math的和
SELECT SUM(math) FROM student;

AVG函数

-- 查询math的平均值
SELECT AVG(math) FROM student;

DQL 分组查询

按照特定条件把数据进行分组,把每一组当做一个整体,分别对某一组数据进行计算。

-- 分组查询语法,字段列表只能是分组列、或者聚合函数
SELECT 字段列表 FROM 表名 where 分组前条件 GROUP BY 分组列名 HAVING 分组后条件

对所有数据分组查询

-- 按姓别进行分别,查询男、女的math的平均值
SELECT sex,AVG(math) FROM student GROUP BY sex;
-- 按性别进行分组,查询男、女同学的math平均分,和人数
SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex;

在这里插入图片描述
分组前筛选

-- 分组前进行筛选使用where子句
-- 对>70分的人按照性别进行分组,查询男、女同学的math平均分和人数
SELECT sex, AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex;

在这里插入图片描述

分组后筛选

-- 分组后再进行筛选,使用having子句
-- 对>70分的人按照性别进行分组,查询男、女同学的math平均分和人数,再筛选人数>2的数据
SELECT sex, AVG(math),COUNT(id) FROM student WHERE math>70 GROUP BY sex HAVING COUNT(id)>2;

-- 可以使用AS语句给聚合函数取别名,改进上面的sql语句
SELECT sex, AVG(math) AS 平均分,COUNT(id) AS 个数 FROM student WHERE math>70 GROUP BY sex HAVING 个数>2;

在这里插入图片描述

DQL 分页查询

分页查询指当要查询的数据量比较多的时候,采用一次查询固定条记录的方式。

-- 开始索引=(当前页码-1)*个数
select 字段列表	from 表名 limit 开始索引,个数
-- 查询0索引开始的3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页

在这里插入图片描述

-- 查询3索引开始的3条记录
SELECT * FROM student LIMIT 3,3; -- 第2页

在这里插入图片描述

-- 查询6索引开始的3条记录
SELECT * FROM student LIMIT 6,3; -- 第3页

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA实现多表聚合函数分页并且查询条件动态的方法如下: 1. 在Repository中定义方法,使用JPQL查询语句实现多表查询和聚合函数,并使用`Pageable`参数实现分页。同时,使用`CriteriaBuilder`和`CriteriaQuery`实现动态查询条件,例如: ``` @Repository public interface TableARepository extends JpaRepository<TableA, Long> { Page<Object[]> multiTableAggregationQuery( @Param("id") Long id, @Param("name") String name, Pageable pageable ) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class); Root<TableA> rootA = cq.from(TableA.class); Join<TableA, TableB> joinB = rootA.join("tableBs"); List<Predicate> predicates = new ArrayList<>(); if (id != null) { predicates.add(cb.equal(rootA.get("id"), id)); } if (name != null) { predicates.add(cb.like(joinB.get("name"), "%" + name + "%")); } cq.multiselect( rootA, cb.countDistinct(joinB) ); cq.groupBy(rootA); if (!predicates.isEmpty()) { cq.where(cb.and(predicates.toArray(new Predicate[0]))); } TypedQuery<Object[]> query = entityManager.createQuery(cq); query.setFirstResult(pageable.getPageNumber() * pageable.getPageSize()); query.setMaxResults(pageable.getPageSize()); return new PageImpl<>(query.getResultList(), pageable, count()); } } ``` 2. 调用定义的方法,传入分页参数和查询条件参数,例如: ``` Pageable pageable = PageRequest.of(0, 10); Page<Object[]> result = tableARepository.multiTableAggregationQuery(1L, "name", pageable); ``` 注意:使用JPQL查询语句需要注意SQL注入问题,因此需要对查询参数进行验证和过滤。同时,使用JPQL查询语句可以提高代码的可移植性,但是需要注意性能问题。如果查询结果较大,建议采用分页查询的方式,避免一次性加载过多数据导致内存溢出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值