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