SQL SELECT 语句用于从数据库的表中取回所需的数据,并以表的形式返回。返回的表被称作结果集。
基本的查询语法如下:
SELECT column1, column2, columnN FROM table_name;
如果需要查询一条记录中的所有的字段,可以用符号「*」替代全体,例如:
SELECT * FROM person;
可查询出 person 表所有的记录:
这是最基本的查询,没有之一,接下来我们将一点点的增加复杂度,更熟练的掌握查询语句。
1、where 子句
where 子句又被称为条件子句,用于筛选查询出来的数据集,指定的条件语句中可以使用基本的算术、关系和逻辑运算,例如:>,<,=,!=,&&,||。
我们现需要查询出,名字叫「yang」,年龄为「22」的记录,该怎么写呢?
select * from person where name='yang'&& age=22;
还是很简单的,虽然 where 子句很简单,但它却是我们 SQL 查询中最重要的一个关键字,基本上每一条 SQL 语句都离不开它。
在指定条件中,除了我们以上说的可以使用基本的逻辑算术运算符,子查询也是需要依赖 where 的,我们后面继续说。
2、LIKE 子句
LIKE 子句,我们一般用来做一些简单的搜索查询,或者说模糊匹配,表达式主要涉及到两个符号:
百分号 %:匹配任意多个字符
下划线 _:匹配固定一个字符
举几个例子吧,同样以我们的 person 表数据为例。
查询所有的数据,找到其中 name 字段以字符「ang」结尾的数据记录集合:
select * from person where name like'%ang';
执行 SQL,返回结果:
查询所有的数据,找到其中 name 字段以字符「ang」结尾,并且前面还有一个任意字符的数据记录集合:
select * from person where name like '_ang';
3、in 子句
in 关键字也是使用在 where 子句的条件表达式中,它限制的是一个集合,只要字段的值在集合中即符合条件,例如:
select * from person where age in(22,30,23);
这个 SQL 语句可以查询出来所有年龄是 22,30,23 的人数据记录。
你也可以使用 not in 反向限制,例如:
select * from person where age not in(22,30,23);
这个 SQL 则可以查出所有年龄不是这三个值的数据记录信息。
4、ORDER BY 子句
ORDER BY 子句根据一列或者多列的值,按照升序或者降序排列数据。某些数据库就默认以升序排列查询结果。
基本的 SQL 语法为:
SELEC Tcolumn FROM table_name [WHEREcondition] [ORDERBYcolumn1, column2, .. columnN] [ASC|DESC];
ASC 表示数据结果集按升序排序,DESC 表示数据结果集按降序排序。
一般来说,我们按某一列进行排序即可,当然,有时候一列排序并不能完全解决问题,如果按多列排序,那么当遇到某一列值相同的时候,就会参照第二个列参数将这些重复列值得数据记录再一次排序。
举个例子:
我们将 person 表中的数据参照 id 列,倒序排序:
select * from person order by id desc;
执行 SQL,查看结果:
需要注意的是,对于数字类型的字段排序而言还相对容易理解些,对于非数字类型的排序,可能你不一定能看懂它为什么这样排序。
其实每个数据库都预定义了很多的排序规则,很多数据的实现都默认使用 utf8_general_ci 排序规则,当然,如果你很熟悉各种排序规则,你也可以在创建数据表的时候去主动指定使用哪种排序规则,一般使用默认排序规则就行。
5、GROUP BY 子句
GROUP BY 子句用于将查询返回的结果集进行一个分组,并展示各个分组中排在第一个的记录,将分组中其余成员隐藏。
我们为 person 表添加几条数据,用于演示:
注意观察姓名列,有几组重复的姓名。
我们按照姓名对结果集进行分组,SQL 如下:
select * from person group by name;
执行 SQL,得到结果:
你看,分组之后,只展示每个分组下排序第一的记录,其余成员隐藏。
细心的同学可能发现了,分组后的数据记录排序怎么乱了,怎么不是默认的 id 升序排列了?
对,如果你没有显式执行排序方式的话,将默认以你用于分组参照的那个字段进行排序。
当然,我们是可以执行排序方式的,使用 order by 子句:
select * from person group by name order by id;
效果是这样:
这就是分组,可能会有同学疑问,这样的分组有什么意义,分组是分完了,给我返回每个分组的第一行记录有什么用?
其实是这样的,我们之所以进行分组,就是为了统计和估量每个分组下的指标情况,比如这组数据的平均年龄、最高薪水等等等等。
而当我们只是 「select *」的时候,数据库根本不知道你要干什么,换句话说就是你并没有对每一个分组中的数据进行任何的分析统计,于是给你返回该分组的第一行数据。
你要记住的是,每个分组只能出来一个数据行,究竟让什么样的数据出来取决于你。
比如我们计算每个分组下的平均年龄:
select avg(age) as '平均年龄' from person group by name;
查询结果:
这里涉及了一个求平均数的函数 avg,我们后续会介绍这些常用函数,这里你体会下其意思就行。
6、HAVING 子句
HAVING 子句在我看来就是一个高配版的 where 子句,无论是我们的分组或是排序,都是基于以返回的结果集,也就是说 where 子句的筛选已经结束。
那么如果我们对排序、分组后的数据集依然有筛选需求,就用到我们的 HAVING 子句了。
例如:
select avg(age) as vage from person group by name having vage>23;
分组之后,我们得到每个分组中数据的平均年龄,再者我们通过 having 语句筛选出平均年龄大于 23 的数据记录。
以上我们介绍了六个子句的应用场景及其使用语法,但是如果需要同时用到这些子句,语法格式是什么样的?作用优先级是什么样的?
大家一定要记住这个模板,各个子句在 SQL 语句中的位置,可以不出现,但不得越位,否则就会报语法错误。
首先是 from 语句,查出表的所有数据,接着是 select 取指定字段的数据列,然后是 where 进行条件筛选,得到一个结果集。
接着 group by 分组该结果集并得到分组后的数据集,having 再一次条件筛选,最后才轮到 order by 排序。
篇幅已经很长了,不再继续了,有关子查询、连接查询以及一些细节我们放在下一篇,本篇的重点是理解上述模板中的各个子句,并记住他们之间的作用优先级。
学习常考:https://www.cnblogs.com/yangming1996/p/10416499.html