欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL数据库(三):常用的SQL语句(下)

程序员文章站 2022-05-10 08:05:03
...

1、分组与分组之后的筛选

MySQL数据库(三):常用的SQL语句(下)
在数据库中,通过 group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组。
语法:select count(*) from 表名 group by 字段
将男女分组显示人数:select gender as “性别”,count(*) from student group by gender;
可通过group_concat(…)查看每组的详细信息
MySQL数据库(三):常用的SQL语句(下)
例如显示分组之后的详细姓名
select gender as “性别”,count(*),group_concat(tname) from 表名 group by 字段名;
想要知道分组后总人数是多少除了自己算之外还有一个可选参数with rollup
,直接加在语句的最后面就可以显示例如
select gender as “性别”,count(*),group_concat(tname) from 表名 group by 字段名 with rollup
MySQL数据库(三):常用的SQL语句(下)
在男女分类的基础之上查询姓名和年龄,以冒号拼接,类似于python当中的字符串拼接
MySQL数据库(三):常用的SQL语句(下)
MySQL数据库(三):常用的SQL语句(下)
想要显示分组后总人数大于2的就不能直接在后面写where(会报错)要通过having去写筛选条件,比如
MySQL数据库(三):常用的SQL语句(下)
查询男生女生平均年龄超过18岁的性别,以及姓名
select gender,avg(age),group_concat(name) from teacher group by gender having avg(age)>18;

2、排序

order by 字段 默认升序;
order by asc 字段 指定升序;
order by desc 字段 指定降序;
1.查询年龄在18到26之间的男同学,按照年龄从小到大排序
select * from student where (age between 18 and 26) and gender = '男' order by age;
2.查询年龄在18到20岁之间的女同学,id从高到低排序
select * from student where (age between 18 and 20) and gender = '女' order by desc id;
3.查询年龄在18-23岁之间的女性,年龄从高到低降序,当年龄相同时,按照身高从低到高升序。
select gender,name,hight,age from student where (age between 18 and 20) ang gender='女' order by age desc,hight asc

3、限制

limit start,count
start 为偏移量,默认起始0,count 为条数
limit 不能写数学公式,只能写在末尾
例如
显示前两条数据:selct * from student student limit 2;
显示4-6条的数据:select * from student limit 4,3;
制作分页

select * from student limit 03;
select * from student limit 33-- 不能用数学公式来显示这种规律,写公式会报错的

4、表连接

4.1内链接

select * from 表1 inner join 表2 on 表1.列 = 表2.列;
如果不加后面的on的条件就相当于是把所有的记录都拼接上,显示为一张表
1.显示学生的所有信息,但只显示班级名称
select s.\*,c.name from student s inner join classes c on s.cls_id=c.id;
2.查询有能够对应班级的学生以及班级信息,按照班级进行排序
select \* from student as s inner join class c on s.cls_id =c.id order by s.cls_id;
3.当同一个班级时,按照学生的id进行从小到大排序
select \* from student as s inner join class c on s.cls_id =c.id order by s.cls_id ASC,sid ASC;

4.2外链接

4.2.1左连接

查询的结果为两个表匹配到的数据,左表持有的数据,对于右表中不存的数据使用null填充,左表完全显示,左右连接必须要有on筛选条件,和内链接不一样
select * from 表1 left join 表2 on 表1.列 = 表2.列;
students表左连接classes表 并查看班级为null的数据
select \* from student left s join class c on s.cls_id=c.id having c.id is null;
左连接 并且 查询 s.is_del=1 并且 s.name=“amy” 的数据
select \* from student left s join class c on s.cls_id=c.id having s.is_del=1and s.name='amy';

4.2.2右链接

查询结果为两个表匹配到的数据,右表持有的数据,对于左表中不存在的数据使用null填充。
select * from 表1 right join 表2 on 表1.列 = 表2.列;

5、子查询

查询最高身高的男生
1.如果数据少的话一眼看出来就可以写
select \* from student where hight = 1.78;
2.数据多的话这样的逻辑会出错,因为两者之间的数据并没有什么关联,所以要采用子查询关联起来
select name max(hight) from student where gender=1;
3.用子查询显示最高的男生身高和姓名
select name hight from student s where s.hight=(select max(hight) from student where gender=1);
4.查看高于平均身高的学生信息
select * from studet s where s.hight>(select avg(hight) from student);
5.查看最大年龄的女性id
select * from student where gender=1 and age=(select max(age) from student)(有问题,最大年龄和gender分开显示如果最大年龄是男的,而gender却要求女的,就不行)
select * from student where age=(select max(age) from student where gender=2)(找到了最大年龄,会根据最大年龄来显示数据,不论男女,所以还是不符合题意)
select * from student where gender=2 and age=(select max(age) from student where gender=2)(这样就可以查询到了)