表与表之间的关系有3种:
- ①一对一;
- ②一对多;
- ③多对多。
其中一对多和多对一实际上是相同的,只是角度不同而已。 在SQL中,多表连接的方式主要有以下4种:
- 联合查询
- 内连接
- 外连接
- 笛卡尔积连接
表的集合运算,跟数学中的集合运算是非常相似的。对于表的集合运算,主要包括以下3种。
- 并集(union)
- 交集(intersect)
- 差集(except)
在Oracle中,我们可以使用union关键字来对两个表求并集。求两个表的并集,也就是对两个表进行加法运算。这种求并集的操作,也叫做“联合查询”。 语法:
对于表的求并集(union),我们可以总结出以下重要的3点。
- 对于求并集的两个表来说,它们的结构必须完全相同,包含列数相同、类型相同等。
- union语句必须由2条或2条以上的select语句组成,然后彼此之间使用union关键字来分开。
- 在union语句中,只能使用一条order by子句或限制子句,并且它们必须放在最后一条select语句之后。
P.S.:
对于表的集合运算来说,它本质上是以“行”为单位进行操作的。而对于表的连接运算(包括内连接和外连接),则是以“列”为单位进行操作的
内连接返回两个或多个表中存在匹配关系的行。如果某行在连接的表中没有匹配,那么这些行就不会被返回。
在SQL中,我们可以使用inner join关键字来实现内连接。所谓的内连接,指的是多个表通过“共享列”来进行连接。在实际使用中,inner经常省略掉 语法:
(1)单表查询:对于单表查询来说,列名前面的表名前缀是可以省略的,也就是“表名.列名”可以直接写成“列名”。
(2)using(列名):下面两种方式是等价的,也就是on pets.client_id=clients.client_id可以等价于using(client_id)。
P.S.:当使用方式2的时候,查询展示出来的所有字段中,关联字段只会出现一次,而使用方式1的时候,关联字段会全部展示出来。但是在实际开发应用中,为了查询速度更快,往往是select出需要的字段,这样的情况下,个人习惯或者喜欢使用哪种方式都是OK的!
(3)连接多个表:在SQL中,内连接(inner join)不仅可以连接两个表,还可以同时连接多个表(3个或3个以上)。如果想要连接多个表,我们只需要多次使用“inner join…on…”即可。
(4)查询条件:对于内连接的查询条件,我们并不一定要使用“=”。除了等值连接,我们还可以使用非等值连接。所谓的非等值连接,指的是on子句使用的是除了等号(=)的其他比较运算符(如>、>=、<、<=、<>等)进行的连接,比如:
在SQL中,根据连接时要提取的是哪个表的全部记录,外连接可以分为以下3种类型。
- 左外连接:根据左表来提取结果。
- 右外连接:根据右表来提取结果。
- 完全外连接:同时对左表和右表提取结果。
左外连接,指的是根据“左表”来获取结果。在Oracle中,我们可以使用left outer join来实现左外连接。返回左表(表A)的所有行,即使右表(表B)中没有匹配的行。实际应用中,outer经常是省略的 语法:
右外连接,指的是根据“右表”来获取结果。在SQL中,我们可以使用right outer join来实现右外连接。返回右表(表B)的所有行,即使左表(表A)中没有匹配的行。 语法:
像SQL Server等DBMS中,我们可以使用full outer join来实现完全外连接。所谓完全外连接,指的是连接之后同时保留左表和右表的所有记录,它相当于左外连接和右外连接的并集。 不过Oracle并没有提供full outer join这样的方式,如果想要在Oracle中实现完全外连接,我们可以使用一种“曲线救国”的方式:。
在实际开发中,我们应该清楚以下两点:
- 对于多表连接来说,最常用的是内连接,外连接用得比较少。
- 如果使用外连接,一般只会用到左外连接,个别情况会用到完全外连接。
笛卡儿积连接,也叫做“交叉连接”,它指的是同时从多个表中查询数据,然后组合返回数据。返回第一个表中的每一行与第二个表中每一行的笛卡尔积。如果第一个表有X行,第二个表有Y行,那么结果集将会有X*Y行。笛卡儿积连接的特殊之处在于,如果它不使用where子句指定查询条件,那么它就返回多个表的全部记录。 语法:
P.S.:
在Oracle中,笛卡儿积连接有两种写法:一种是使用英文逗号(,)隔开,另一种是使用cross join关键字。下面两种写法是等价的。
笛卡尔积连接返回左表的每一行与右表的每一行的所有可能组合,通常不推荐使用,除非你确实需要这种类型的数据组合。在实际应用中,笛卡尔积很少直接使用,因为它会生成大量数据, 在Oracle中,笛卡儿积连接中经常是“犯错”的一个结果,一般情况下,要求的数据是一对一或是一对多,结果由于条件的不足,导致了查询结果的错误(也就是数据量更多了)
在SQL中,还有一种很特殊的多表连接方式——自连接。在自连接时,连接的两张表是同一张表,然后我们一般需要通过起一个别名来进行区分。 语法:
注意事项
索引是建立在数据表中列上的一个数据库对象,在一个表中可以给一列或者多列设置索引。如果在查询数据时,使用了设置的索引列作为查询列,那么就会大大提高查询速度。
在SQL中,我们可以使用create index语句来创建一个索引。需要注意的是,我们只能对表进行创建索引,而不能对视图进行创建索引。 语法:
【常见问题】
在SQL中,我们可以使用show index语句来查看一个索引的基本信息。 语法:
在SQL中,我们可以使用drop index语句来删除一个索引。 语法: