sql基础一

sql基础一

一、一些基本概念

​ 属性:列;元组:行

​ 超码:一个或多个属性(列)的集合,它能唯一地标识出表中的某个行。

​ 候选码:最小的超码,即超码的最小真子集。

​ 主码(键):表中用于区分不同元组的主要方式的候选码。注:候选码不一定是主码,主码一定是候选码。主码一般选择不变或很少变化的属性。主码也称为主码约束

​ 外码约束:A表的某属性是B表的主码。即A中该属性的所有值必须在B中该属性的取值集合中出现。此时A表中的该属性称为A引用B的外码。A表为引用表,B表为被引用表。

​ 引用完整性约束:外码约束的推广,A中该属性的所有值必须在B中该属性的取值集合中出现。但该属性不一定是B表的主码。实际上,外码约束可以看做是引用完整性约束的特例。

二、基础sql语句的组件

​ 1.from:定义一个在该子句中所列出关系(表)的笛卡尔积,等效代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(auto t1 : 表一)
{
for(auto t2:表2)
{
....
for(auto tm:表m)
{
把t1,t2....tm连接成单个元组t
把t加入结果集
}


}
}

​ 2.where:查询谓词,限制from中的结果。

​ 3.聚合函数:聚合函数是以值集(集合或多重集合)为输入,并返回单个值的函数。注意,除了count(*)之外的聚集函数都忽略输入集合中的空值

​ 4.group by:如果希望将聚合函数作用在一组元组上,我们可以使用group by子句。在分组子句中的所有属性取值上相同的元组将被放到一组。 如果使用了分组,聚合函数的作用对象将从单个元组变成元组集(分组)。注意:要确保出现在select语句中没有被聚集的属性只能是出现在group by子句中的属性。换句话说,任何没有出现在group by子句中的属性如果出现在select语句中,那它只能是聚合函数的参数

1
2
3
4
select dept_name,ID,avg(salary)
from instructor
group by dept_name
//这是错误的查询语句,因为ID即不是group by子句里的属性,也不是聚合函数的参数

​ 5.having:对分组限制条件。该限制不针对单个元组,只针对group by生成的每个元组集合(分组)。同样,任何出现在having子句中,但没有被聚集的属性必须出现在group by子句中。

执行顺序

​ from->where->group by->having->select/聚合函数

三、嵌套子查询

1.where下的嵌套子查询

​ 通过将子查询嵌套在where中,可以用来执行对集合成员资格的测试、对集合的比较以及对集合基数的确定

​ (1)in:连接词in测试集合成员资格,这里集合指由select生成的一组值。A in B表示A在B中存在,not in同理

​ (2)集合比较:some,表示至少比某一个要…。如A <some B表示A至少比B中某一个小。A <>some B表示B中至少有一个 和A不等。=some等价于in,<>some不等价于not in。

​ all,表示比所有的都…..,用法同some。<>all等价于not in,=all不等价于in

​ (3)对集合基数的确定:exists,在作为参数的子查询非空时返回true。用法:exists(子查询)。not exists同理。

​ unique,在作为参数的子查询中没有重复元组时返回true,用法同exists。

2.from下的嵌套子查询

​ 正常使用即可。可以使用with子句来定义临时关系,这个定义只对包含with的子句有效,以此来使sql语句更简洁清晰。 用法:with 临时关系名 as (子查询)

3.标量子查询

​ 当子查询只返回一个包含单个属性的元组,这样的子查询成为标量子查询。主要由子查询中使用聚合函数来实现。