首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《深入浅出SQL》问答录

A:外键为NULL,表示在父表中没有相符的主键。但我们可以确认外键包含有意义、已经存储在父表中的值,请通过约束实现。 不能单纯的使用另一张表的键,称之为外键,而不加上约束吗?...插入外键列的值必须已经存在与父表的来源中,这是引用完整性。 创建外键作为表的约束提供了明确的优势,如果违反了规则,约束会阻止我们破坏表。 外键不一定要是父表的主键,但是要具有唯一性。 ?...设计数据库模式 数据模式:一对一 在模式图中,一对一关系的连接线是单纯的实线,表示连接一件事物与另一件事物。 ? 使用一对一的时机 事实上,很少。 抽出数据或许能让你写出更快速的查询。...自然联接 属于内联接的一种。 自然联接只有在联接的列在两张表中的名称相同时才会用。 ?...UNION 还有一种取得多张表的查询结果的方式:UNION联合。 UNION根据我们在SELECT中指定的列,把两张表或更多张表的查询结果合并至一个表中。

2.9K50

【T-SQL基础】02.联接查询

查询语句的FROM字句在逻辑上是第一条要处理的字句,在FROM字句内可以用表运算符对输入的表进行操作。...当需要根据主键-外键关系来联接两个表而且主外键关系是组合的(即关系基于多个列)时,通常使用组合联接。...表A和表B进行JOIN关联,得到结果集AB,AB将作为第二个表运算符JOIN的输入,与表C进行JOIN关联,得到结果ABC,以此类推。...(2)外联接的第三个逻辑查询处理步骤就是要识别保留表中按照ON条件在另一个表找不到与之匹配的那些行,再把这些行添加到联接的前两个步骤生成的结果表中。...4.在多表联接中使用外联接 1.对外联接的处理顺序进行调整,可能会得到不同的输出结果,所以不能随意调整它们的顺序。

3K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入聊聊MySQL直方图的应用

    MySQL8开始支持直方图,但实际上直方图在MySQL中,不像在其他数据库中那样有用,因为MySQL能够通过index dive,直接访问索引对应的B+树,来计算某个扫描区间内对应的索引记录条数,所以直方图不能与同一列上的索引一起使用...与索引相比,直方图的一个好处是,在确定过滤条件返回行数时直方图比索引成本要低,直方图的统计信息可以轻松用于优化器,而索引在确定查询计划时,要执行下潜操作来估算行数,并且每次执行查询时都要重复执行这样的操作...既无索引又无直方图,优化器如何估算返回行数 如果过滤条件上既没有索引也没有直方图,优化器如何估算过滤比例呢,优化器会根据MySQL代码中内置的默认规则来估计过滤比例,相当于根据自己的想法瞎猜。...选择性差的列(否则索引可能是更好的选择) 用于在where子句或联接条件过滤表的数据。如果不对列进行过滤,则优化器无法使用直方图。 随着时间推移,数据分布逐渐稳定的列。直方图统计信息不会自动更新。...';两表在关联条件的字段上都有索引,又都有额外的过滤条件,优化器在选择走嵌套联接时,有两种可能,一种a1驱动a2,一种是a2驱动a1,哪种方式更好,取决于两表使用过滤条件过滤后哪个表返回的行数少,因为我们知道嵌套联接时

    1.2K60

    SQL高级查询方法

    子查询的例子可以参考笔试题中的例子,SQL笔试50题(上),SQL笔试50题(下) 4.9 联接 join 通过联接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。...联接条件可通过以下方式定义两个表在查询中的关联方式: 指定每个表中要用于联接的列。典型的联接条件在一个表中指定一个外键,而在另一个表中指定与其关联的键。...左向外部联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某一行在右表中没有匹配行,则在关联的结果集行中,来自右表的所有选择列表列均为空值。...由于各种联接的实际执行过程会采用多种不同的优化,因此无法可靠地预测。 联接的例子可以参考笔试题中的例子,SQL笔试50题(上),SQL笔试50题(下),在笔试题中有大量的内联接和左联接的例子。...CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。 CTE 可用于: 创建递归查询。

    5.7K20

    深入聊聊MySQL直方图的应用

    MySQL8开始支持直方图,但实际上直方图在MySQL中,不像在其他数据库中那样有用,因为MySQL能够通过index dive,直接访问索引对应的B+树,来计算某个扫描区间内对应的索引记录条数,所以直方图不能与同一列上的索引一起使用...与索引相比,直方图的一个好处是,在确定过滤条件返回行数时直方图比索引成本要低,直方图的统计信息可以轻松用于优化器,而索引在确定查询计划时,要执行下潜操作来估算行数,并且每次执行查询时都要重复执行这样的操作...既无索引又无直方图,优化器如何估算返回行数 如果过滤条件上既没有索引也没有直方图,优化器如何估算过滤比例呢,优化器会根据MySQL代码中内置的默认规则来估计过滤比例,相当于根据自己的想法瞎猜。...选择性差的列(否则索引可能是更好的选择) 用于在where子句或联接条件过滤表的数据。如果不对列进行过滤,则优化器无法使用直方图。 随着时间推移,数据分布逐渐稳定的列。直方图统计信息不会自动更新。...';两表在关联条件的字段上都有索引,又都有额外的过滤条件,优化器在选择走嵌套联接时,有两种可能,一种a1驱动a2,一种是a2驱动a1,哪种方式更好,取决于两表使用过滤条件过滤后哪个表返回的行数少,因为我们知道嵌套联接时

    74940

    浅谈数据库Join的实现原理

    如果关联字段有可用的索引,并且排序一致,则可以直接进行Merge Join操作;否则,SQL Server需要先对关联的表按照关联字段进行一次排序(就是说在Merge Join前的两个输入上,可能都需要执行一个...两个表都按照关联字段排序好之后,Merge Join操作从每个表取一条记录开始匹配,如果符合关联条件,则放入结果集中;否则,将关联字段值较小的记录抛弃,从这条记录对应的表中取下一条记录继续进行匹配,直到整个循环结束...在多对多的关联表上执行Merge Join时,通常需要使用临时表进行操作。...Probe(探测)阶段,SQL Server从probe input输入中取出每一行记录,同样将该行记录关联字段的值,使用build阶段中相同的hash函数生成hash值,根据这个hash值,从build...HASH:()谓词以及一个用于创建哈希值的列的列表出现在Argument列内。然后,该谓词为每个探测行(如果适用)使用相同的哈希函数计算哈希值并在哈希表内查找匹配项。

    5.4K100

    SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    DISTINCT即去重,如果不加DISTINCT则结果为表行数——5。 返回列合计值(SUM): 注:sum只要ALL与DISTINCT两种计数规范,无*。...别名在子查询及联接查询中的应用有着很好效果,当两张表有相同列名或者为了加强可读性,给表加上不同的别名,就能很好的区分哪些列属于哪张表。...还有种情况就是在子查询或联接查询时,主查询及子查询均为对同一张表进行操作,为主、子查询中的表加上不同的别名能够很好的区分哪些列的操作是在主查询中进行的,哪些列的操作是在子查询中进行的,下文会有实例说明。...通过上面两例,应该可以明白子查询在WHERE中嵌套的作用。通过子查询中返回的列值来作为比较对象,在WHERE中运用不同的比较运算符来对其进行比较,从而得到结果。...上文说过相关子查询不推荐使用,组合查询又用的少之又少,那需要关联的多张表我们怎么做? 这就是下一篇博文要详细说明的SQL的重点表联接、联接查询。

    5.1K30

    SQL语句汇总(终篇)—— 表联接与联接查询

    既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接。 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?...表联接的分类: 内联接: 内联接是指两个表中某一行相关的列值匹配时,这一行才会出现在表中。就像上例中s._fk与c._infor相同时才会出行该行,其他的行剔除。...外联接: 分为左外联接与右处联接。 外联接是指不管有没有匹配,被定义了外联接的表数据都要出现在结果中。比如左外联接,那么在JOIN左边的表就被定义为外联接,那么此表中所有数据都会出现在查询结果中。..._cname ); 这个有点凶残,用了两次表联接。括号内返回的是每个班的人数: ? 之后外部又使用了一次表联接,将每个班的人数与括号内的返回值逐一比较,得到最大值,然后找到最大值所在的班级。..._fk ); 本题中,括号内部返回一个学生表中的最小年龄,外部进行表联接后将年龄列对返回值进行比较,若小于等于返回的最小值那其本身也为最小值。 如果括号内部不加判断条件WHERE ss.

    1.4K10

    SQL命令 JOIN(一)

    联接提供了将一个表中的数据与另一个表中的数据链接起来的方法,并且经常用于定义报表和查询。 有几种表示联接的语法形式。首选形式是在SELECT语句中指定显式联接表达式作为FROM子句的一部分。...指定隐式联接以执行表与另一个表中的字段的左外联接;指定显式联接以联接两个表。这种隐式联接语法可以很好地替代显式联接语法,或者与显式联接语法一起出现在同一查询中。...相反,SQL优化器根据每个表的Tune Table数据(以及其他因素)确定表连接顺序。因此,在复杂SQL查询中使用表之前,必须先针对表运行调优表,这一点很重要。...JOIN 定义 IRIS支持多种不同的连接语法形式。但是,这许多公式涉及以下五种类型的联接。...但是,如果连接条件位于%EXACT字段值上,但只有排序字段值上的索引可用, IRIS可以使用该索引来限制要检查的行以获取准确值。

    2.2K20

    《深入浅出SQL》问答录(七)

    还有,交叉联接有时可用于RDBMS软件及其配置的运行速度。运行交叉联接所需的时间可以轻易的检测与比较出速度慢的查询。 ---- Q:内联接和交叉联接有什么区别吗?...A:交叉联接属于内联接的一种。内联接就是通过查询中的条件移除了某些结果的交叉联接。 ---- Q:可以联接多于两张表吗? A:可以,后续章节再说,有点饿了。...表的别名,谁会需要? 你会需要! 接下来要开始对表进行联结了,嘿嘿,睁大眼睛吧。 创建表的别名的方式和创建列的别名的方式几乎一样。在查询中首次出现表名的地方后接AS并设定别名。...联接 交叉联接(笛卡尔积) 假设你有一个存储男孩姓名的表以及一个记录男孩们都有哪些玩具的表,现在我们要试着找出每个男孩拥有的玩具。...自然联接只有在联接的列在两张表中的名称相同时才会用。 SELECT boys.boy,toys.toy FROM boys NATURAL JOIN toys; ?

    81920

    MySQL之优化SELECT语句

    哈希连接算法的基本原理如下: 为连接操作中较小的表(通常是内部表)构建一个哈希表,将连接列的值作为键,行数据作为值存储在哈希表中。...扫描较大的表(通常是外部表),对于每一行,将连接列的值与哈希表中的键进行比较,如果匹配,则将该行与哈希表中的值进行连接,形成结果集。...重复此过程的次数与要连接的表的次数相同。 MySQL在表之间执行联接时使用嵌套循环算法或其上的变体。主要有两种嵌套循环算法:块嵌套循环连接算法和简单的嵌套循环连接算法(NLJ)。...根据不同的联接类型,MySQL可能会选择不同的联接算法来执行联接操作。 需要注意的是,嵌套循环联接算法在某些情况下可能会导致性能较差,特别是在连接的表中有大量数据时。...不同类型的联接会导致不同的结果集。 需要注意的是,嵌套联接可能会导致查询复杂度的增加,特别是当连接的表数目较多或连接条件复杂时。在实际应用中,要谨慎使用嵌套联接,避免过多的表连接导致性能下降。

    13910

    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。    2、外联接。...如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       ...3、交叉联接    交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。    ...自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。...第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。

    5.7K10

    这是我见过最有用的Mysql面试题,面试了无数公司总结的(内附答案)

    5.什么是数据库中的记录? 记录(也称为数据行)是表中相关数据的有序集合。 6.什么是表中的列? 列是表中的垂直实体,包含与表中特定细分关联的所有信息。 7.什么是DBMS?...它确保索引键列中的值是唯一的。 2.聚集索引:聚集索引对表的物理顺序进行重新排序,并根据键值进行搜索。每个表只有一个聚集索引。...一个PRIMARY KEY 约束唯一标识数据库表中的记录。 参与主键约束的所有列均不得包含NULL值。 40.一个表可以包含多个PRIMARY KEY吗?...简短的答案是“否”,一个表不允许包含多个主键, 但是它允许一个包含两个或更多列的复合主键。 41.什么是复合 主键? 复合主键是在表中的多个列(多个字段的组合)上创建的主键。 42.什么是外键?...SQL中的聚合函数是什么? SQL聚合函数返回单个值,该值是根据列中的值计算得出的。

    27.1K20

    T-SQL基础(二)之关联查询

    笛卡尔乘积 将一个输入表的每一行与另一个表的所有行匹配,即,**如果一张表有m行a列,另一张表n行b列,笛卡尔乘积后得到的表有m*n行,a+b列**。...SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...内联接的逻辑处理分为两步: 生成笛卡尔乘积 根据谓词ON对笛卡尔乘积进行筛选 与交叉联接一样,内联接有两种写法: USE WJChi; -- 使用JOIN,推荐使用这种方式 SELECT *...右表中不满足筛选条件的空行(外部行)则用NULL值填充。 RIGHT JOIN与LEFT JOIN作用相反。...:warning:不建议超过三张表进行关联,过多的表关联会使SQL变得复杂,难以维护且影响性能 小结 过多的表联接会让SQL逻辑变得复杂,对查询性能产生负面影响,且难以维护。

    2.2K10

    T-SQL基础(二)之关联查询

    笛卡尔乘积 将一个输入表的每一行与另一个表的所有行匹配,即,如果一张表有m行a列,另一张表n行b列,笛卡尔乘积后得到的表有mn行,a+b列*。...交叉联接 SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...内联接的逻辑处理分为两步: 生成笛卡尔乘积 根据谓词ON对笛卡尔乘积进行筛选 与交叉联接一样,内联接有两种写法: USE WJChi; -- 使用JOIN,推荐使用这种方式 SELECT * FROM...右表中不满足筛选条件的空行(外部行)则用NULL值填充。 RIGHT JOIN与LEFT JOIN作用相反。...不建议超过三张表进行关联,过多的表关联会使SQL变得复杂,难以维护且影响性能 小结 过多的表联接会让SQL逻辑变得复杂,对查询性能产生负面影响,且难以维护。

    2.1K40

    使用联接和子查询来查询数据

    外联接 - 显示包含一个表中的所有行以及另外一个表中匹配行的结果集,不匹配的用NULL值填充 --(1)左外联接 - 返回LEFT OUTER JOIN 左侧的表的所有行,以及右侧指定的表的匹配行,若右边找不到匹配项...,显示NULL值 --(2)右外联接 - 返回RIGHT OUTER JOIN 右侧的表的所有行,以及左侧指定的表的匹配行,若左边找不到匹配项,显示NULL值 --(3)完整外联接 - 左外联接和右外联接的组合...交叉联接(Cross Join) Product运算,将一个表中的每一行与另一个表中的 -------------------- create table Course --创建Course表,里面包含一列...使用关联子查询 - 根据外部查询作为评估依据的查询 --问题:查询每个部门最早加入的员工的信息 select * from HumanResources.EmployeeDepartmentHistory...交集,并集,差集 --操作两个select语句查询的结果 /* 前提条件 (1)两个结果集的列的数量和顺序要一致 (2)所有查询中的列的数据类型必须兼容 如char(10)和varchar

    2.2K60

    【数据库设计和SQL基础语法】--连接与联接--联接的优化与性能问题

    外连接可能涉及更多的计算,因此在不需要包含不匹配行的情况下,应该谨慎使用。 自连接的适用性: 自连接是指表与自身进行联接的操作。...对于某些查询,使用覆盖索引可以避免额外的数据访问,提高性能。 避免过度索引: 避免在每一列上都创建索引,因为这可能会增加维护成本,降低写操作的性能。 仅为那些经常用于查询条件的列创建索引。...以下是一些数据库设计的优化策略: 合理拆分表: 将大型表拆分成更小的、彼此关联的表,以减小每个表的数据量。 这可以通过垂直分割(将列拆分为不同的表)或水平分割(将行拆分为不同的表)来实现。...避免不必要的联接: 场景: 在一个HR系统中,查询员工基本信息,但并不需要关联到员工所在的部门。 应用: 确保只包含必要的表,避免不必要的联接,简化查询并提高性能。...数据库设计的优化: 场景: 一个社交媒体平台需要显示用户的帖子及其评论,用户信息分散在多个表中。 应用: 通过合理的表结构设计和合适的关联关系,减少复杂的联接,优化查询性能。

    23711

    leetcode 新题型----SQL,shell,system design

    1、内联接(典型的联接运算,使用像 = 或 之类的比较运算符)。包括相等联接和自然联接。 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。 2、外联接。...如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 2)RIGHT JOIN 或 RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。...3、交叉联接 交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。...left join子句中的左表的所有行,而不仅仅是链接列所匹配的行,如果左表中的某行在右表中没有匹配,则在相关联的结果行中右表的所有选择列均为空值(NULL) SQL语法  select *...花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

    1.2K40

    SQL 左外连接,右外连接,全连接,内连接

    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索   students   和   courses   表中学生标识号相同的所有行。    外联接。...左向外联接的结果集包括   LEFT   OUTER   子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。...如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。   ...完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。    交叉联接。     ...交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

    8700

    Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】)

    ,'mm')=12 and ENAME like '_MIT_' and job =(select job from emp where ename='JONES') 二、联接查询 联接查询的前提是表与表之间是有关联的...,也可以说是多表联级查询 多表联接查询的作用和分类 作用: 通过联接查询可以将多个表作为一个表进行处理 当检索数据时,通过联接查询可检索出源于不同表的信息,提高用户操作的灵活性。...交叉联接分类: 笛卡尔积 等值联接 自联接 非等值联接 2.1.1 笛卡尔积 含义:两个集合中的每一个成员,都与对方集合中的任意一个成员有关联。即第一个表的行数乘以第二个表的行数等于笛卡尔积大小。...即:emp 总的 deptno = dept 中的 deptno、deptno是关联字段 作用: eg:在多表查询中将关联字段加入 where 语句,即可消除笛卡尔积,此时称为 等值联接 语法: select...两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接成为左(或右)外联接 两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为满外联接

    1.1K30
    领券