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


INNER JOIN table_name ON condition

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

下面的SQL语句检索所有的客户姓名为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"

指定列所属的表后,我们就可以很轻松的引用同名的字段了,比如下面的SQL语句检索所有的订单以及它们对应的客户的相关信息:


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

内连接(INNER JOIN)的更多相关文章

  1. EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询

    场景:在实际的项目中使用EntityFramework都会遇到使用Ef处理连接查询的问题,这里做一些小例子如何通过Linq语法处理内连接(inner join).外连接(left/right oute ...

  2. 内连接INNER JOIN(三十四)

    内连接INNER JOIN 一.连接 MySQL的SELECT语句.多表更新.多表删除语句中支持JOIN操作. 语法结构 二.数据表参照 table_reference tbl_name [[AS] ...

  3. 数据库左连接left join、右连接right join、内连接inner join on 及 where条件查询的区别

    join on 与 where 条件的执行先后顺序: join on 条件先执行,where条件后执行:join on的条件在连接表时过滤,而where则是在生成中间表后对临时表过滤 left joi ...

  4. mysql数据库多表查询where与内连接inner join的区别

    按理说where是对前面的笛卡尔积进行过滤,工作量大增,inner join则不会.但我实际测试了一下,两种查询耗时基本相等,甚至where还快一些,多次测试后基本如此. 如下图: where: in ...

  5. SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)

    SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有 ...

  6. oracle 内连接(inner join)、外连接(outer join)、全连接(full join)

    转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...

  7. my sql 下左连接 右链接、内连接等应用,INNER JOIN LEFT JOIN RIGHT JOIN

    1.数据准备 建两个表格: create table student (idstu int, namestu ) ); ,"张三")(,"李四"),(,&quo ...

  8. mysql求交集:UNION ALL合并查询,inner join内连接查询,IN/EXISTS子查询

    两个要求交集的表(列)的结构要一致,对应的字段数,字段类型都应该相同:将两个数据的数据列用 UNION ALL 关键字合并:将上面的所有需要比较的列 GROUP BY :最后 HAVING COUNT ...

  9. 关于SqlServer的内连接,外链接以及left join,right join之间的一些问题与区别。

    就我个人理解通俗点来说内连接和外连接区别: 内连接 inner join或者 join (被默认为内连接) : 内连接的原理是:先进行语句判断和运行得出结果,然后在将结果连接起来,一般是横着连接. 外 ...

  10. sql 内连接和外链接

    如表     -------------------------------------------------     table1 | table2 |     ----------------- ...

随机推荐

  1. 常用模块(string)

    import string# dt = string.digits # 获取0-9的数字# dt = string.ascii_letters # 获取所有的大小写字母# dt = string.he ...

  2. 数据结构与算法之顺序表C语言实现

    顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...

  3. ACM基础算法入门及题目列表

    对于刚进入大学的计算机类同学来说,算法与程序设计竞赛算是不错的选择,因为我们每天都在解决问题,锻炼着解决问题的能力. 这里以TZOJ题目为例,如果为其他平台题目我会标注出来,同时我的主页也欢迎大家去访 ...

  4. cmd中神奇的命令 prompt $g

    万万没想到还可以这么玩 将java文件编译为class以后可以这样直接运行 java A<1.txt 就相当于把1.txt中的内容以模拟输入的方式输入到java中 java A>1.txt ...

  5. 2151: 种树 - BZOJ

    Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度 ...

  6. [Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)

    A: 题目大意:给你一个数字串,每个数字只可以用一次,求最多可以组成多少个电话号码(可以相同),电话号码第一个数字为$8$,且长度为$11$ 题解:限制为$8$的个数和总长度,直接求 卡点:无 C++ ...

  7. [bzoj3514][CodeChef GERALD07] Chef ans Graph Queries [LCT+主席树]

    题面 bzoj上的强制在线版本 思路 首先可以确定,这类联通块相关的询问问题,都可以$LCT$+可持久化记录解决 用LCT维护生成树作为算法基础 具体而言,从前往后按照边的编号顺序扫一遍边 如果这条边 ...

  8. 树(tree)

    树(tree) 题目描述 小明正在研究一种砍树游戏.一开始在W列H行的方格上,每一个格子都长着一颗树,格子的行从北到南依次编号,格子的列从西到东依次编号. 小明会砍倒一些树,每砍倒一颗树,树会占据这个 ...

  9. 牛客小白月赛4——H-相邻的糖果

    链接:https://www.nowcoder.com/acm/contest/134/H来源:牛客网 题目描述 有n个盒子摆成一排,每个盒子内都有ai个糖果. 现在你可以执行以下操作: ·你可以选择 ...

  10. shell面试经典70例

    转载自:http://www.imooc.com/article/1131 1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1. ...