首页 > 数据库 >32. SQL--join:联合表

32. SQL--join:联合表

时间:2022-09-01 13:56:27浏览次数:72  
标签:00 join -- 32 表中 id SQL 连接

1. 前言

Join 是“连接”的意思,顾名思义,SQL JOIN 子句用于将两个或者多个表联合起来进行查询。

联合表时需要在每个表中选择一个字段,并对这些字段的值进行比较,值相同的两条记录将合并为一条。联合表的本质就是将不同表的记录合并起来,形成一张新表。当然,这张新表只是临时的,它仅存在于本次查询期间。

数据库中的表可以通过键将彼此联合起来,一个典型的例子是,将一个表的主键和另一个表的外键进行匹配。在表中,每个主键的值都是唯一的,这样做的目的是在不重复每个表中所有记录的情况下,将表之间的数据交叉捆绑在一起。

2. 语法

使用 SQL JOIN 连接两个表的基本语法如下:

select table1.column1, table2.column2...
from table1
join table2
on table1.common_column1 = table2.common_column2;

table1.common_column1 = table2.common_column2 是连接条件,只有满足此条件的记录才会合并为一行。您可以使用多个运算符来连接表,例如 =、>、<、<>、<=、>=、!=、between、like 或者 not,但是最常见的是使用 =。

当两个表中有同名的字段时,为了帮助数据库引擎区分是哪个表的字段,在书写同名字段名时需要加上表名,表名和字段名以点号.分隔,如下所示:

table_name.column_name

当然,如果书写的字段名在两个表中是唯一的,也可以不使用以上格式,只写字段名即可。

3. 示例

现在有以下两个表,分别是客户表和订单表。

表1:CUSTOMERS 表

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

表2:ORDERS 表

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

下面使用 SQL JOIN 语句连接连个表:

sql> select id, name, age, amount
     from customers
     join orders
     on  customers.id = orders.customer_id;

执行结果:

+----+----------+-----+--------+
| ID | NAME     | AGE | AMOUNT |
+----+----------+-----+--------+
|  3 | kaushik  |  23 |   3000 |
|  3 | kaushik  |  23 |   1500 |
|  2 | Khilan   |  25 |   1560 |
|  4 | Chaitali |  25 |   2060 |
+----+----------+-----+--------+

如果您不希望选取表的所有记录,也可以加上where子句,如下所示:

sql> select  id, name, amount, date
     from customers
     join orders
     on customers.id = orders.customer_id;
     where amount >1515
     order by amount;

执行结果:

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
|  2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|  4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
|  3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
+----+----------+--------+---------------------+

on 和 where 的区别
连接表时,sql 会根据连接条件生成一张新的临时表。on 就是连接条件,它决定临时表的生成。where 是在临时表生成以后,再对临时表中的数据进行过滤,生成最终的结果集,这个时候已经没有 join-on 了。

sql 先根据 on 生成一张临时表,然后再根据 where 对临时表进行筛选。

SQL 允许在 JOIN 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示:

连接类型说明
inner  join (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。
left  join 返回左表中的所有行,即使右表中没有满足条件的行也是如此。
right join 返回右表中的所有行,即使左表中没有满足条件的行也是如此。
full  join 只要其中有一个表存在满足条件的记录,就返回行。
self  join 将一个表连接到自身,就像该表是两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。
cross join 交叉连接,从两个或者多个连接表中返回记录集的笛卡尔积。

 

如果不加任何修饰词,只写 join,那么默认为 inner joiin,上面例子中就是如此。

在以上几种连接方式中,inner join、left join、right join、full join 是最常使用的连接方式,掌握它们是学好 sql 的必备基础,下面我们借助示意图来加深读者对这几种连接方式的理解。

标签:00,join,--,32,表中,id,SQL,连接
From: https://www.cnblogs.com/jiajunling/p/16646241.html

相关文章

  • Effective+STL中文版 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1DtuK7p34cq0KOxcQFj7AEA点击这里获取提取码Effective+STL中文版,世界级C++大师ScottMeyers之Effective三部曲之一,中国C++技......
  • FreeRTOS
    FreeRTOS新建模板小书匠一、任务1.任务状态2.中断2-1.三个重点寄存器2-2.临界区代码3.任务创建与使用3-1.创建任务3-1-1.常用宏定义3-2.退出任务3-3.开启任务调......
  • etcd技术内幕 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/10o1Ka3pNhTLrcLf6wPgF9Q点击这里获取提取码 etcd是一个可靠的分布式KV存储产品,由CoreOS公司开发,其底层使用Raft算法保证一......
  • 细数实现全景图VR的几种方式(panorama/cubemap/eac)
    Three.js系列:在元宇宙看电影,享受VR视觉盛宴Three.js系列:造个海洋球池来学习物理引擎Three.js系列:游戏中的第一、三人称视角Three.js系列:数实现全景图VR的几......
  • webpack打包
    什么是webpack?本质上,webpack是一个现代JavaScript应用程序的静态模块打包器(modulebundler)。当webpack处理应用程序时,它会递归地构建一个依赖关系图(dependency......
  • 【Socket / Grizzly】Grizzly TCP Server & Client
    SimpleTCPServerimportorg.glassfish.grizzly.Connection;importorg.glassfish.grizzly.filterchain.Filter;importorg.glassfish.grizzly.filterchain.FilterChai......
  • 杂题list5
    1/10ARC124EPassToNext【计数】【TO】https://blog.csdn.net/qq_42101694/article/details/120817682......
  • hive命令数据导入与导出
    数据导入●本地文件导入--本地文件导入(local)LOADDATAlocalINPATH'/home/hadoop/sourceA.txt'INTOTABLEtestAPARTITION(create_time='2015-07-08'); ●H......
  • 如何在bat中进入虚拟环境
    很多情况下我们希望在项目中建立一个build.bat用于项目的自动构建,避免每次构建时都需要手动在控制台中输入命令。例如对于pyinstall的项目,只需要如下的实现:pyinstaller......
  • 博客如何能实现直接粘贴把图片上传到服务器中
    ​ 百度ueditor新增的将word内容导入到富文本编辑框的功能怎么没有啊,...ueditor实现word文档的导入和下载功能的方法:1、UEditor没有提供word的导入功能,只能说是粘贴复......