新闻| 文章| 资讯| 行情| 企业| wap手机版| article文章| 首页|会员中心|保存桌面|手机浏览
普通会员

枣庄市凡柔科技有限公司

企业列表
新闻列表
  • 暂无新闻
推荐企业新闻
联系方式
  • 联系人:汪女士
首页 > 新闻中心 > SQL语法基础-多表查询(+索引简介)
新闻中心
SQL语法基础-多表查询(+索引简介)
发布时间:2024-11-17        浏览次数:0        返回列表

SQL语法基础-多表查询(+索引简介)

表与表之间的关系有3种

  • ①一对一
  • ②一对多
  • ③多对多。

其中一对多和多对一实际上是相同的,只是角度不同而已。 在SQL中,多表连接的方式主要有以下4种

  • 联合查询
  • 内连接
  • 外连接
  • 笛卡尔积连接

表的集合运算,跟数学中的集合运算是非常相似的。对于表的集合运算,主要包括以下3种。

  1. 并集(union
  2. 交集(intersect
  3. 差集(except

在Oracle中,我们可以使用union关键字来对两个表求并集。求两个表的并集,也就是对两个表进行加法运算。这种求并集的操作,也叫做“联合查询”。 语法

对于表的求并集(union,我们可以总结出以下重要的3点。

  1. 对于求并集的两个表来说,它们的结构必须完全相同,包含列数相同、类型相同等。
  2. union语句必须由2条或2条以上的select语句组成,然后彼此之间使用union关键字来分开。
  3. 在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中实现完全外连接,我们可以使用一种“曲线救国”的方式:。

在实际开发中,我们应该清楚以下两点

  1. 对于多表连接来说,最常用的是内连接,外连接用得比较少。
  2. 如果使用外连接,一般只会用到左外连接,个别情况会用到完全外连接。

笛卡儿积连接,也叫做“交叉连接”,它指的是同时从多个表中查询数据,然后组合返回数据。返回第一个表中的每一行与第二个表中每一行的笛卡尔积。如果第一个表有X行,第二个表有Y行,那么结果集将会有X*Y行。笛卡儿积连接的特殊之处在于,如果它不使用where子句指定查询条件,那么它就返回多个表的全部记录。 语法

P.S.

在Oracle中,笛卡儿积连接有两种写法:一种是使用英文逗号(,)隔开,另一种是使用cross join关键字。下面两种写法是等价的。

 

笛卡尔积连接返回左表的每一行与右表的每一行的所有可能组合,通常不推荐使用,除非你确实需要这种类型的数据组合。在实际应用中,笛卡尔积很少直接使用,因为它会生成大量数据, 在Oracle中,笛卡儿积连接中经常是“犯错”的一个结果,一般情况下,要求的数据是一对一或是一对多,结果由于条件的不足,导致了查询结果的错误(也就是数据量更多了

 
 

在SQL中,还有一种很特殊的多表连接方式——自连接。在自连接时,连接的两张表是同一张表,然后我们一般需要通过起一个别名来进行区分。 语法

注意事项

 
 

索引是建立在数据表中列上的一个数据库对象,在一个表中可以给一列或者多列设置索引。如果在查询数据时,使用了设置的索引列作为查询列,那么就会大大提高查询速度。

在SQL中,我们可以使用create index语句来创建一个索引。需要注意的是,我们只能对表进行创建索引,而不能对视图进行创建索引。 语法

【常见问题】

 
 

在SQL中,我们可以使用show index语句来查看一个索引的基本信息。 语法

在SQL中,我们可以使用drop index语句来删除一个索引。 语法