sql之多表查询

笛卡尔乘积 :

	当一个连接条件无效或被遗漏时,其结果是一个笛卡尔乘积 (Cartesian product),其中所有行的组合都被显示。第一个表中的所有行连接到第二个表中的所有行。 
	一个笛卡尔乘积会产生大量的行,其结果没有什么用。你应该在 WHERE 子句中始终包含一个有效的连接条件,除非你有特殊的需求,需要从所有表中组合所有的行。 
	对于一些测试笛卡尔乘积是有用的,例如你需要产生大量的行来模拟一个相当大的数据量。 

多表查询(Displaying Data from Multiple Tables):

    JOIN:

       SQL 的连接(JOIN)语句将数据库中的两个或多个表组合起来,由"连接"生成的集合, 可以被保存为表, 或者当成表来使用. JOIN 语句的含义是把两张表的属性通过它们的值组合在一起.

    基于 ANSI 标准的 SQL 列出了四种 JOIN 方式: 内连接(INNER), 外连接(OUTER), 左外连接(LEFT), 右外连接(RIGHT).在特定的情况下, 一张表(基本表, 视图, 或连接表)可以和自身进行连接, 成为自连接(self-join).

内连接(inner join):

    一般都是默认的连接类型. 将两张表(如 A 和 B)的列组合在一起, 产生新的结果表. 查询会将 A 表的每一行和 B 表的每一行进行比较, 并找出满足连接词的组合. 当连接词被满足, A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行. 连接产生的结果集, 可以定义为首先对两张表做笛卡尔积(交叉连接) -- 将 A 中的每一行和 B 中的每一行组合, 然后返回满足连接谓词的记录. 实际上 SQL 产品会尽可能用其他方式去实现连接, 笛卡尔积运算是非常没效率的,可以进一步被分为: 相等连接, 自然连接, 和交叉连接.

 

	SQL 定义了两种不同语法方式去表示"连接". 首先是"显示连接符号", 它显式地使用关键字 JOIN, 其次是"隐式连接符号". 隐式连接符号把需要连接的表放到 SELECT 语句的 FROM 部分, 并用逗号隔开. 这样就构成了一个"交叉连接", WHERE 语句可能放置一些过滤谓词(过滤条件). 那些过滤谓词在功能上等价于显式连接符号.

 例如:

        下面的查询通过 Employee 表和 Department 表共有的属性 DepartmentID 连接两表. 在两表 DepartmentID 匹配之处(如连接谓词被满足), 查询将组合两表的 LastName, DepartmentID 和DepartmentName 等列, 把它们放到结果表的一行(一条记录)里. 当 DepartmentID 不匹配, 就不会往结果表中生成任何数据.

 

        --显式的内连接实例:
	select e.EmployeeId,e.LastName,d.部門,d.DepartmentId FROM Employee as e INNER JOIN Department as d ON e.DepartmentID = d.DepartmentId

 等价于:

select e.EmployeeId,e.LastName,d.部門,d.DepartmentId FROM Employee as e,Department as d where e.DepartmentID = d.DepartmentId

     相等链接 (equi-join, 或 equijoin):是比较连接的一种特例, 它的连接词只用了相等比较. 使用其他比较操作符(如 <)的不是相等连接.

        实例:

	--SQL 提供了一种可选的简短符号去表达相等连接, 它使用 USING 关键字:
	select e.EmployeeId,e.LastName,d.部門,d.DepartmentId FROM Employee as e INNER JOIN Department as d USING(DepartmentId)

     USING 结构并不仅仅是语法糖(指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。), 上面查询的结果和使用显式谓词得到的查询得到的结果是不同的. 特别地, 在 USING 部分列出的列(column)将以只出现一次, 且名称无表名修饰.在上面的例子中, 将产生单独的名为 DepartmentID 的列, 而不是 employee.DepartmentID 或 department.DepartmentID.

     自然连接: 自然连接比相等连接的进一步特例化. 两表做自然连接时, 两表中的所有名称相同的列都将被比较, 这是隐式的. 自然连接得到的结果表中, 两表中名称相同的列只出现一次.

--上面用于内连接的查询实例可以用自然连接的方式表示如下:
SELECT * FROM Employee NATURAL JOIN Department

用了 USING 语句后, 在连接表中, DepartmentID 列只出现一次, 且没有表名作前缀:

      在 Oracle 里用 JOIN USING 或 NATURAL JOIN 时, 如果两表共有的列的名称前加上某表名作为前缀, 则会报编译错误: "ORA-25154: column part of USING clause cannot have qualifier" 或 "ORA-25155: column used in NATURAL join cannot have qualifier".

     交叉连接(cross join): 又称笛卡尔连接(cartesian join)或叉乘(Product), 它是所有类型的内连接的基础. 把表视为行记录的集合, 交叉连接即返回这两个集合的笛卡尔积. 这其实等价于内连接的链接条件为"永真", 或连接条件不存在.

    用于交叉连接的 SQL 代码在 FROM 列出表名, 但并不包含任何过滤的连接谓词.

	--显式的交叉连接实例:
		SELECT * FROM   Employee CROSS JOIN Department
	--隐式的交叉连接实例:
		SELECT * FROM   Employee, Department

 外连接:

    外连接并不要求连接的两表的每一条记录在对方表中都一条匹配的记录. 连接表保留所有记录 -- 甚至这条记录没有匹配的记录也要保留. 外连接可依据连接表保留左表, 右表或全部表的行而进一步分为左外连接, 右外连接和全连接.(在这种情况下left<左> 和 right<右> 表示 JOIN 关键字的两边.)在标准的 SQL 语言中, 外连接没有隐式的连接符号.

左外连接:

    左外连接(left outer join), 亦简称为左连接(left join), 若 A 和 B 两表进行左外连接, 那么结果表中将包含"左表"(即表 A)的所有记录, 即使那些记录在"右表" B 没有符合连接条件的匹配. 这意味着即使 ON 语句在 B 中的匹配项是0条, 连接操作还是会返回一条记录, 只不过这条记录的中来自于 B 的每一列的值都为 NULL. 这意味着左外连接会返回左表的所有记录和右表中匹配记录的组合(如果右表中无匹配记录, 来自于右表的所有列的值设为 NULL). 如果左表的一行在右表中存在多个匹配行, 那么左表的行会复制和右表匹配行一样的数量, 并进行组合生成连接结果.

   如, 这允许我们去找到雇员的部门时, 显示所有雇员, 即使这个雇员还没有关联的部门. (在上面的内连接部分由一个相反的例子, 没有关联的部门号的雇员在结果中是不显示的).

        --左外连接实例: (相对于内连接增添的行用斜体标出)
	SELECT *  FROM   Employee  LEFT OUTER JOIN Department  ON Employee.DepartmentID = Department.DepartmentId 

 

右外连接:

       右外连接, 亦简称右连接, 它与左外连接完全类似, 只不过是作连接的表的顺序相反而已. 如果 A 表右连接 B 表, 那么"右表" B 中的每一行在连接表中至少会出现一次. 如果 B 表的记录在"左表" A 中未找到匹配行, 连接表中来源于 A 的列的值设为 NULL.右连接操作返回右表的所有行和这些行在左表中匹配的行(没有匹配的, 来源于左表的列值设为 NULL).

      例如, 这允许我们在找每一个雇员以及他的部门信息时, 当这个部门里没有任何雇员时, 也把部分显示出来.

--右连接的实例: (相对于内连接增添的行用斜体标出)
SELECT * FROM   Employee RIGHT OUTER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
--实际上显式的右连接很少使用, 因为它总是可以被替换成左连接--换换表的位置就可以了, 另外, 右连接相对于左连接并没有什么额外的功能. 上表同样可以使用左连接得到:
SELECT * FROM   Department LEFT OUTER JOIN Employee ON Employee.DepartmentID = Department.DepartmentID

全连接:

    全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以 NULL 填充.如, 这允许我们查看每一个在部门里的员工和每一个拥有雇员的部门, 同时, 还能看到不在任何部门的员工以及没有任何员工的部门.

    全连接实例:

SELECT *  FROM   Employee  FULL OUTER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
 
--一些数据库系统(如 MySQL)并不直接支持全连接, 但它们可以通过左右外连接的并集(参: union)来模拟实现. 和上面等价的实例:

SELECT *
FROM   Employee 
       LEFT JOIN Department 
          ON Employee.DepartmentID = Department.DepartmentID

SELECT *
FROM   Employee
       RIGHT JOIN Department
          ON Employee.DepartmentID = Department.DepartmentID
WHERE  Employee.DepartmentID IS NULL

 自连接:

    自连接就是和自身连接;

    构建一个查询, 它试图找到这样的记录: 每条记录包含两个雇员, 他们来自于同一个国家. 如果你有两张雇员表(Employee), 那么只要第一张表的雇员和第二张表的雇员在同样的国家的就行了, 你可以用一个通常的连接(相等连接)操作去得到这个表. 不过, 这里所有雇员信息都在一张但对大表里.

SELECT 
e.EmployeeId,
e.LastName,
e.DepartmentID,
e.Country,
f.EmployeeId,
f.LastName,
f.DepartmentID,
f.Country
FROM Employee f,Employee e
WHERE f.Country = e.Country
AND e.EmployeeId<f.EmployeeId
ORDER BY e.EmployeeId,f.EmployeeId;

 关于这个例子, 请注意:

    * F 和 S 是雇员表(employee)的第一个和第二个拷贝的别名
    * 条件 F.Country = S.Country 排除了在不同国家的雇员的组合. 这个例子仅仅期望得到在相同国家的雇员的组合.
    * 条件 F.EmployeeID < S.EmployeeID 排除了雇员号(EmployeeID)相同的组合.
    * F.EmployeeID < S.EmployeeID 排除了重复的组合. 没有这个条件的话, 将生成类似下面表中的无用数据

 

替代方式
    外连接查询得到的结果也可以通过关联子查询得到. 例如:

SELECT 
e.LastName, 
e.DepartmentID,
Department.部門
FROM  Employee e 
LEFT OUTER JOIN Department
ON e.DepartmentID = Department.DepartmentId

 还可以这样:

SELECT 
e.LastName, 
e.DepartmentID,
(SELECT Department.部門 FROM Department
WHERE e.DepartmentID = Department.DepartmentId)
FROM  Employee e
 

 

 

SQL基础④ | 多表查询篇 本文是SQL基础第四篇,主要讲解多表查询(关联查询),涉及笛卡尔积的成因与解决,等值/非等值、自连接等分类,内/外连接的实现,以及SQL99语法等,内容详细,帮助零基础读者掌握多表数据关联查询的能力。 阅读详情

相关推荐

Tlsr8258开发-程序烧写

开源一小步,进步一大步

自学嵌入式 1774

SQL多表查询

概述:从多张表中进行数据查询例如:有以下两张表dept和emp:多表查询分类1、连接查询内连接:相当于查询A、B交集部分数据外连接:左外连接:查询左表所有数据,以及两张表交集部分数据(用的更多)右外连接:查询右表所有数据,以及两张表交集部分数据自连接:当前表与自身的连接查询,自连接必须使用表别名2、子查询。

weixin_45951205的博客 6287

Proteus仿真实战:ADC0832时序解析与51单片机精准电压采集

本文详细解析了ADC0832模数转换芯片在Proteus仿真环境中的时序控制与51单片机驱动实现。通过实战代码示例和精度优化技巧,帮助开发者掌握电压采集的关键技术,包括时序配置、数据校验和噪声抑制等核心要点,提升嵌入式系统设计的精准度与可靠性。

weixin_29172963的博客 873

SQL--多表查询

1). 删除之前 emp, dept表的测试数据2). 执行如下脚本,创建emp表与dept表并插入测试数据-- 创建dept表,并插入数据name varchar(50) not null comment '部门名称') comment '部门表';VALUES (1, '研发部'),(2, '市场部'),(3, '财务部'),(4,'销售部'),(5, '总经办'),(6, '人事部');-- 创建emp表,并插入数据。

Sakura_j_h_的博客 4255

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化

本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。

ooo22的博客 520

【SQL】SQL多表查询

一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。建立第三张中间表,中间表至少包含两个外键,分别关联两方主键,使用。在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的。一个学生可以选修多门课程,一门课程也可以供多个学生选择。4. 增加唯一约束,保证外键创建成功。来维护二者之间的关联关系。用户 与 用户详情的关系。

qq_45280097的博客 1158

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

sql中的多表查询

在SQL中,多表查询用于从多个表中组合数据,常见的方法包括 ​​ 和 ​。

m0_46322965的博客 2336

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 482

论文阅读:Universal and Transferable Adversarial Attacks on Aligned Language Models. LLM Attacks

因为“即开即用”的大型语言模型能够生成大量令人反感的内容,近期的工作集中在对这些模型进行对齐,以防止不受欢迎的生成。尽管在规避这些措施方面取得了一些成功——即所谓的针对大型语言模型(LLMs)的“越狱”——这些攻击需要大量的人类智慧,并且在实践中很脆弱。自动对抗性提示生成的尝试也取得了有限的成功。在本文中,我们提出了一种简单有效的攻击方法,可以导致对齐的语言模型生成令人反感的行为。

CSPhD-winston的博客 1418

三张表关联查询统计_SQL多表查询

真实的数据操作中,通常要获取的信息横跨多个表格,这个时候就要用到SQL多表查询,建立表格和表格的关联关系。一、表的加法即两张表加在一起。使用union 关键字,将两个表格查询的结果相加,在相加时会将重复的数据删除。如果想保留重复行,使用union all关键字,会将所有记录相加。如下图,清晰的显示两张课程表相加之后的结果。练习:合并两个表course和course1:SQL语句:运行结果:二、表的...

weixin_39631953的博客 1万+

Python爬虫实战:基于异步爬虫与机器学习的数据采集——以电商平台在线评论有用性分析为例

内容涵盖爬虫原理、反爬虫策略应对、数据清洗、数据存储以及简单的数据分析预览,并为后续利用机器学习模型(如逻辑回归、随机森林)分析评论有用性打下坚实的数据基础。特别是在电子商务领域,在线评论作为UGC的一种主要形式,深刻影响着消费者的购买决策和商家的信誉体系。然而,平台上的评论质量参差不齐,充斥着大量无意义的灌水、广告甚至虚假评论。因此,如何自动识别和筛选出“有用”的评论,成为了学术界和工业界共同关注的焦点。我们选择目前Python爬虫领域最前沿、效率最高的技术组合,以确保爬虫的稳定性、速度和可扩展性。

2201_76125261的博客 107

leftjoin多表联合查询_SQL 多表查询

本章主要讲解如果使用SQL进行多表查询,内容包括以下:一.表的加法二.表的联接三.联结应用案例四.case表达式一.表的加法,加法用union,会把重复的数据删除,重复的数据只保留一个2.表的加法如果用union all, 则会保留所有重复的行二.表的联结联结有以下5种联结方式 交叉联结 cross join 内联结 inner join 左联结 left join 右联结...

weixin_39715348的博客 9380

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

access多表查询sql语句_SQL:多表查询

一、集合运算集合运算:对满足同一规则的记录进行的加减等四则运算。UNION以行(纵向)为单位进行操作,而JOIN以列(横向)为单位进行操作。1.表的加法(UNION)两个表的结构相同,存放的数据不一样,可以使用表的加法将两个表的数据按行加在一起。集合运算会除去重复的记录。如果要在结果中保留重复行,只需要在UNION后面添加ALL关键字。ALL选项,在UNION之外的集合运算符中同样可以使用注意事项...

weixin_33886150的博客 5532

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SQL-多表查询

多表查询是数据库操作中不可或缺的一部分,通过合理使用连接查询和子查询,能够有效地提取和分析数据。理解多表关系及其查询方式,将有助于更高效地进行数据管理和分析。

Broken_x的博客 3270

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

sql-多表查询

sql语句中的多表查询,笔记语法,及实战训练

m0_72739216的博客 1498

MySQL-多表查询:多表查询分类、SQL99语法实现多表查询、UNION的使用、7种SQL JOINS的实现、SQL99语法新特性、多表查询SQL练习

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

小孔靠得住的博客 1525

sql多表查询

在关系型数据库中,数据通常会被拆分到多个表中(规范化设计),以减少数据冗余。​:当多表有同名字段时,必须指定表名前缀。​(包括未分配部门和未参与项目的员工)。​:为表或字段设置别名(会产生大量冗余数据。

不辉放弃的博客 1689

用SQL进行多表查询

    所谓多表查询是相对单表而言的,指从多个数据表中查询数据,这里我们主要学习从两个数据表中如何查询数据的方法。4.3.1 无条件多表查询    无条件多表查询是将各表的记录以“笛卡尔”积的方式组合起来。    如scott.dept表共有4条记录,scott.emp表共有14条记录,其“笛卡尔”积将有4*14=56条记录。    在【命令编辑区】执行下列语句。    ―――――――――――――

csdn 数据库频道技术资料 1893

SQL中的多表关联查询

一篇文章带你了解数据库SQL中的多表关联查询

m0_69371690的博客 2764

sql多表的查询介绍

sql多表的查询介绍 (1)初始化数据 (2)实际项目中,数据保存于多个表,如果需要的数据来自多个表,就要使用多表查询 (3)查询的分类 》1:交叉连接查询(了解) 》2:内连接查询 隐式内连接,显式内连接*** 》3:外连接查询 左外连接, 右外连接 》4:子查询 # 初始化数据 create database day13_3; use database day13_3; create table category ( cid int primary key , cname varchar(

水巷石子的博客 4576

(三)SQL 多表查询篇

文章包括多表关系介绍、多表查询、联合查询、子查询的介绍与应用!!!

smile_007996的博客 1550

SQL多表查询、连接查询

本文概述了数据库表间关系的三种主要类型:一对多、多对多和一对一,并介绍了多表查询的分类与方法。一对多关系通过外键实现,多对多需借助中间表,而一对一关系则用于单表拆分优化。多表查询包括连接查询(内连接、外连接、自连接)、联合查询和子查询。内连接查询交集数据,外连接包含单边所有数据,自连接则实现表与自身的关联。联合查询合并结果集,子查询嵌套在SQL语句中,可分为标量、列、行和表子查询。文章通过具体案例和SQL语法展示了各类查询的实现方式,为数据库设计提供了实用指导。

m0_73849719的博客 920

sql多表查询练习

/创建部门表/ CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(50), loc VARCHAR(50) ); /创建雇员表/ CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(50), job VARCHAR(50), mgr INT, hi...

从放弃到开始 6849
上一篇: 天真无罪
下一篇: 如何设计数据库表?
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值