##sql语句中的表达式
在做查找,修改,删除操作时往往需要where条件,在条件语句中需要有大于,小于,and,or等运算符,带有运算符的sql语句称为表达式。
表达式分为算法表达式和逻辑表达式。具体如下:
注:in后面的元素不能超过1000个。当元素太多时in的效率会很低,可以使用exist语句替代。
一,like的详细使用
like是模糊查询的关键词。使用情况有如下三种:
--必须以张三开头
select * from person where name like '张三%';
--必须以张三结尾
select * from person where name like '%张三';
--必须包含张三,且张与三紧挨着
select * from person where name like '%张三%';
--必须包含张三,且张在三的前面
select * from person where name like '%张%三%';
--必须以张三开头,且只能包含三个字
select * from person where name like '张三_';
##排序
排序的关键词是order by。使用示例如下:
select * from person order by age
得到结果样式如下:
此时我们看出,以age排序后,age依次增大。
默认的排序是升序。降叙排列使用关键词desc,如下:
select * from person order by age desc
结果样式如下:
注:升序排序也可以加关键词asc,是ascending的缩写,但关键词asc常常省略不写。降叙desc是Descending单词的缩写。
注:排序可以同时指定两个关键词,如下:
select * from person order by age desc,name asc
说明:
两个关键词以第一个为准,第一个字段相同时则按第二个排序。
不同字段需要分别指定升序还是降序。
##分页
分页使用关键词limit。示例如下:
select * from person limit 1,2
结果如下:
说明:
1的意思是从1开始,但不包括1。2的意思是取两条。所以此时取出的是第2和第3条数据。
如果limit2,3则取出的是第3,第4和第5条。
第一个数可以省略。limit 2 表示从0开始,取出两条,即第1和第2条。
注:分页与排序同时使用时,必须先排序,后分页,如下:
select * from person order by age limit 1,2
##聚合函数
sql语句中提供了一些聚合函数,如下:sum()求和,count()统计数量,max()求最大值,avg()求平均值.具体使用如下:
1,sum()求和
--一般使用
select sum(age) from person ;
--添加where条件
select sum(age) from person WHERE id > 2;
注:sum的意思是求和,即通过select age from person语句得到的所有age相加之和。sum方法和可以这么使用:
select sum(1) from person
注:这个意思是使用select 1 from person语句获取的所有数据相加,此时person有4条数据,sum(1)就是4,这种方式可以统计数量。
2,count()统计
--
select count(*) from person
--
select count(1) from person
--
select count('a') from person
--
select count(age) from person
--使用where条件
select count(*) from person where id >2
注:count的意思是统计数据,即是通过select * from person得到的数据的个数。所以count的小括号内可以放任意值。
注:统计数量是最好用count(1)。
3,max()获取最大值
select max(age) from person
注:max的意思与sum类似,获取所有age,然后取最大值。sql语句后台同样可以添加where条件语句。
4,min()获取最小值
select min(age) from person
5,avg()获取平均值
select avg(age) from person
##分组
一,基本使用
分组使用关键词order by
原表数据如下:
分组sql语句如下:
select age from person group by age
查询结果如下:
说明:原表中有两个age是16,通过age分组只得到一个16.
注:group by后面可以跟多个字段,如下:
select name,age from person group by name,age
说明:此时name和age同时相同时才会被分为一组。
二,组合 自动去重
分组的作用:分组常常与聚合函数一起使用,比如获取各个年龄的人数,如下:
select age ,count(1) from person group by age
sql执行结果如下:
说明:此时可以看到各个年龄的人数。
三,分组统计
需求:统计表中年龄的个数,即有几个年龄数。sql如下:
select count(1) from (select age from person group by age) temp
这是一种多表操作,先使用select age from person group by age得到一个临时表,然后再查数量。
四,分组获取最大值
需求:统计各个年龄的最大id。sql如下:
select max(id),age from person group by age
五,分组最易范错误
如下面语句:
select name,age from person group by age
执行会报下面异常:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xia.person.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
说明:异常意思是说name不是分组的列。表中guoxiang,zhaomin的age都是16,所以不可能获取到一个name,但可以这么用:
select max(name),age from person group by age
六,having的使用
where不能与group by一起使用,所以此时出现了having。用法示例如下:
--
select age from person group by age having age >2
--
select count(1), age from person group by age having count(1) >1
--
select age from person group by age having count(1) >1
说明:having后面并不是所有字段都可以作为判断条件,必须是可以放在select 和from之间的字段才能作为判断条件。