数据库操作(二)查询(select)进阶

本文用navicat做实验,使用的数据表有15行8列,包含ID、姓名、地址、密码、邮箱、数学、英语、语文8个字段。
使用的完整数据库表如下,关于创建数据库的相关操作在我的上一篇博文中:
本文所使用完整数据表


一、去重(distinct)

在这里插入图片描述


二、排序(order by)

# 以下三句都是按照英语成绩来排序
# select * from users ORDER BY 7;
# select id,name,mail,english from users ORDER BY english;
select id,name,mail,english from users ORDER BY 4;

在这里插入图片描述

# 如果order by后面使用数字,但是该数字的值超出了数据库的列数则产生报错。
#(该原理常用在sql注入中,用来判断数据库列数)
select * from users ORDER BY 9;

在这里插入图片描述


三、联合查询(union)

# 在sql注入中我们时常会使用这样的句式“union select 1,2,3”,用来找显示位。
#(前提是已经通过order by 知道列数)
select id,name,password from users union select 1,2,3;

在这里插入图片描述

# union正常的作用是将两个查询语句合并在一起,可以是同一个表的,也可以是不同表的数据、
# select id,name,password from users union select Math,english,chinese from users;
# 下面的students表和users表为同一数据库中的表
select * from users union select * from students;

在这里插入图片描述


四、指定范围(where)

# where操作符可与 <,>,=,!=,>=,<=,and,or,not 这些运算符结合使用
# 筛选出数学成绩大于等于80分,并且英语成绩小于50分的同学
select * from users where math>=80 and english<50;

在这里插入图片描述


五、模糊查询(like)

# LIKE(模糊查询)子句通常用在搜索(WHERE)里面。
# %(通配符)表示任何字符出现任意次数,_表示任何字符出现一次(_只能带一个)
select * from users where mail like '%@189.com';

在这里插入图片描述


六、分组(group by)

group by语法对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。

查询每个地区的分数总和:

select address,sum(math) from users group by address;

在这里插入图片描述

在第一次使用group by语句时我也遇到了好多报错,像是:

select address,math from users group by address
> 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.users.math' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

出现这种错误的原因是,group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。
比如例子中group by后面的是address,既使用地址作为分组依据,但是我同时想看到分数的内容就需要把分数放在聚合函数里,如sum(math)。

# 常用聚合函数
sum()  max()  min()  avg()  count()
first()  last()  # 仅Access数据库支持

筛选(having)

having子句在聚合后对组记录进行筛选

使用count对每个地区的

-- 使用count()对所有地区的人员进行分类并计数
select address,count(chinese) num from users group by address;
-- 加上having筛选出总人数大于2的地区
select address,count(chinese) num from users group by address having num>2;

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zibery/article/details/127202089