条件、排序、分组
也许你发现如此简单的查询删除、查询、修改的操作并不能满足我们的需求。sql中where、order by 、group by 、having 等一些关键字将会来满足你的需求。
where
在之前的文章的修改和删除中都涉及了where关键字,where的作用就是用来设置相关条件的。where 的后面可以放上相关的条件作为判断。
实例1
update `student` set name="小张三" where id = 1 ;
此时id=1
就是一个条件,sql语句的含义就是将id=1
的所有记录中的name
设置为小张三
实例2
update `student` set sex="女" where id = 1 and name = "小张三";
将id = 1 and name = "小张三"
(and表示和、并且,就是同时满足这两个条件)的所有记录的name
设置为女
实例3
update `student` set sex="女" where id = 1 or name = "小张三";
将id = 1 or name = "小张三"
(or表示或者,就是满足其中一个条件即可)的所有记录的name
设置为女
- 同时还有其他的条件例如
对于数值有>、>=、<、<=、between...and...
还有一些特殊的like、in
like
like可以理解为像的意思,对应的需要一个包含通配符的表达式
通配符有:
%
表示任意字符_
表示一个字符
实例1
update `student` set sex="女" where name = "小%三";
这个条件可以匹配小三、小瘪三、小张三、小三三三、小xxxxxx三
实例1
update `student` set sex="女" where name = "小_三";
这个条件可以匹配小瘪三、小张三
in
实例
update `student` set sex="女" where name in ("张三","李四","王五");
条件表示name在后面的集合当中
order by
我们再插入两条数据
insert into `student` (id,name,sex)
values(3,"张三3","男");
insert into `student` (id,name,sex)
values(2,"张三2","男");
将结果排序
降序
SELECT * FROM `student` order by id desc;
升序
SELECT * FROM `student` order by id asc;
默认(升序)
SELECT * FROM `student` order by id ;
group by
为了体现效果我们再插入一些数据
insert into `student` (id,name,sex)
values(3,"李刘","男");
insert into `student` (id,name,sex)
values(2,"刘丽","男");
实例1
select id,name ,count(name),count(id) from `student` group by id ,name ;
以id和name分组,id相同的为一组,name相同的为一组。
往往配合函数使用例如count()计算一组内的个数。
having
你可能有个疑问对于分组后的数据我们该如何设置条件进行筛选呢。where?where后面是不能跟随聚合函数的。所以有了having
实例
select id,name ,count(name),count(id) from `student` group by id ,name having count(name)>2 ;
结语
到这里我们已经了解了sql的一些基本的用法,对于select
where
order by
group by
having
这些关键字再sql语句中的执行顺序是否有疑问?
- 接下来我来描述一下
首先通过from
来获取数据源(这里面包含了表的连接join on),之后则是执行where group by having
,经过相应的条件、分组得到最终结果集合,此时通过select
输出结果,如果需要排序的则执行完order by
后再执行select
。
可以看出sql语句是从where
开始的最终是select
结束。
在这之中可能有相应的嵌套循环,此时有点类似递归最终是从最内部开始执行,逐级返回。(详细的语义分析这里就不做说明了)