SQL进阶3

news2024/11/30 12:53:42

二、多表连结

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 on
     on 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.coloradmin.cn/o/1391969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种引入CSS的方式

文章目录 CSS基础知识概述CSS的注释CSS的格式 三种引入CSS的方式内嵌式外链式行内式优先级 CSS基础知识 概述 Cascading Style Sheet 层叠样式表 前端三大基础之一(Html结构 CSS样式 JS动作) 最早由网景公司&#xff08;Netscape&#xff09;提出&#xff0c;在1996年受到w…

介绍 sCrypt:BTC 的 Layer-1 智能合约框架

在 TypeScript 中开发 BTC 智能合约 我们非常高兴地推出 sCrypt&#xff1a;一种现代 Typescript 框架&#xff0c;用于在 BTC 上开发第一层智能合约&#xff0c;无需分叉。 现在&#xff0c;人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合…

leetcode—搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

Android studio第一次构建项目Gradle失败的解决方法

每次在AS上新创建一个项目&#xff0c;gradle要下载半天或者是直接下载半天后以失败告终&#xff0c;抓狂并崩溃。 原因&#xff1a; 这是因为AS默认去下载gradle的网站是在国外的&#xff0c;而且国内的网络经常是访问不到那个网站的&#xff0c;能访问到有时候就跟中大奖一…

Docker之网络配置的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之网络配置的使用》。&#x1f3af;&…

鼠害监测站特点有哪些

【TH-SH2】草原鼠害智能监测设备是一种利用先进的传感技术来准确捕获鼠患行为的设备&#xff0c;它能够实时报警并迅速采取有效措施以遏制草原灾变&#xff0c;从而保障草原生态平衡并维护生态环境的可持续发展。这种系统融合了机器视觉、模式识别、大数据和深度学习等技术&…

网站高可用架构设计基础

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、网站高可用概述 不要尝试着去避免故障&#xff0c;而是要把处理故障的代码当成正常的功能做在架构里写在代码里。 高可用是一种面向风险设计&a…

if单分支,二分支,多分支,语句嵌套,while语句,for语句(Python实现)

一、主要目的&#xff1a; 1&#xff0e;熟悉程序设计结构的三种方式 2.掌握if单分支语句、if二分支语句、if多分支语句及if语句嵌套的使用方法 3.掌握while语句的使用方法 4.掌握for语句的使用方法 5.掌握循环嵌套的使用方法 二、主要内容和结果展现&#xff1a; 1&…

Angular系列教程之管道

文章目录 管道的基本概念使用内置管道创建自定义管道总结 在Angular中&#xff0c;管道&#xff08;Pipe&#xff09;是一个非常重要的概念。它们允许我们对数据进行转换、格式化和显示&#xff0c;并且可以轻松地在模板中使用。本篇文章将介绍Angular中的管道概念&#xff0c;…

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…

财务分析要使用PowerBI,VBA,Python,学习那个可以对财务工作更加有益?

1.简要分析几款工具的特点 &#xff08;1&#xff09;PowerBI&#xff1a;微软开发的一款商业智能工具&#xff0c;主要用于数据可视化、报表制作和数据分析。 &#xff08;2&#xff09;VBA&#xff1a;Excel中的一种宏编程语言&#xff0c;用于自动化Excel操作和开发自定义…

使用R从高程相对坐标数据生成tif图层的详细方法及代码

要将区域地理高程数据转化为图层&#xff0c;您可以使用R语言中的一些地理信息系统&#xff08;GIS&#xff09;库和工具。以下是一个简单的步骤&#xff0c;使用raster包来生成tif图层&#xff0c;假设您已经有了高程相对坐标数据。 安装和加载必要的R包&#xff1a; instal…

1、node.js安装

文章目录 node.js下载及安装node.js安装验证node执行js代码 node.js下载及安装 https://nodejs.org/en 访问官网&#xff0c;下载LTS版本 下载完成后&#xff0c;双击安装&#xff0c;安装过程基本不用动什么&#xff0c;包括盘符也尽量不要改。 node.js安装验证 cmd运行nod…

论文阅读 Self-Supervised Burst Super-Resolution

这是一篇 ICCV 2023 的文章&#xff0c;主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务&#xff0c;这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据&#xff0c;而且模…

C#,字符串匹配(模式搜索)Boyer Moore算法的源代码

Boyer Moore 算法是字符串匹配&#xff08;模式搜索&#xff09;的主要高效算法之一。 Boyer-Moore&#xff08;BM&#xff09;算法被认为最高效的字符串搜索算法&#xff0c;它由Bob Boyer和J Strother Moore于1977年设计实现。通常情况下&#xff0c;Boyer Moore 算法比KMP算…

【MIdjourney】几种独特的艺术风格

1.合成器波(Synthwave) Synthwave是一种音乐风格&#xff0c;起源于20世纪80年代电子音乐和电影的复古元素。这种音乐风格通常包括合成器音乐、电子鼓声和强烈的电子声效&#xff0c;以模拟80年代电影和视频游戏的声音。Synthwave的特点包括浓厚的合成器声音、强烈的节奏和对复…

2024年10大指纹浏览器推荐,不踩雷浏览器盘点

跨境安全离不开纯净代理与指纹浏览器的强强结合。在过去一年&#xff0c;IPFoxy纯净代理配合各大指纹浏览器完成了数千跨境账号的安全防护与高速浏览活动。结合广大用户真实体验与反馈&#xff0c;为大家盘里2024年最值得选择的十大指纹浏览器&#xff01; 1、AdsPower AdsPo…

postman案例

一、表单接口 基本正向 有效反向 无效反向 JSON接口 基本正向 有效反向 无效反向 文件上传接口 token 获取token值 一&#xff1a; 二&#xff1a; Bearer 获取的token的值&#xff0c;至于鉴权方式要根据swagger接口文档要求

医用一次性防护服行业研究:未来市场需求量继续巨大

目前&#xff0c;国标医用防护服生产大多采用环氧乙烷灭菌&#xff0c;但最大的缺点是需要很长时间通风以去除残留&#xff0c;整个灭菌时间较长&#xff0c;通常需要7-14天&#xff0c;而采用钴60或电子加速器辐照灭菌&#xff0c;无污染、无残留&#xff0c;不含有放射源&…

《计算机视觉处理设计开发工程师》

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…