3.3 数据查询
单表查询、连接查询、嵌套查询和集合查询。
3.3.1 语句格式
其中all和distinct可写或者写的时候二选一,主要是用来表示是否去掉重复的行。默认为all。
3.3.2 单表查询
查询仅涉及一个表,是一种最简单的查询操作。
分为:选择表中的若干列;选择表中的若干元组;对查询结果排序;使用集函数;对查询结果分组。
选择表中的若干列
查询指定列
查询全部列
查询经过计算的列
可以看出来原表中是没有年龄这一属性列的,需要取出birth中的年,然后做一系列的运算。
如果不起别名,那么查询出来的biao’ge会显示为查询时的表达式。
选择表中的若干元组
消除取值重复的行(distinct)
查询满足条件的元组
查询满足指定条件的元组可以通过where子句实现。主要是从行的角度来筛选。
**通配符%**代表任意长度(长度可以为0)的字符串。
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,afdsdfb,ab等都满足该匹配串。
通配符_代表任意单个字符。
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如asb,arb等都满足该匹配串。
注意空值null和0的区别。
对查询结果排序
使用order by子句
可以按一个或多个属性列排序。
升序:asc,降序:desc,缺省值为升序。当排序列含空值null时。
asc:排序为空值的元组最后显示;
desc:排序为空值的最先显示。
使用集函数(用于统计)
这里的*代表的是一行,也就是一个元组。
对查询结果分组
使用group by子句将查询结果表按某一列或多列值分组,值相等的为一组。
对查询结果分组的目的是为了细化集函数的作用对象:
未对查询结果分组,集函数将作用于整个查询结果;
对查询结果分组后,集函数将分别作用于每个组。
注意去掉红字后的前后差别。加上红字,是按照cno分类后各个组的计数。
如果分组后还要按一定的条件对这些组进行筛选,最终只输出满足条件的组,则可以使用having短语指定筛选条件。
这里注意到where和having后面跟的都是条件,那么他们有什么区别呢?
where子句和having短语的区别:作用对象不同。
where子句作用于基表或视图,从中选择满足条件的元组。
having短语作用于组,从中选择满足条件的组。
这里查询的就是不及格的成绩在3门以上的学生。
3.3.3 连接查询
单表查询只是涉及到一张表,但是在实际操作中却经常遇到查询两张或两张以上的表,这里就开始讲解连接查询。
若一个查询同时涉及两个以上的表,则称为连接查询;
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词。
那么为什么要加上连接条件,接下来的看例子。
首先以s表和sc表为例。
可以看出,如果不加条件,那么查询结果就默认将两个表做了广义笛卡尔积,可以看出查询结果中有很多都是不具有实际意义的。
加上连接条件后,使得表中的数据具有了实际的意义。
SQL中连接查询的主要类型:
等值与非等值连接查询;
自身连接查询;
外连接查询;
复合条件连接查询。
1. 等值与非等值连接查询
当连接运算符为“="时,称为等值连接。使用其他运算符称为非等值连接。常用的是等值连接。
是在上边查询结果的基础上又加上一个条件。
2. 自身连接
一个表与其自己进行连接,称为表的自身连接;
需要给表起别名以示区别;
由于所有属性名都是同名属性,因此必须使用表别名前缀。
其中a和b是对同一个表起的不同别名。
在使用自身链接的时候需要注意,给表起别名,查询表中列的时候注意加上别名前缀。
3.外连接
**悬浮元组:**两个关系在做自然连接时被舍弃的元组称为悬浮元组;
**外连接:**如果把悬浮元组也保存在自然连接的结果关系中,而在其他属性上填空值,那么这种连接就叫做外连接。
左外连:如果只保留左边关系R中的悬浮元组就叫做左外连(left outer join)
右外连:如果只保留右边关系S中的悬浮元组就叫做右外连(right outer join)
以上是左外连,有点难以理解了。。
4. 复合条件连接
where子句中含多个条件时,称为复合条件连接。