这一章继续以案例的形式讲解,主要是一个select基本的语法格式
select [all | distinct] 字段或表达式列表
[from子句]
[where子句]
[group by子句]
[having子句]
[order by子句]
[limit子句];
3.查询姓“曾”的老师的个数,名字;
//这里就开始有一些sql的函数在里面了
//这里我们可以试着去说明distinct的作用
//distinct表示去除重复元素,例如我们插入一句:
insert teacher(Tid,Tname) values(007,'曾张老师');
select count(distinct(tname)) from teacher where tname like '曾%';
select count(tname) from teacher where tname like '曾%';
//我们再详细的看看
select tname from teacher where tname like ‘曾%’;
select distinct(tname) from teacher where tname like ‘曾%’;
//很明显,同样的结果被排除了,这里就是distinct的作用
//因为涉及到了函数,所以这里把函数和分组大概讲解一下
//首先,Select的结构
select [all | distinct] 字段或表达式列表
[from子句]
[where子句]
[group by子句]
[having子句]
[order by子句]
[limit子句];
distinct:
之前讲了,去掉重复 1,默认是all,表示允许出现重复行——不写就是all; 2,distinct:表示不允许出现重复行
- -
from:
表示从哪个数据表中获取数据,也即是:设定数据源!
形式:
from 数据源;
说明:
通常,数据源就是一个表名;也可以是子查询表
- -
where:
1,where子句,其本质含义是:对from子句中给定的“数据源”中的每一行数据,进行“条件”筛选,并依此筛选出那些符合所设定的条件的行的数据,并取出。
2,where子句类似php编程语言或js语言中的if子句,最终体现为判断的结果是true或者false!!!
//之前已经说了,详见上一章
group by子句(分组)
形式:
group by 字段名 【asc|desc】,字段名 【asc|desc】,....;
说明:
1,group by子句是用于将“前面!!!”取得的数据,按某种标准(依据)——也就是字段——来进行分组的。
分组,基本上就是,按给定字段的值,相同的值,分在相同的组中,不同的值分在不同的组中。
2,asc表示分组后,按组的值的大小正序排列,desc是倒序——默认是正序,可以不写。
3,一个最重要的理解(观念):分组之后的结果,也是一行一行数据,只是每一行代表“一组”;
例如:
select * from student group by ssex;
//按性别分组
select * from student where sage > 100 group by ssex;
//此处为空,因为这是对前面的结果分组
select * from student group by sage desc;
select * from student group by sage asc;
//这个排序的依据是分组的那个组,并不是把每个组里面分组,而是每个组分组
//为什么这么说呢,因为我们要涉及到另外一个关键字having(后面)
4. 对于分组查询的结果数据(select子句部分),只能出现如下几类数据
分组依据字段;(但同样会出现其他字段,但是并不会报错,只不过无意义,因为就是第一行)
原始字段信息中的数字类型的最大值,最小值,平均值,总和值;
max(字段):获得该字段的在组中的最大值;
min(字段):获得该字段的在组中的最小值;
avg(字段):获得该字段的在组中的平均值;
sum(字段):获得该字段的在组中的总和值;
每一组中所包含的原始数据行的行数,获得方式为:count(*)
例如:
select * ,count(sage),min(sage),max(sage),avg(sage),sum(sage) from student group by ssex;
-
having子句
形式:
having 条件判断
说明:
1,一句话,having跟where一样,是用于对数据进行“筛选”的,但区别是:
having只用于对group by分组之后的“组信息”数据进行筛选!!!!
where只用于对from子句中所设定的“原始数据”进行筛选!!!!!
推论: 如果需要,having一定是跟在group by子句之后使用;
如果需要,where一定是跟在from子句之后使用;
2,因此,having能用的筛选依据,跟此时group by之后,select子句中可出现的“数据/字段”一样!
例如:
select * ,count(sage),min(sage),max(sage),avg(sage),sum(sage) from student group by ssex having ssex ='男';
select * ,count(sage),min(sage),max(sage),avg(sage),sum(sage) from student group by ssex having sid >1010;
- -
order by 子句
形式:
order by 字段名 【asc|desc】,字段名 【asc|desc】,....
说明:
1,用于将“前面!!!”取得是数据(可能进行了筛选和分组),按给定的字段的值的大小和顺序进行排序输出;
2,asc|desc含义同前;
select * from student where sid>1010 order by sage desc;
limit 子句
形式:
limit 起始行号n, 要取出的行数m;
说明:
1,用于将“前面”取得的数据,按前面设定的顺序(或默认顺序),取出从哪行开始的多少行;
2,行号,都是以前面取得的“数据行”为基础,从0开始算起,跟实际数据表中字段值无关
总结:
至此SQL语句查询的常用操作已经结束了,后面主要就是案例与提醒。
如果感觉还行不要忘了点赞啊!