SQL基础二

SQL基础二

一、内连接

1.自然连接

​ 自然连接运算作用于两个表,自然连接的结果包括在两个表中都出现的属性上的数值均相等的那些元组。如A,B两表均有id属性,那么A natural join B的结果等价于

1
2
3
select *
from A,B
where A.ID=B.ID
2.连接条件

​ 可以使用on来指定连接的条件。即按on子句指定的谓词进行连接。在内连接中,带on条件的连接表达式可以用不带on的表达式等价替换。但是在外连接中,on条件的表现和where不同

1
2
select * 
from A join B on A.ID=B.ID

二、外连接

​ 在内连接中,如果有一个表中的连接属性(即两表都具有的属性)取值为null,那么该元组不会被加入内连接的结果集。此时就需要外连接。

​ 外连接运算在内连接的结果中创建包含null的元组,来保留内些在连接中丢失的元组。

​ 外连接包括左外连接(left outer join)、右外连接、全外连接三种。左外连接保留在运算左边的关系中的元组,右外连接相反。全外连接都保留。

​ 对于左外连接(LEFT JOIN),如果在连接过程中发现左侧表中的某些行无法与右侧表匹配,则这些行仍然会出现在最终结果集中,但是右侧表相关的列将会被设置为 NULL 值。

on对外连接的影响

​ 首先,来看下面的SQL查询语句

1
2
3
4
select 
*
from a left join b on a.id = b.a_id
where b.name='apple'
1
我期望的结果是:表a的数据全部展示出来,不符合表b条件的数据字段用null填充。

​ 但是,答案却出乎我的意料,所有数据都被过滤掉了,最终结果并不符合left join的语义,表a是主表,无论如何是应该展示出来的,但是并没有。
问题出在哪里呢?

​ 这里牵扯到的是sql语句中on后的条件和where后的条件的执行顺序问题。

​ 数据库在通过连接两张或多张表返回记录时,首先根据连接条件生成一张临时表,然后,where条件过滤临时表,最后,将结果返回给用户。
​ 这里就说的很明白了,SQL语句执行先使用on条件,然后,使用where条件。

​ 这里,有必要再次明确一下left join…on… 语法的准确含义。

​ LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则右表结果用 NULL填充。
​ 展开来解释一下就是:左表是主表,总是全部返回,而右表的结果是根据on条件来决定的。如果on条件为真,那么,就返回匹配上的右表结果,如果on条件为假,那么就把右表的结果用null填充。
这里的on条件不仅限于一个,也可以是多个。

有了上面的基础知识,就可以进一步去理解阐述了。

  • 如果b.name='apple'作为where条件,那么,按照sql语句的执行流程,首先生成连接查询临时表结果,这一步是没有问题的,然后使用where条件过滤,这时候,b表中并没有符合条件的数据,这样,所有数据就被过滤掉了。返回的结果,就不符合预期了。
  • 如果b.name='apple'作为on条件,那么,按照sql语句的执行流程,首先生成连接查询临时表结果,这一步也是没有问题的,依然,能达到我们的预期。

三、视图

​ 视图是一种“虚拟关系”,概念上包括查询的结果。实质上就是存储了一条sql语句,当使用视图时,去运行该sql语句计算结果。

1
create view v as 查询表达式
物化视图

​ 物化视图的结果会存储在数据库中,当用于定义视图的表发生改变,视图也跟着修改并保持最新。

​ 一般不使用试图进行修改操作