六、SQL–表连接②(内连接)

作者: 小小一颗卤蛋 | 来源:发表于2020-04-28 12:27 被阅读0次

inner join:

内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接。
内连接的语法如下:

INNER JOIN table_name ON condition

其中table_name 为被关联的表名,condition则为进行连接时的条件。

如:检索所有的客户姓名为MIKE的客户的订单号以及订单价格:

SELECT FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM"

执行结果:

FNumber FPrice
K001 100.00
K002 200.00
T003 300.00
T001 300.00

在这个SQL 语句中,首先列出了组成结果集所需要的列名,而后则是在FROM 关键字后指定需要的表,在INNER JOIN关键字后指明要被连接的表,而在ON关键字后则指定了进行连接时所使用的条件。

由于T_Customer和T_Order表中都有名称为FId的列,所以在ON关键字后的条件中使用FId字段的时候必须显示的指明这里使用FId字段属于哪个表。

如:下面的SQL语句执行时,会报出“列名FId不明确”的错误信息:

SELECT FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= FId WHERE T_Customer.FName="TOM"

SELECT语句后的字段列表中不能存在有歧义的字段,如:下面的SQL语句执行会出错:

SELECT FId,FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM"

必须为FId字段显式的指定所属的表,修正后的SQL语句如下:

SELECT T_Order.FId,FNumber,FPrice FROM T_Order INNER JOIN T_Customer ON  FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM"

执行结果:

FId FNumber FPrice
1 K001 100.00
2 K002 200.00
3 T003 300.00
6 T001 300.00

为了避免列名歧义并且提高可读性,建议使用表连接时,要显式列所属的表,如下:

SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice FROM T_Order INNER JOIN T_Customer ON T_Order.FCustomerId= T_Customer.FId WHERE T_Customer.FName="TOM"

指定列所属的表后,就可以引用同名的字段了

如:检索所有的订单及它们对应的客户的相关信息:

SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice,T_Customer.FId,T_Customer.FName,T_Customer.FAge 
FROM T_Order INNER JOIN T_Customer ON T_Order.FCustomerId= T_Customer.FId

在大多数数据库系统中,INNER JOIN中的INNER是可选的,INNER JOIN是默认的连接方式。

即:下面的SQL语句同样可以完成和检索所有的订单以及它们对应的客户的相关信息的功能:

SELECT T_Order.FId,T_Order.FNumber,T_Order.FPrice,T_Customer.FId,T_Customer.FName,T_Customer.FAge
 FROM T_Order JOIN T_Customer
ON T_Order.FCustomerId= T_Customer.FId

执行结果:

FId FNumber FPrice FId FName FAge
1 K001 100.00 1 TOM 21
2 K002 200.00 1 TOM 21
3 T003 300.00 1 TOM 21
4 N002 100.00 2 MIKE 24
5 N003 500.00 3 JACK 30
6 T001 300.00 4 TOM 25

为了明确指定字段所属的表,上面的SQL语句中多次出现了T_Order、T_Customer,当字段比较多的时候这样的SQL语句看起来非常繁杂,所以可以使用表别名来简化SQL语句的编写

如:下面的SQL语句就与上面的SQL语句是等价的:

SELECT o.FId,o.FNumber,o.FPrice,c.FId,c.FName,c.FAge
 FROM T_Order o JOIN T_Customer c ON o.FCustomerId= c.FId

执行结果:

FId FNumber FPrice FId FName FAge
1 K001 100.00 1 TOM 21
2 K002 200.00 1 TOM 21
3 T003 300.00 1 TOM 21
4 N002 100.00 2 MIKE 24
5 N003 500.00 3 JACK 30
6 T001 300.00 4 TOM 25

表连接的使用不局限于连接两张表,也可以多表连接

如:检索每张订单的订单号、价格、客户姓名、订单类型等信息,由于客户信息和订单类型信息是保存在另外的表中的,因此需要同时连接T_Customer和T_OrderType两张表才能检索到所需要的信息,编写如下SQL语句即可:

INNER JOIN T_OrderType ON T_Order.FTypeId= T_OrderType.FId

执行结果:

FNumber FPrice FName FName
K001 100.00 TOM MarketOrder
K002 200.00 TOM MarketOrder
T003 300.00 TOM LimitOrder
N002 100.00 MIKE LimitOrder
N003 500.00 JACK StopLimit Order
T001 300.00 TOM Stop Order 

相关文章

  • 六、SQL–表连接②(内连接)

    inner join: 内连接组合两张表,并且基于两张表中的关联关系来连接它们。使用内连接需要指定表中哪些字段组成...

  • SQL常见面试题

    1、SQL的表连接方式有哪些?SQL中连接按结果集分为:内连接,外连接,交叉连接内连接:inner join on...

  • 2020-04-01

    连接两表 SOLUTION 输入 输出 解题思路SQL 连接类型SQL 中有多种不同的连接: 内连接(INNER ...

  • Oracle表连接学习笔记

    @[toc] 一、表连接类型 表连接类型可以分为:内连接、外连接,在看《收获,不止sql优化》一书并做了笔记 1....

  • 测试面试题五

    SQL的查询优化(1)从表连接的角度优化:尽量使用内连接,因为内连接是两表都满足的行的组合,而外连接是以其中一个表...

  • EF Core 备忘

    模糊查询sql linq 内连接查询sql linq 左连接查询sql linq 左连接查询(连接内带条件)sql...

  • 数据库七种连接方式总结

    一、join图 二、sql语句准备 部门表数据 三、七种连接方式详解 1、内连接 inner join 内连接in...

  • 六、SQL–表连接④(交叉连接)

    交叉连接 与内连接比起来,交叉连接非常简单,因为它不存在ON子句。交叉连接会将涉及到的所有表中的所有记录都包含在结...

  • 六、SQL–表连接⑥(外部连接)

    内部连接:要求组成连接的两个表必须具有匹配的记录,T_Order表中的数据如下: 使用内部连接可以查询每张订单的订...

  • 六、SQL–表连接⑤(自连接)

    自连接:参与连接的表为同一张表,即与自身连接。交叉连接、内连接、外连接等连接方式中只要参与连接的表是同一张表,那么...

网友评论

    本文标题:六、SQL–表连接②(内连接)

    本文链接:https://www.haomeiwen.com/subject/updvwhtx.html