条件查询
- 比较运算符
=等于、 >大于、 <小于、 <=小于等于、 >=大于等于、 <>或!=不等于
- 逻辑运算符
and(&&) 多个条件同时满足
or(||) 多个条件其中一个满足
not(!) 不满足
指定范围内查询 in
语法
SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);
in里面的每个数据都会作为一次条件,只要满足条件的就会显示。
范围
BETWEEN 值1 AND 值2,表示从值1到值2范围,包括开头值又包括结尾值。
比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
模糊查询like
语法
SELECT * FROM 表名 WHERE 字段名 like '通配符字符串';
满足通配符字符串规则的数据就会显示出来。
MySQL通配符有两个:
%: 表示0个或多个字符(任意个字符)
_: 表示一个字符
为空查询 is null
查询某个字段为空(null)的数据,不是使用=null(null和任何值都不相等),而是使用is null来进行判断。
(二)查询结果排序
通过ORDER BY子句,可以将查询出的结果进行排序,排序只影响显示结果,不会影响数据库中数据的顺序。
语法
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC];
ASC: 升序,默认是升序
DESC: 降序
1.单列排序
单列排序就是使用一个字段排序。
2.组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。 上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序
语法
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC];
(三)单行函数
单行函数是指对于每一行数据进行计算后得到一行输出结果。SQL单行函数根据数据类型分为字符函数、数字函数、日期函数、转换函数等。
1.字符串函数
concat(s1,s2...sn)
字符串 s1,s2 等多个字符串合并为一个字符串
2.length(str)
返回字符串str的长度
3.replace(s,s1,s2)
将字符串 s2 替代字符串 s 中的字符串 s1
4.substr(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串 从1开始
2.流程控制函数
1.ifnull(expr1,expr2)
expr1不为null时返回expr1。expr1为null时返回expr2。
用此函数解决前面null运算结果为null的问题
解决方式
因为english有null值,所以用ifnull函数处理english
其他函数
1.user()
查看数据库当前用户
(四)聚合函数
聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。
聚合函数会忽略空值。
五个聚合函数:
count: 统计指定列记录数,记录为NULL的不统计
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值
min: 计算指定列的最小值
avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为0
(五)分组
分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组。
语法
SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
1、分组查询
说明
以上的操作是将分组字段结果中相同内容作为一组,并且返回每组的第一条数据。这样的操作显然没有什么意义。而且在有些数据库中(例如oracle)中,这样的语句是错误的!
分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
聚合函数是在分组后运行,统计每组的数据
注意事项
当我们使用某个字段分组,在查询的时候最好将这个字段查询出来,否则看不到数据属于哪组的。
2、分组时的条件过滤
一个SQL语句中不应该出现两个where子句!
3、where和having的对比
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having语句中可以使用聚合函数,where后面不可以使用聚合函数
(六)limit
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数。
语法
SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];
注意:limit子句要放在SQL语句的最后
LIMIT语法格式
LIMIT offset,length;或者limit length;
offset是指偏移量,可以认为是跳过的记录数量,默认为0,表示从哪开始
length是指需要显示的总记录数,表示显示几条
例如:只展示第2-6条记录
LIMIT的使用场景:分页。比如我们登录京东、淘宝,返回的商品信息可能有几万条,不是一次全部显示出来,是一页显示固定的条数。 假设我们以每页显示5条记录的方式来分页。
SQL语句如下
-- 每页显示5条
-- 第一页: LIMIT 0,5; 跳过0条,显示5条
-- 第二页: LIMIT 5,5; 跳过5条,显示5条
-- 第三页: LIMIT 10,5; 跳过10条,显示5条
注意
- 如果第一个参数是0可以简写:
SELECT * FROM student3 LIMIT 0,5;
SELECT * FROM student3 LIMIT 5;
- LIMIT 10,5; -- 如果不够5条,则有多少显示多少。
(七)select语句总结
1、书写顺序
SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 字段 HAVING 条件 ORDER BY 字段 LIMIT offset,length;
其中,SELECT字段,FROM表名为 必写,其余均可根据情况而定。
2、执行顺序
1、from表名
2、where条件
3、group by 字段
4、having 条件
5、select 字段
6、order by 字段
7、limit
-------------------------------------------------------------------------------------------------------------
作业
1、准备数据:
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,'张小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李进',67,53,95);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,92);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);
(1)查询姓名为李一的学生成绩
(2)查询英语成绩大于90分的同学
(3)查询总分大于200分的所有同学
(4)查询英语分数在 80-90之间的同学。
(5)查询数学分数为89,90,91的同学。
(6)查询所有姓李的学生英语成绩。
(7)查询数学分>80并且语文分>80的同学。
(8)查询英语>80或者总分>200的同学
(9)对数学成绩排序后输出。
(10)对总分排序后输出,然后再按从高到低的顺序输出
(11)对姓李的学生成绩排序输出
(12)统计一个班级共有多少学生?
(13)统计英语成绩大于80的学生有多少个?
(14)统计总分大于220的人数有多少?
(15)统计一个班级数学总成绩?
(16)统计一个班级语文、英语、数学各科的总成绩
(17)统计一个班级语文、英语、数学的成绩总和
(18)统计一个班级语文成绩平均分
(19)求班级数学最高分
(20)求一个班级数学平均分?
(21)求一个班级总分平均分?
2、演示所有课上所有单行函数
3、create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'电视',900);
insert into orders(id,product,price) values(2,'洗衣机',100);
insert into orders(id,product,price) values(3,'冰箱',1000);
insert into orders(id,product,price) values(4,'洗衣机',100);
insert into orders(id,product,price) values(5,'电视',900);
insert into orders(id,product,price) values(6,'笔记本电脑',1200);
insert into orders(id,product,price) values(7,'手电筒',50);
insert into orders(id,product,price) values(8,'手电筒',50);
- 对订单表中商品归类后,显示每一类商品的总价。
- 查询购买了几类商品,并且每类总价大于1000的商品