3.1 SELECT的语法结构
3.1.1 SELECT语法格式
一般情况下,SELECT语句的语法格式为:
SELECT [ALL|DISTINCT] <目标列表达式> [AS 列别名][,<目标列表达式> [AS 列别名] ...] FROM <表名> [,<表名>…]
[WHERE <条件表达式> [AND|OR <条件表达式>...]]
[GROUP BY <列名>[,<列名>]……[HAVING <条件表达式>]]
[ORDER BY <列名> [ASC | DESC] [,<列名> [ASC | DESC]]]
SELECT子句用于声明要在查询结果中显示的列,这些列可以是数据源中的某些列,也可以是经过计算后的表达式的值,也可以是字符串常量等,不同的列之间用逗号隔开。
一般来说,一个SELECT查询语句要搭配一个FROM子句来使用。FROM子句用来指明查询的数据所来自的表或数据源。
WHERE子句的作用在于查找数据源中所需要的行。如果说SELECT子句是指明结果中要显示的列,那么WHERE子句的作用则是指明结果中要显示的行。因此,SELECT是列上的运算,在关系代数中称之为“投影”;WHERE是行上的运算,在关系代数中称之为“选择”。WHERE子句在查询行时,其原理是指明一个或者多个查询条件,只有符合条件的行才会从表中筛选出来,放入到查询结果中。
查询数据的时候,不仅可以查询原始数据,还可以在原始数据之上做进一步的统计分析。比如,一个“学生信息表”中包含了多个学院的学生信息,如果要统计每个学院的学生人数,则需要将学生先按照“学院”进行分组,然后对每个分组进行“计数”,才能得出每个学院的学生数。这种查询仅仅靠SELECT和FROM子句是无法完成的,必须引入GROUP BY子句。GROUP BY子句可以将数据进行分组,然后对分组后的数据做进一步的统计分析。
用GROUP BY子句查询出分组数据之后,如果还需要对分组后的统计值做进一步筛选,则要用到HAVING短语。例如,当通过GROUP BY子句把每个学院的学生人数统计出来后,如果只查看“人数>500”的学院信息时,则要使用HAVING短语来指定“人数>500”这个筛选条件,即分组统计之后的进一步筛选。
当满足要求的数据被查出后,有可能会涉及大量的数据,此时可以对查询后的数据进行排序,以提高数据的可读性。对数据排序要使用ORDER BY子句,排序时既可以使用升序,也可以使用降序,可以对一个字段排序,也可以对多个字段排序。
一般情况下,SELECT子句、FROM子句构成了SELECT查询语句的基本结构。根据查询数据的要求,可以逐步搭配WHERE子句、GROUP BY子句、ORDER BY子句以及HAVING短语共同构成复杂的SELECT语句块,实现更加高级复杂的查询操作。
查询操作一方面可以通过搭配不同的子句实现复杂功能,另一方面可以通过对多个表进行连接查询,实现更大数据范围的查询操作。本章主要讲解对一个表的查询,涉及多个表的查询将在第8章的高级查询中讲解。