数据查询

数据查询是数据库的核心操作。

一、单表查询

单表查询是只对一张表进行查询。

1、选择表中若干列

1)SELECT <指定列> FROM <表名> 表示查询指定的属性列
2)SELECT<所有列>|<通配符*> FROM <表名> 表示查询全部列
3)SELECT <目标表达式> FROM <表名> 表示查询经过计算的列,其中目标表达式可以是算术表达式,还可以是字符串常量、函数等。

2、选择表中的若干元组

1)消除取值重复的行
使用DISTINCT,在列名前使用,可以去除结果重复的行
2)查询满足条件的元组
使用WHERE语句,在表名后使用,可以获取相应的结果
常用的查询条件如下:
查询条件

通配符
1、%(百分号)代表任意长度(包含0)的字符串,eg:a%b可匹配abc、avvvb或者ab等。
2、_(下划线)代表任意单个字符,eg:a_b代表以a开头,b结尾的长度为3的任意字符串。
3、如果查询的字符串带有通配符,需要使用ESCAPE ‘<换码字符>’短语进行转义。EXCAPE‘\’表示“\”为换码字符,这样匹配串中紧跟在“\”后面的字符(通配符)不再具有通配符的含义。

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]<列名>) 求一列中的最小值
备注:当聚集函数遇到空值的时候,除了COUNT()外,都跳过空值而只处理非空值。COUNT()是对元组进行计数,某个元组的一个或部分列去空值不影响统计结果。注意,WHERE子句不能用聚集函数作为条件表达式。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。

5、GROUP BY子句

GROUP BY子句将结果按某一列或多列的值分组,值相等的为一组,对查询结果的分组是为了细化聚集函数的作用对象。如果没有进行查询分组,聚集函数将作用于整个查询结果;分组后将作用于每一组,每组都有一个函数值。

WHERE子句与HAVING子句的区别
WHERE子句作用于基本表或视图,从中选择满足条件的元组,而HAVING作用于组,从中选择满足条件的组。

二、连接查询

连接查询是关系数据库中最主要的查询,包含:等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和符合条件连接查询等。
1、等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件成为连接条件或连接谓词,格式为:
[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
其中比较运算符主要有=、>、<、>=、!=(或<>)等。
此外连接谓词还可以使用:
[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>
当连接运算符为=时,称为等值连接。使用其他运算称为非等值连接。
连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。若在等值连接中把目标列中重复的属性列去掉则为自然连接。
2、自身连接
连接可以是一个表与自己进行连接,称为自身连接。
3、外连接
左外连接列出左边关系中所有的元组,右外连接列出右边关系中所有元组。
4、多表连接
两个以上的表进行连接称为多表连接。
关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。

三、嵌套查询

在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询,但是子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
嵌套查询使得用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力,以层层嵌套的方式来构造程序正式SQL中“结构化”的含义所造在。
1、带有IN谓词的子查询
在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最经常使用的谓词。
查询步骤:先分步来完成此查询,然后再构造嵌套查询。其中子查询的查询条件不依赖于父查询,称为不相关子查询。查询方法有里向外处理,即先执行子查询,子查询的结果用于建立其父查询的查找条件。如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询语句。
2、带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内存查询返回的是单个值时,可以用比较运算符(>、<、=等)。
3、带有ANY(SOME)或ALL谓词的子查询
子查询返回单值时可以用比较运算符,但返回多值时要用ANY(SOME)或ALL谓词修饰符,并且需要同时使用比较运算符。语义如下:
1)比较符 ANY 比较结果+子查询结果中的某个值
2)比较符 ALL 比较结果+子查询结果的所有值

比较:用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高。

ANY/ALL和聚集函数、IN谓词等价关系:
等价关系
4、带有EXISTS谓词的子查询
EXISTS代表存在量词。带有EXISTS的子查询返回的是逻辑值true或者false,可以判断是否存在表或者成立条件是否成立。

四、集合查询

SELECT语句的查询结果是元组的集合,多个SELECT语句的结果可进行集合操作,集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT,其中参加集合操作的各查询结果的列数必须相同,对应项的数据类型必须相同。
UNION操作会自动去除重复元组,如果要保留重复元组就使用UNION ALL操作符。

五、基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这是子查询生成的临时派生表称为主查询的查询对象。
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。说明:通过FROM子句生成派生表时,AS关键字可省略,但必须为派生关系指定一个别名,而对基本表,别名是可选择项。

六、SELECT语句的一般格式

SQL的SELECT语句灵活而又实用,一般格式为:

SELECT [ALL|DISTINCT] <目标表达式>[,<目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>…]
|(< SELECT 语句> ) [AS]<别名>[WHERE<条件表达式>][GROUP BY<列名2>[HAVING <条件表达式>]][ORDER BY<列名2>[ASC|DESC]];

整个语句的含义:
1、根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标表达式选出元组中的属性值形成结果表。
2、GROUP BY表示将结果按<列名1>的值进行分组,属性列值相等的元组为一组。通常会在每组中作用聚集函数。如果GROUP BY 子句中带有HAVING 短语,则只有满足指定条件的组才输出。
3、如果有ORDER BY子句,则结果表按<列名2>的值进行升序或降序排序。
备注:
A:目标列表达式的可选格式为
1)*
2)<表名>.*
3)COUNT([DISTINCT|ALL]*)
4)[<表名>.]<属性列名表达式>[,[<表名>.]<属性列名表达式>]…其中,<属性列名表达式>可以是由属性列、作用于属性列的聚集函数和常量的任意算术(+、-、*、/)组成的运算公式。
B:聚集函数的一般格式
COUNT/SUM/AVG/MAX/MIN + ([DISTINCT|ALL]<列名>)
C:WHERE子句的条件表达式的可选格式
where表达式可选格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值