SQL进阶3

二、多表连结

1、什么叫联结

下面,我们举个例子来说明:

        学校的安排的课程信息,我们平时都会为主要人员负责的对应课程信息创建表格,让其更好地检索得到对应数据信息。学生可以查到自己本身的课程信息,而老师也可以查到自己负责对应的课程信息。这两个表之间会有课程信息的关联。一般来说,我们将这些有关联的表,都称之为“关系表”。

        如果,这时我们需要同时查询到课程信息和对应的教师信息,就要使用到联结

联结可以在使用一条select语句中关联到多个表,然后返回我们所需要的一组数据信息。

 2、创建联结

为了更好地展示,我们先创建两个表---课程表和教师表。 

课程表(courses):

列名类型注释
idint unsigned主键
namevarchar课程名称
student_countint学生总数
created_atdate创建课程时间
teacher_idint讲师 id

 课程表 courses 的数据:

+----+-------------------------+---------------+------------+------------+
| id | name                    | student_count | created_at | teacher_id |
+----+-------------------------+---------------+------------+------------+
|  1 | Senior Algorithm        |           880 | 2020-06-01 |          4 |
|  2 | System Design           |          1350 | 2020-07-18 |          3 |
|  3 | Django                  |           780 | 2020-02-29 |          5 |
|  4 | Web                     |           340 | 2020-04-22 |          4 |
|  5 | Big Data                |           700 | 2020-09-11 |          1 |
|  6 | Artificial Intelligence |          1660 | 2018-05-13 |          3 |
+----+-------------------------+---------------+------------+------------+

教师表(teachers): 

列名类型注释
idint主键
namevarchar讲师姓名
emailvarchar讲师邮箱
ageint讲师年龄
countryvarchar讲师国籍

 教师表teachers的数据:

+------+------------------+---------------------------+------+---------+
|  id  | name             | email                     | age  | country |
+------+------------------+---------------------------+------+---------+
| 1    | Eastern Heretic  | eastern.heretic@gmail.com | 20   | UK      |
| 2    | Northern Beggar  | northern.beggar@qq.com    | 21   | CN      |
| 3    | Western Venom    | western.venom@163.com     | 28   | USA     |
| 4    | Southern Emperor | southern.emperor@qq.com   | 21   | JP      |
| 5    | Linghu Chong     | NULL                      | 18   | CN      |
+------+------------------+---------------------------+------+---------+

 根据两个表之间的信息找到相关联的条件:

teachers.id=courses.teacher_id;

根据相关联的条件,然后我们在使用select语句和join连接子句的语法对返回的数据信息查询。下面我先说明,join连接子句语法到底是怎么样的使用条件。

3、JOIN连接子句 

JOIN连接子句用于将数据库中两个或者两个以上表中的记录组合起来。

(1)INNER JOIN(内连接) 

        又被称为“等值连接”。 

        如果表中至少有一个匹配,则返回行。 简单来说,内连接就是取两个表的交集,返回的结果就是连接的两张表中都满足条件的部分。

 

 例子:

 查询课程表中的课程名称以及教师表中上的对应课程的教师名。

select c.name,t.name
from courses c
inner join teachers t on c.teacher_id=t.id;

courses c 等同于courses AS c ,给courses表取别名为c;

teachers t等同于teachers AS t,给teachers表取别名为t;

inner join也可写作join。(inner可以省略不写)

执行输出结果:

+----+-------------------------+------------------+
| id | course_name             | teacher_name     |
+----+-------------------------+------------------+
|  1 | Senior Algorithm        | Southern Emperor |
|  2 | System Design           | Western Venom    |
|  3 | Django                  | NULL             |
|  4 | Web                     | Southern Emperor |
|  5 | Big Data                | Eastern Heretic  |
|  6 | Artificial Intelligence | Western Venom    |
+----+-------------------------+------------------+

(2)OUTER JOIN (外连接)  

左/右/全外连接--语法: 

select column1_name,column2_name,...,column3_name
from table1_name
left / right /full join table2_name
on condition;---进行匹配的条件
1.LEFT JOIN(左连接) 

         右边的表中的数据信息没有匹配,返回左边表的所有行。简单来说,就是左外连接的结果是以左表(table1)中的所有记录为主,当右表(table2)中没有匹配的记录时,left join仍然返回行记录,只是该行的左表字段有值,右表字段用NULL填充。

返回左表中的所有记录,具体有分为以下的三种情况: 

1、如果左表中的某条记录在右表中刚好只有一条记录可以匹配,那么返回的结果中会生成新的行。 

2、如果左表中的某条记录在右表中有N条记录可以匹配,那么在返回结果中也会生成N行新的数据信息,这些数据信息包含左表中的字段会有重复。 

3、如果左表中的某条记录在右表中没有匹配的记录,那么在返回结果中就会生成新的行,但是生成新的行的字段值都是NULL。 

语法:
select table1.column1, table2.column2...
from table1
left join table2
on table1.common_column1 = table2.common_column2;--两个表的连接条件

 以上 SQL 语句将产生左表 (table1) 的全集,而右表( table2 )中匹配的则有值,不能匹配的则以 NULL 值取代,如下图所示:

 

 例子:查询所有的在校教师姓名及其所教课程的名称。(teachers作为左表,courses作为右表)

select c.name as courses_name,t.name as teacher_name
from teachers t
left join courses c onon c.teacher_id=t.id;

执行输出的结果:

+------------------------+--------------------+
|  course_name           | teacher_name       |
+------------------------+--------------------+
| Big Data	             |Eastern Heretic     |
| Data Analysis          |Eastern Heretic     |
| Dynamic Programming	 |Eastern Heretic     | 
| NULL	                 |Northern Beggar     |
| System Design          |Western Venom       |
| Django	             |Western Venom       |
| Artificial Intelligence|Western Venom       |
| Java P6+	             |Western Venom       |
| Senior Algorithm	     |Southern Emperor    |
| Web	                 |Southern Emperor    |
| Object Oriented Design |Southern Emperor    |
| NULL	                 |Linghu Chong        |
+------------------------+--------------------+
2.RIGHT JOIN(右连接) 

         左边的表中的的数据信息没有匹配,返回右边表的所有行。

        右连接和左连接的实现结果是相对的。同以上的左连接的讲述。

语法:
select table1.column1, table2.column2...
from table1
right join table2
on table1.common_column1 = table2.common_column2;

 以上 SQL 语句将产生 table2 的全集,而 table1 中匹配的则有值,不能匹配的则以 NULL 值取代,如下图所示:

 

 例子:查询教师名称,邮箱以及所教课程名称,课程名称的字段以courses_name作为输出,教师名称的字段以teacher_name作为输出,教师邮箱的字段以teacher_email作为输出。(“teachers”作为右表,“courses”作为左表)

select c.name as courses_name,t_name as teacher_name,t.email as teacher_email
from courses c
right join teachers t on c.teacher_id=t.id;

 执行输出的结果:

+------------------------+----------------------+---------------------------+
|  course_name           | teacher_name         | teacher_email             |
+------------------------+----------------------+---------------------------+
| Dynamic Programming	 | Eastern Heretic	    | eastern.heretic@gmail.com |
| Data Analysis   	     | Eastern Heretic	    | eastern.heretic@gmail.com |
| Big Data   	         | Eastern Heretic	    | eastern.heretic@gmail.com |
| Dynamic Programming    | Northern Beggar	    | northern.beggar@qq.com    |
| Java P6+	             | Western Venom	    | western.venom@163.com     |
| Artificial Intelligence| Western Venom	    | western.venom@163.com     |
| Django	             | Western Venom	    | western.venom@163.com     |
| System Design	         | Western Venom	    | western.venom@163.com     |
| Object Oriented Design | Southern Emperor	    | southern.emperor@qq.com   |
| Web	                 | Southern Emperor	    | southern.emperor@qq.com   |
| Advanced Algorithms	 | Southern Emperor	    | southern.emperor@qq.com   |
| NULL	                 | Linghu Chong	        | NULL                      |
+------------------------+----------------------+---------------------------+

(3)FULL JOIN(全连接) 

        只要其中的一个表中存在匹配,就返回所有行。 

        FULL JOIN 将左表(table1)和右表(table2)中的所有记录,相当于LEFT JOIN 和RIGHT JOIN的叠加。FULL JOIN先执行LEFT JOIN遍历左表,后执行RIGHT JOIN遍历右表,最后RIGHT JOIN 的结果直接放到LEFT JOIN后面。但是,FULL JOIN的输出结果会有重复记录的存在。 

SQL Sever语法:
select column1_name,column2_name,...,columnn_name
from table1
full join table2
on table1.common_column1=table2.common_column2;

以上 SQL 语句将产生 table1 和 table2 的并集,如下图所示:

 

 例子:查询课程名称和对应的授课教师年龄。

select c.name as courses_name,t.age as teacher_age
from courses c
full join teachers t
on c.teacher_id=t.id;

执行输出的结果:

+------------------------+---------------+
|  course_name           | teacher_age   | 
+------------------------+---------------+
| Advanced Algorithms	 | 21            | 
| System Design	         | 28            | 
| Django                 | 28            | 
| Web Southern	         | 21            |  
| Big Data	             | 20            |  
| Artificial Intelligence| 28            | 
| Java P6+	             | 28            |  
| Data Analysis Eastern	 | 20            |  
| Object Oriented Design | 21            |  
| Dynamic Programming	 | 20            |  
| Linghu Chong 	         | 18            | 
| NULL	                 | 21            |  
| NULL	                 | 18            |  
+------------------------+---------------+

(4) SELF JOIN (自连接)

很明确,一个表和自己自身进行连接。连接的表需要进行重命名,表和连接的表都独立存在。

 自连接通常用于将表的某个字段与该表的同一字段的其它值进行比较。

语法: 

select a.column1,b.column1...
from table1 as a,table1 as b
where a.commom_column < b.common_column;

 注意:

SELF JOIN 连接是通过WHERE子句达成自连接的目的。

例子:查询比某个课程的教师的年龄大的其他所有的教师.

select a.id,a.name,b.name as teacher_name,a.age,b.age as teacher_age
from teachers as a,teachers as b
where a.age > b.age;

执行输出的结果: 

+----------+------------------+------------+-------------------+--------------+
|    id    |      name        |    age     |   teacher_name    |  teacher_age |
+----------+------------------+------------+-------------------+--------------+
|    5     |  Linghu Chong    |    18      | Eastern Heretic   |     20       |
+----------+------------------+------------+-------------------+--------------+
|    5     |  Linghu Chong    |    18      | Northern Beggar   |     21       |
+----------+------------------+------------+-------------------+--------------+
|    5     |  Linghu Chong    |    18      | Western Venom     |     28       |
+----------+------------------+------------+-------------------+--------------+
|    5     |  Linghu Chong    |    18      | Southern Emperor  |     21       |
+----------+------------------+------------+-------------------+--------------+
|    1     | Eastern Heretic  |    20      | Northern Beggar   |     21       |
+----------+------------------+------------+-------------------+--------------+
|    1     | Eastern Heretic  |    20      | Western Venom     |     28       |
+----------+------------------+------------+-------------------+--------------+
|    1     | Eastern Heretic  |    20      | Southern Emperor  |     21       |
+----------+------------------+------------+-------------------+--------------+
|    2     | Northern Beggar  |    21      | Western Venom     |     28       |
+----------+------------------+------------+-------------------+--------------+

从执行结果可以发现,SELF JOIN 以右表为主,它先将左表中的每一行与右表中的第一行进行比较,然后再将左表中的第一行与右表中的第二行进行比较,以此类推,直到右表的最后一行。 

(5) CROSS JOIN(交叉连接/笛卡尔积

        两个表的数据 一 一 对应,返回的结果行数等于两个表行数的乘积。 

        CROSS JOIN 称为“交叉连接”或者“笛卡尔连接”。SQL CROSS JOIN 连接用于从两个或者多个连接表中返回记录集的笛卡尔积,即将左表的每一行与右表的每一行合并。

什么是笛卡尔积?

笛卡尔积(Cartesian product)是指两个集合 A 和 B 的乘积。

例如,A 集合和 B 集合分别包含如下的值:

A = {1,2}
B = {3,4,5}

A×B 和 B×A 的结果集分别表示为:

A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };

A×B 和 B×A 的结果就叫做两个集合的笛卡尔积。

从以上结果可以看出:

  • 笛卡尔积不满足交换率,即 A×B≠B×A。
  • 笛卡尔积的元素个数 = A 集合元素个数 × B 集合元素个数。

 语法:

         笛卡尔连接有两种语法,可以使用 CROSS JOIN 关键字,也可以使用不带 WHERE 子句的 SELECT FROM 命令,如下所示:

#第一种写法
select table1.column1, table2.column2...
from table1 cross join table2#第二种写法
select table1.column1, table2.column2...
from table1, table2

 根据以上所述,我们举个例子来简单说明,

 以下有两个表:

 客户表(A):

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

 订单表(B): 

+-----+---------------------+-------------+--------+
|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 |
+-----+---------------------+-------------+--------+

然后现在我们用cross join连接子句的语法,将所要的结果进行返回。

查询客户表的序号和客户名称以及订单花费和订单日期。

select ID,NAME,AMOUT,DATE
from customers
cross join orders
on customers.ID=orders.customer_ID;

或者 

select ID,NAME,AMOUT,DATE
from customers
cross join orders
where customers.ID=orders.customer_ID;

执行输出得到的结果: 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/410063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具&#xff0c;主要用于游戏艺术创作。它提供了一套全面的功能&#xff0c;旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力&#xff0c;允许用户根据独特的风格和艺术方向训…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多&#xff0c;比如通过Jenkins&#xff0c;通过Gitlab Runner等&#xff0c;今天主要介绍后者。Gitlab在安装的时候&#xff0c;就默认包含了Gitlab CI的能力&#xff0c;但是该能力只是用于协调作业&#xff0c;并不能真的去执行…

docker安装部署Elasticsearch(ES)以及相关配置

Elasticsearch简介 mysql用作持久化存储&#xff0c;ES用作检索 基本概念&#xff1a;index库>type表>document文档 index索引&#xff08;相当于MySQL的数据库&#xff09; 动词&#xff1a;相当于mysql的insert 名词&#xff1a;相当于mysql的db Type类型&#xff…

腾讯云的域名使用阿里云服务器配置

因为近期云服务器到期了&#xff0c;之前的域名已经完成了备案不想轻易回收。于是就换了个厂商&#xff0c;从腾讯云换到了阿里云。但是因为两个厂商不互通。我又不想把域名转入到阿里云。所以就开启了配置之路&#xff0c;一路磕磕绊绊。给大家整理一份顺序&#xff0c;一步到…

Error: error:0308010C:digital envelope routines::unsupported的解决方案

因为最近安装了pnpm对node版本有要求&#xff0c;升级了node版本是18以后&#xff0c;在运行之前的项目&#xff0c;就跑不起来了&#xff0c;报错如下&#xff1a; Error: error:0308010C:digital envelope routines::unsupported解决方案一&#xff1a; node版本切换到16版…

http跟https有什么区别?

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;是两种不同的通信协议&#xff0c;它们在数据传输的安全性方面有明显的区别&#xff1a; 1. 安全性&#xff1a; - HTTP&#xff1a;是一种明文传输协议&#xff0c;数…

SpringBoot+SSM项目实战 苍穹外卖(11) Apache ECharts

继续上一节的内容&#xff0c;本节学习Apache ECharts&#xff0c;实现营业额统计、用户统计、订单统计和销量排名Top10功能。 数据统计效果图&#xff1a; 目录 Apache ECharts入门案例 营业额统计用户统计订单统计销量排名Top10 Apache ECharts Apache ECharts 是一款基于 …

【实操】基于 GitHub Pages + Hexo 搭建个人博客

《开发工具系列》 【实操】基于 GitHub Pages Hexo 搭建个人博客 一、引言二、接入 Node.js2.1 下载并安装 Node.js2.2 环境变量配置 三、接入 Git3.1 下载并安装 Git3.2 环境变量配置 四、接入 Hexo4.1 安装 Hexo4.2 建站4.3 本地启动服务器 五、接入 GitHub Pages5.1 初识 G…

What is `addArgumentResolvers` does in `WebMvcConfigurer` ?

addArgumentResolvers 在SpringMVC框架中&#xff0c;主要用于向Spring容器注册自定义的参数解析器。在处理HTTP请求时&#xff0c;SpringMVC会使用这些参数解析器将请求中的数据&#xff08;如查询参数、路径变量、表单数据等&#xff09;转换并注入到控制器方法的参数中。 使…

.Net6使用SignalR实现前后端实时通信

代码部分 后端代码 &#xff08;Asp.net core web api&#xff0c;用的.net6&#xff09;Program.cs 代码运行逻辑&#xff1a; ​1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。 2. 使用 builder.Services.AddControllers() 添加 MVC 控…

Jmeter的文件参数化:CSV数据文件设置和_CSVRead函数

一、CSV数据文件设置 1、简介 CSV数据文件配置&#xff08;CSV Data Set Config&#xff09;可以将CSV文件中数据读入自定义变量中 Jmeter中CSV数据文件配置的界面如下图所示&#xff1a; 其中&#xff1a; &#xff08;1&#xff09;文件编码 文件的编码格式&#xff0c;与所…