SQL查询的基本结构由三个子句构成:selectfromwhere

单关系查询

关于重复:

在关系模型的形式化数学定义中,关系是一个集合。因此,重复的元组不会出现在关系中。在实践中,去除重复是相当费时的。所以SQL允许在数据库关系以及SQL表达式的结果中出现重复。(模式中包含主码声明的任何数据库关系都不能包含重复元组,因为它们会违反主码约束
在某些情况下如果想强行去除重复,可以在select后插入关键字distinct
SQL允许我们使用关键字all显式指明不去除重复
保留重复元组是缺省选项

关于运算:

select子句还可带含有+,-,*,/运算符的算术表达式,运算对象可以是常数或元组的属性
注意,查询并不导致原关系发生任何改变
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组。
SQL允许在where子句中使用逻辑连词andornot。逻辑连词的运算对象可以是包含比较运算符<、<=、>、>=、=和<>的表达式。SQL允许我们使用比较运算符来比较字符串、算术表达式以及特殊类型,比如日期类型。

多关系查询

关于命名

出现在两个关系中的属性,引用时要加上关系名.作为前缀,来指名,引用的是哪个关系里的属性

含义解释

一个SQL查询可以包括三种类型的子句:select子句、from子句、where子句
每个子句的作用如下:

  • select子句用于列出查询结果中所需要的属性描述结果的格式与组成部分
  • from子句是在查询求值中需要访问的关系列表从哪些关系中获得结果信息,要查哪些表
  • where子句是作用在from子句中的关系的属性上的谓词(限制条件)
    一个典型的SQL查询具有如下形式:

select A1,A2,…An
from r1,r2,…rm
where P;
每个Ai代表一个属性,每个ri代表一个关系。P是一个谓词。如果省略where子句,则谓词P为真。

通常来说,一个SQL查询的含义可以理解如下:

1:为from子句中列出的关系产生笛卡尔积
2:在步骤1中的结果上应用where子句中指定的谓词
3:对于步骤2的结果中的每个元组,输出select子句中指定的属性(或表达式的结果)

上述步骤的顺序有助于理解一个SQL查询的结果应该是什么样的,而不是这个结果是怎样被执行的。
在SQL的实际实现中不会执行这种形式的查询,它会通过**(尽可能)只产生满足where子句谓词的笛卡尔积元素来进行优化执行**。
当编写查询时,需要小心设置合适的where子句条件。

SQL与多重关系代数

关系代数运算与SQL运算之间有着密切的联系。一个关键的区别是,不同于关系代数,SQL允许重复。SQL标准定义了在查询的输出中每个元组有多少份拷贝,这继而取决于在输入的关系中出现了多少份元组拷贝。

sql server查询一个结果集 sql查询的结果是_SQL


关系代数的选择运算对应于SQL的where子句,而不是SQL的select子句。

SQL查询的关系代数表示有助于我们形式化定义SQL程序的含义。

数据库系统通常将SQL查询转换为基于关系代数的底层表示,并使用这种表示来执行查询优化查询评估