查询是数据库中最重要和最繁琐的工作之一,也是开发人员经常使用的,查询方式也有多种且可以相互嵌套。
在讲查询之前,我先讲讲sql语句的执行顺序。sql语句的执行顺序是:从下往上,从里往外的顺序执行。
什么意思呢?比如:select * from emp where ename="yanxueer"
将它格式化:
select *
from emp
where ename="yanxueer"
它默认先执行的是from emp where ename="yanxueer"
在找到对应的表并且满足where
条件后,输出select *
这就是从下往上。
那么什么叫从里到外呢?
就如同数学中的运算符的优先级一样,如:((1+2)*3)+4
永远先执行最里面括号里的1+2
然后再拿1+2
的值与外层括号中的3
相乘,最后再和4
相加是一个道理。因为子查询中,会牵扯到括号,还有多层子查询,括号套括号。理论是可以嵌套无数层的但并不建议你那样去做。
注:如果实在分不清执行的先后顺序,那么就把你分不清的地方用()括起来,括号里面的先执行,这样可以帮助你去理解。目前你只需要知道,是先执行了from后面的操作之后再执行"*"部分的
现在我们开始这篇的正文:表的查询。
1.基本查询
--1.1基本查询语句
SELECT * FROM 表名 [WHERE CONDITION] //where作为判断条件,可以省略。
我们已经学习了增、删、改。那么应该只能where条件是可以省略的,但是省略后与加上是有明显差异。where
起到一个筛选的功能,不满足条件的全部过滤掉,比如:根据性别、年龄等,进行限制
。
语句中的*
是通配符,学过前端html/css的同学应该知道,默认代表全部。即显示查询后的全部信息。我们也可以写成
select name,age from emp where age>20;
即显示年龄大于20岁的人的姓名和年龄,其他信息不显示。
--1.2去重
distinct //去除重复的关键字
因为我们可能查到的结果中会出现很多重复的数据,比如当两张表中都存在同一个人的时候而我们想得到的数据是不希望重的那么我们所查到的结果明显已经不能满足我们的需求了。那么这个时候就可以通过distinct
这个关键字达到去重的效果。
--1.3条件查询
条件查询也就是之前我们一直在使用的where
关键字。通过where
判断是否满足条件。筛选出满足我们条件的信息。(上面的例子中已经演示,在此不再重复)
--1.4排序和限制。
order by //order by 中默认有两个关键字[DESC|ASC],升序和降序,可以精确到根据某一列进行排序,默认为升序。
ASC
为升序。默认为升序。
DESC
为降序。
--1.5"LIMIT"关键字
LIMIT //显示几行信息
对于查询或者排序后的信息,我们希望只显示一部分,而不是全部,这时,就可以使用limit
来实现
limit
还有一个分常重要的功能那就是分页。、
limit 经常和 order by 一起配合使用来进行记录的分页显示。
什么是分页呢?
就是当我们查询到的信息太多,一个页面无法显示。就需要分成许多个页面来显示,比如:
就如同这样。三大数据库实现的分页的方式不同,在MySQL中用到limit
关键字,而sql server中是top
,以及oracle中的rownum
。目前我们只需要知道limit
可以实现分页功能即可。
--1.6having
关键字
having
关键字表示对分类后的结果再进行条件的过滤。
having
就是在所有语句都执行完,输出结果时再进行了一次筛选,然后输出最后的结果,我们可以举一个例子帮助大家理解:
比如:
原本没having的语句相当于1+1 ,而此时有了having之后就相当于(1+1)+1;就是在之前的结果上再加了1.它的执行是建立在结果上的。
select * from emp where age >19 ;的结果应该是全部输出,因为表中没有年龄小于19的员工。而select * from emp where age >19 having age>20;
就是在这个输出的结果上再次做了一个判断如同 select * from(select * from emp where age >19 ) where age >20;
这里的(select * from emp where age >19 )我们可以把它看成一张表,因为它本身输出的也是一张表,这本身就是子查询的概念。没有理解的就暂且把它当成一张表去看。
having.png
注意:having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚
合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果
集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。
--1.7GROUP BY
和聚合函数
聚合函数
:也就是函数操作,把数据聚合在一起。
常用的有:sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
group by
关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门
就应该写在 group by 后面。
注:count是统计某个字段值的重复数量的,group by就是判断根据什么判断的比如姓名,要求把所要显示的字段,除了count所包含的字段以外,
其他字段的字段名,都写进group by中。sum是求和的就把该字段的数值全部相加,输出结果。注意不要把sum和count搞混了。
--1.8WITH ROLLUP
with rollup
是可选语法,表明是否对分类聚合后的结果进行再汇总.
为了改加方便查看count
和with rollup
,我给表中的部门添加了wang
和wangy
并且部门号都为1
我们来看看sql语句作用:
1.统计了各个部门的人数;
2.既统计了各部门人数,又统计了总人数;
3.作为对比方便大家理解示范。
2.命令总结
//查询语句
SELECT * FROM 表名 [WHERE CONDITION] //where作为判断条件,可以省略。
//去除重复的关键字
distinct
//排序
order by //默认为升序。 DESC为降序,ASC为升序。
//分页
LIMIT //显示几行信息
//having
having 关键字表示对分类后的结果再进行条件的过滤。 //注意与where的区别
//GROUP BY和聚合函数
group by 字段名 //要进行分类聚合的字段就写在group by后面。
常用聚合函数:sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。
//with rollup
with rollup是可选语法,表明是否对分类聚合后的结果进行再汇总
小白出品!不喜勿喷!
生活总会给你第二次机会,叫明天。
网友评论