侧边栏壁纸
  • 累计撰写 121 篇文章
  • 累计创建 25 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

MySQL高级查询

梁来福
2022-03-09 / 0 评论 / 0 点赞 / 0 阅读 / 6348 字
温馨提示:
本文最后更新于 2024-05-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

排序查询语法

语法

select * from 表名 order by 列1 asc|desc [, 列2 asc|desc,...]

语法说明

image.png

示例

1、查询未删除的男生,按学号降序

select * from students where is_del = 0 and gender = "男" order by id desc;

2、查询所有信息,先按照年龄从大到小排序,当年龄相同时,按照身高从高到低排序

select * from students order by age desc, height desc;

分页查询

介绍

数据特别多,一页显示不完,一页一页的进行显示,就是分页查询

语法

select * from 表名 limlit start,count

说明

  • limit是分页查询关键字
  • start表示开始行索引,默认是0
  • count表示查询条数

1、查询前3行的男生信息

limit后第一个参数是开始行索引,可以不指定默认为0,第二个参数是查询条数

select * from students where gender="男" limit 0,3;

select * from students where gender="男" limit 3;

2、查询学生表,获取第n页数据的sql语句

select * from students limit (n-1) * m, m;

聚合函数

介绍

聚合函数又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by)来使用,用于统计和计算分组数据

常用的聚合函数

  • 1、count(col):表示求指定列的总行数
  • 2、max(col):表示求指定列的最大值
  • 3、min(col):表示求指定列的最小值
  • 4、sum(col):表示求指定列的和
  • 5、avg(col):表示求指定列的平均值

求总行数

1、查询学生的个数

select count(*) from students;

注意:聚合函数不会对空值进行统计

2、查询男生编号最大值

select max(id) from students where gender="男";

3、查询男生编号最小值

select min(id) from students where gender="男";

4、查询男生总身高

select sum(height) from students where gender="男";

5、查询平均年龄

5.1 聚合函数不统计null值,统计有误

select avg(age) from students;

5.2 包含身高是null的(如果是空值,按照“0“进行统计)

select avg(ifnull(age, 0)) from students;

特点

聚合函数默认忽略字段为null的记录,要想列值为null的记录也参与计算,必须使用ifnull函数对null值做替换

分组查询

介绍

分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组

语法

GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP]

参数说明

  • 列名:指按照指定字段的值进行分组
  • HAVING 条件表达式:用来过滤分组后的数据
  • WITH ROLLUP:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果

group by的使用

group by可用于单个字段分组,也可用于多个字段分组

示例

查询性别的种类

select gender from students group by gender;

注意:如果指定了分组字段,那么查询的时候只能使用指定分组字段

select name, gender from students group by name ,gender;

group by + group_concat()的使用

group_concat(字段名):统计每个分组指定字段的信息集合,每个信息之间使用逗号进行分隔

示例

根据gender字段进行分组,查询每个分组的姓名信息

select gender, group_concat(name) from students group by gender;

统计不同性别的平均年龄

select gender,avg(age) from students group by gender;

统计不同性别的人的个数

select gender,count(*) from students group by gender;

根据gender字段进行分组,统计分组条数大于4的

select gender,count() from students group by gender having count() > 4;

group by + with rollup的使用

with rollup的作用是:在最后记录后面新增一行,显示select查询时聚合函数的统计和计算结果

示例

根据gender字段进行分组,汇总总人数

select gender,count(*) from students group by gender with rollup;

根据gender字段进行分组,汇总所有人的年龄

select gender, group_concat(age) from students group by gender with rollup;

连接查询

介绍

连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成

分类

  • 1、内连接查询
  • 2、左连接查询
  • 3、右连接查询
  • 4、自连接查询

准备工作

1、准备班级表,插入数据

create table classes(id int unsigned not null primary key auto_increment, name varchar(20) not null);

insert into classes(name) values("python"), ("go");

2、学生表添加班级字段c_id(班级id)

alter table students add c_id int unsigned;

3、分配班级(不全分配,留一些空值)

update students set c_id = 2 where id in(1, 3, 5, 6);

update students set c_id = 1 where id in(2, 8);

内连接查询

查询两个表中符合条件的共有记录

语法

select 字段 from 表1 inner join 表2 on 表1,字段1 = 表2,字段2

说明

  • inner join 就是内连接查询关键字
  • on就是连接查询条件

示例

使用内连接查询学生表和班级表

select s.name, c.name from students s inner join classes c on s.c_id = c.id;

左连接查询

以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用null值填充

语法

select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2

说明

  • left join 就是左连接查询关键字
  • on就是连接查询条件
  • 表1是左表
  • 表2是右表

示例

使用左连接查询学生表和班级表

select * from students s left join classes c on s.c_id = c.id;

右连接查询

以右表为主根据条件查询左表数据,如果根据条件查询左表数据不存在使用null值填充

语法

select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2

  • right join 就是左连接查询关键字
  • on就是连接查询条件
  • 表1是左表
  • 表2是右表

示例

使用右连接查询学生表和班级表

select * from students s right join classes c on s.c_id = c.id;

自连接

左表和右表是同一张表,根据连接查询条件查询两个表中的数据

示例

select * from areas c inner join areas p on c.pid = p.id;

子查询

在一个select语句中,嵌入了另外一个select语句,那么被嵌入的select语句称之为子查询语句,外部那个select语句则成为主查询

主查询和子查询关系

  • 子查询是嵌入到主查询中
  • 子查询是辅助主查询的,要么充当条件,要么充当数据源
  • 子查询是可以独立存在的语句,是一条完整的select语句

示例

查询大于平均年龄的

select * from students where age > (select avg(age) from students);

查询有班级的

select * from classes where id in (select c_id from students where c_id is not null);

查找年龄最大,身高最高的,班级id是2的

select * from students where age = (select max(age) from students) and height = (select max(height) from students) and c_id = 2;

简写

select * from students where (age, height, c_id) = (select max(age), max(height), 2 from students);

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论