数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。格式一般为
SELECT[ALL|DISTINCT]<目标列表达式> [,<目标列表达式>]......
FROM <表名或者视图名>[,<表名或视图名>...]|(<SELECT 语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC] [DESC]]
整个SELECT语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才给予输出。
如果有ORDER BY子句,则结果还要按<列名2>的值的升序和降序排序。
SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
1.选择表中的若干列 (选择表中的全部或部分列即关系代数的投影运算)
(1)查询指定列
在很多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在SELECT子句的<目标列表达式>中指定要查询的属性列。
(2)查询全部列
将表中的所有属性列都选出来有两种方法,一种方法就是在SELECT关键字后列出所有列名;如果列的显示顺序与其在基表中的顺序相同,也可以简单的将<目标列表达式>指定为*。
(3)查询经过计算的值
SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式。(<目标列表达式>不仅可以是算术表达式,还可以是字符串常量、函数等,用户可以通过指定别名来改变查询结果的列标题,这对于含有算术表达式、常量、函数名的目标列表达式尤为有用)
2.选择表中的若干元组
(1)消除取值重复的行
两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的行。可以使用DISTINCT消除它们。
(2)查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件有:
【1】比较大小
用于进行比较的运算符一般包括=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于),!>(不大于) !<(不小于)
【2】确定范围
谓词BETWEEN....AND..... 和NOT BETWEEN...AND...可以用来查找属性值在(或者不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
【3】确定集合
谓词IN可以用来查找属性值属于指定集合的元组。(与IN相对的谓词是NOT IN,用来查找属性值不属于指定集合的元组)。
【4】字符匹配
谓词LIKE可以用来进行字符串的匹配。一般语法格式如下:
[NOT] LIKE '<匹配串>' [ESCAPE'<换码字符>']
其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。
其中:%(百分号)代表任意长度(长度可以为0)的字符串。_(下划线)代表任意单个字符。
如果LIKE后面的匹配串中不含有通配符,则可以用=(等于)运算符取代LIKE谓词,用!=或<>(不等于)运算符取代NOT LIKE谓词。
如果用户要查询的字符串本身就含有通配符%或_,这时就要使用ESCAPE'<换码字符>'短语对通配符进行转义了。
如WHERE Cname LIKE 'DB\_Design' ESCAPE'\'
ESCAPE'\'表示"\"为换码字符。这样匹配串中紧跟在"\"后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。
【5】涉及空值的查询
如 SELECT Sno,Cno
FROM SC
WHRER Grade IS NULL;(IS NOT NULL)
注意这里的“IS”不能用等号(=)代替。
【6】多重条件查询
逻辑运算符AND 和OR可用来连接多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。
(3)ORDER BY子句
用户可以用ORDER BY子句对查询结果按照一个或者多个属性列的升序(ASC)或降序(DESC)排序,默认值为升序。(对于空值,排序时显示的次序由具体系统实现来决定。各个系统的实现可以不同,只要保持一致就行。例如:按升序排,含有空值的元组最后显示;按降序排,空值的元组则最先显示)
4、聚集函数
为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,主要有:
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数
SUM([DISTINCT|ALL]<列表>) 计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列表>) 计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列表>) 求一列值中的最大值
MIN([DISTINCT|ALL]<列表>) 求一列值中的最小值
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或者指定ALL短语(ALL为默认值),则表示不取消重复值。
当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。
注意:WHERE子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句
5.GROUP BY子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。