SQL查询的基本结构由三个子句构成:select、from、where
单关系查询
关于重复:
在关系模型的形式化数学定义中,关系是一个集合。因此,重复的元组不会出现在关系中。在实践中,去除重复是相当费时的。所以SQL允许在数据库关系以及SQL表达式的结果中出现重复。(模式中包含主码声明的任何数据库关系都不能包含重复元组,因为它们会违反主码约束)
在某些情况下如果想强行去除重复,可以在select后插入关键字distinct
SQL允许我们使用关键字all显式指明不去除重复
保留重复元组是缺省选项
关于运算:
select子句还可带含有+,-,*,/运算符的算术表达式,运算对象可以是常数或元组的属性
注意,查询并不导致原关系发生任何改变。
where子句允许我们只选出那些在from子句的结果关系中满足特定谓词的元组。
SQL允许在where子句中使用逻辑连词and、or和not。逻辑连词的运算对象可以是包含比较运算符<、<=、>、>=、=和<>的表达式。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的where子句,而不是SQL的select子句。
SQL查询的关系代数表示有助于我们形式化定义SQL程序的含义。
数据库系统通常将SQL查询转换为基于关系代数的底层表示,并使用这种表示来执行查询优化和查询评估。