本文用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;