首页
学习
活动
专区
圈层
工具
发布

SELECT 语句与其子句的详解

SELECT 从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。...如果在查询中联接这两个表,可以在选择列表中将客户 ID 指定为 Customers.CustomerID。...FROM 子句 指定从其中检索行的表。需要 FROM 子句,除非选择列表只包含常量、变量和算术表达式(没有列名)。有关更多信息,请参见 FROM。... 指定联接操作的类型。 INNER 指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。...如果指定了多个联接提示,则优化器从允许的联接策略中选择最便宜的联接策略。 如果在同一个查询中,还为一对特定的表指定了联接提示,则虽然仍须遵守查询提示,但该联接提示将优先联接这两个表。

1.8K00

SQL命令大全,每条命令均有示例,小白看了也可成神!

customers WHERE name LIKE ‘%Bob%’; LIKE 的其他运算符: %x — 将选择所有以 x 开头的值 %x% — 将选择包含 x 的所有值 x% — 将选择所有以 x...结尾的值 x%y — 将选择所有以 x 开头并以 y 结尾的值 _x% — 将选择所有具有 x 作为第二个字符的值 x_%— 将选择所有以 x 开头且长度至少为两个字符的值,您可以添加额外的 _ 字符来扩展长度要求...INNER JOIN INNER JOIN 选择在两个表中具有匹配值的记录。...FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id; LEFT JOIN LEFT JOIN 从左表中选择与右表中的记录匹配的记录...ROLLBACK TO SAVEPOINT_NAME; TRUNCATE TRUNCATE TABLE 从数据库的表中删除所有数据条目,但保留表和结构。

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

    《深入浅出SQL》问答录

    A:但表设计的越好,整体所需的更新操作就会越少。良好的表设计能让我们从专心于表的内容中解放出来。 查询表时是否应该避免使用LIKE?LIKE有问题吗?...最多只能在指定位置添加新列,然后删除旧列,但是这样会失去旧列中的所有数据。 如果我已经创建了主键,然后又意外的想改用另一列呢?可以只移除主键的设置而不改变其中的数据吗? A:可以,而且很简单。...A:其实可以,但创建成外键约束后,就只能插入已经存在于父表中的值,有助于加强两张表间的连接。 加强连接?是什么意思?...内联接就是通过查询中的条件移除了某些结果的交叉联接。 可以联接多于两张表吗? A:可以,后续章节再说,有点饿了。 ORDER BY 这些东西也能与联接放到一起吗? A:是的。...---- 左外联接 LEFT OUTER JOIN 会匹配左表中的每一行及右表中符合条件的行。 当左表与右表具有一对多关系时,左外联接特别有用。

    3.7K50

    常见SQL知识点总结,建议收藏!

    举例 查找薪水最高的前 3 名员工。 样本Employee_salary表 这里你应该要求面试官说清楚“前三名”具体是什么意思。我应该在结果中包括 3 名员工吗?你要我怎样处理关系?...04 SQL 查询执行顺序 大多数人会从SELECT开始,从上到下编写SQL查询。 但你知道SQL引擎执行函数时要到后面才执行SELECT吗?...我不能编写HAVING avg_gpa >= 3.5的原因是,Avg_gpa被定义为SELECT的一部分,因此无法在SELECT之前执行的步骤中引用它。...但在这个示例中,它要求计算“每个 Y 中的 TOP N X”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。...尽管样本数据中的某些列似乎具有不同的值,但面试官还是希望候选人考虑所有可能性,就像他们在处理真实数据集一样。 例如 在上一个示例Employee_salary表中,可以让雇员共享相同的名称。

    59010

    数据库sql面试需要准备哪些?

    样本 employee_salary 表。 这里你应该要求面试官说清楚“前三名”具体是什么意思。我应该在结果中包括 3 名员工吗?你要我怎样处理关系?此外,请仔细检查样本员工数据。...最后,我们只保留学生平均 GPA 高于 3.5 的行,可以使用 HAVING 来实现。...SQL 查询执行顺序 大多数人会从 SELECT 开始,从上到下编写 SQL 查询。但你知道 SQL 引擎执行函数时要到后面才执行 SELECT 吗?...但在这个示例中,它要求计算“每个 Y 中的 TOP N X”,这强烈暗示我们应该使用排名函数,因为我们需要对每个分区组中的行进行排名。...重复项 SQL 面试中的另一个常见陷阱是忽略数据重复。尽管样本数据中的某些列似乎具有不同的值,但面试官还是希望候选人考虑所有可能性,就像他们在处理真实数据集一样。

    1.9K20

    MySQL基本查询示例(二)

    在进行接下来的查询,这里有必要说一下多表查询的相关概念 1)内联接 内联接(inner join)是最常见的一种联接方式,只返回两个数据集合之间匹配关系的行,将位于两个互相交叉的数据集合中重叠部分以内的数据行联接起来...2)外联接 外联接(outer join)是对内联接的扩充,除了将两个数据集合中重复部分以内的数据行联接起来之外,还可以根据要求返回左侧或右侧表中非匹配的数据或全部的数据。...外联接还可以分为以下几种: 左外联接(left join或left outer join)的结果包括左表的所有行,如果左表的某一行在右表中没有匹配行,则右表返回空值,否则返回相应值。...右外联接(right join或right outer join)是左外联接的反向联接,将返回右表的所有行,如果右表的某一行在左表中没有匹配行,则左表返回空值,否则返回相应值。...全联接(full join 或full outer join)将返回左表和右表中的所有行,当某一行在另一个表中没有匹配行时,另一个表返回空值,否则返回相应值。

    1.1K30

    【MySQL】基础实战篇(2)—数据查询操作

    前言 数据查询是数据库管理系统应用的主要内容,也是用户对数据库最频繁、最常见的操作请求。 数据查询可以根据用户提供的限定条件,从已存在的数据表中检索用户需要的数据。...MySQL使用SELECT语句既可以完成简单的单表查询、联合查询,也可以完成复杂的联接查询、子查询,从数据库中检索符合用户需求的数据,并将结果集以表格的形式返回给用户。...对于DISTINCT关键字来说,所有的空值NULL将被认为是重复的内容,当SELECT语句中包括DISTINCT关键字时,不论遇到多少个空值,在结果中只返回一个NULL。...可以让表中的值与指定值或表达式作比较。 逻辑运算符 逻辑运算符包括AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)。...使用 IN 运算符可以使查询更清晰,并减少重复代码。 BETWEEN 运算符 BETWEEN 运算符用于选择在某个范围内的值。

    78820

    MySQL优化总结

    下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:system:表仅有一行(=系统表)。这是const联接类型的一个特例。const:表最多有一个匹配行,它将在查询开始时被读取。...这可能是最好的联接类型,除了const类型。ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。...可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)range:只检索给定范围的行...这可能是最好的联接类型,除了const类型。 ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。...可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) range:只检索给定范围的行

    2.2K40

    SQL高级查询方法

    子查询的例子可以参考笔试题中的例子,SQL笔试50题(上),SQL笔试50题(下) 4.9 联接 join 通过联接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。...左向外部联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某一行在右表中没有匹配行,则在关联的结果集行中,来自右表的所有选择列表列均为空值。...RIGHT JOIN 或 RIGHT OUTER JOIN 右向外部联接是左向外部联接的反向联接。将返回右表的所有行。如果右表的某一行在左表中没有匹配行,则将为左表返回空值。...FULL JOIN 或 FULL OUTER JOIN 完整外部联接将返回左表和右表中的所有行。当某一行在另一个表中没有匹配行时,另一个表的选择列表列将包含空值。...如果表之间有匹配行,则整个结果集行包含基表的数据值。 交叉联接 交叉联接将返回左表中的所有行。左表中的每一行均与右表中的所有行组合。交叉联接也称作笛卡尔积。

    7.5K20

    如果有人问你数据库的原理,叫他看这篇文章-3

    道理如下: 为了避免逐行读取两个关系, 你可以成簇读取,把(两个关系里读到的)两簇数据行保存在内存里, 比较两簇数据,保留匹配的, 然后从磁盘加载新的数据簇来继续比较 直到加载了所有数据。...在时间复杂度方面我需要做些假设来简化问题: 内关系被划分成 X 个哈希桶 哈希函数几乎均匀地分布每个关系内数据的哈希值,就是说哈希桶大小一致 外关系的元素与哈希桶内的所有元素的匹配,成本是哈希桶内元素的数量...注:这个简化的合并联接不区分内表或外表;两个表扮演同样的角色。但是真实的实现方式是不同的,比如当处理重复值时。、 1.(可选)排序联接运算:两个输入源都按照联接关键字排序。...这部分与我们研究过的合并排序中的合并运算非常相似。不过这一次呢,我们不是从两个关系里挑选所有元素,而是只挑选相同的元素。...相反,我可以武断地从全部可能的计划中选择一个子集,计算它们的成本,把最佳的计划给你。

    1.3K31

    SQL命令 INTO

    主机变量 主机变量只能包含单个值。因此,嵌入式SQL中的SELECT只检索一行数据。这默认为表格的第一行。当然,可以通过使用WHERE条件限制符合条件的行来从表的其他行检索数据。...列出的主机变量可以从涉及多个表的SELECT返回字段值,也可以从没有FROM子句的SELECT返回值。 下面的示例从包含四个主机变量的列表中选择四个字段。...在INTO子句中使用主机变量数组时,适用以下规则: 选择项列表中指定的字段被选入单个主机变量的下标。因此,不必将选择项列表中的项数与主机变量COUNT匹配。 主机变量下标由表定义中相应的字段位置填充。...例如,表定义中定义的第6个字段对应于mydata(6)。与指定选择项不对应的所有下标仍未定义。选择项中项的顺序对如何填充下标没有影响。 主机变量数组只能从单个表返回字段值。...,"SQL error ",SQLCODE } } 下面的嵌入式SQL示例返回由两个表联接产生的行中的字段值。

    2.6K40

    那些年我们写过的T-SQL(上篇)

    其中JOIN操作符对两个输入表进行操作,类型包括交叉联接、内部联接和外部联接,它们之间的差别在于其逻辑查询处理阶段,这是本节的最需要理解的概念,是真正理解联接操作的基础,通过一个表格来做一个初步的了解(...交叉联接:只包含笛卡尔乘积阶段,比如一张表A有m行,表B有n行,其结果集有m*n行记录。该类型使用场景非常少,但其中有2个场景还是需要知道的。...,为处理异构数据或者按指定格式呈现时,可能需要构建辅助表,埋下这样一个种子就好 内部联接:最常见和基础的联接方式,包含笛卡尔乘积和筛选两个步骤,相对复杂的情形包括复合联接、不等联接和多联接查询,如下表所示...在以后的第三阶段,将识别出保留表中基于ON谓词未能与另一张表匹配的行,称之为外部行,此阶段会将这些外部行添加到之前的结果集中,在这些外部行中,其非保留表字段将使用NULL作为占位符。...之前提到外联接查询的结果包含内部行和外部行,如果我们想进一步将外部行或内部行剔除,那么就可以使用WHERE进行筛选,需要注意非保留表中的属性一定要选择非NULL属性,这时的查询真正对应到NULL占位符(

    4K100

    Mysql资料 查询SQL执行顺序

    具体顺序 1.FROM 执行笛卡尔积 FROM 才是 SQL 语句执行的第一步,并非 SELECT 。对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表VT1,获取不同数据源的数据集。...3.JOIN 添加外部行 如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。...如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1~3,直到处理完所有的表为止。 4.WHERE 应用WEHRE过滤器 对虚拟表 VT3应用WHERE筛选器。...同时,从这一步开始,后面的语句中都可以使用SELECT中的别名。 6.AGG_FUNC 计算聚合函数 计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。...10.DISTINCT 行去重 将重复的行从虚拟表 VT8中移除,产生虚拟表 VT9。DISTINCT用来删除重复行,只保留唯一的。

    4.3K00

    SQL DB - 关系型数据库是如何工作的

    数据达到百万级时统计会变得困难,这时候,你可以选择仅做基本统计或者在一个数据库样本上执行统计。举个例子,我参与的一个项目需要处理每表上亿条数据的库,我选择只统计10%,结果造成了巨大的时间消耗。...原因如下:为了避免逐行读取两个关系,你可以成簇读取,把(两个关系里读到的)两簇数据行保存在内存里,比较两簇数据,保留匹配的,然后从磁盘加载新的数据簇来继续比较直到加载了所有数据。...外关系的元素与哈希桶内的所有元素的匹配,成本是哈希桶内元素的数量。时间复杂度是 (M/X) * N + 创建哈希表的成本(M) + 哈希函数的成本 * N 。...不过这一次呢,我们不是从两个关系里挑选所有元素,而是只挑选相同的元素。...注:这是我从多个学术论文和教程里看到的,但并没有看到官方文档里显式说明这一点。

    65410

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

    SELECT:从数据库中选择特定数据 INSERT:将新记录插入表中 UPDATE:更新现有记录 DELETE:从表中删除现有记录 15. SQL中有哪些不同的DCL命令?...联接的类型如下: 内部联接 左联接 正确加入 外连接 35.内部联接和外部联接之间有什么区别? 内部联接:当正在比较的两个(或多个)表之间至少有一些匹配数据时,内部联接将返回行。...外部联接:外部联接从两个表返回行,这些行包括与一个或两个表不匹配的记录。 36.什么是SQL约束? SQL约束是在数据库中插入,删除或更新数据时实施一些约束的一组规则。 37....一个PRIMARY KEY 约束唯一标识数据库表中的记录。 参与主键约束的所有列均不得包含NULL值。 40.一个表可以包含多个PRIMARY KEY吗?...一个FOREIGN KEY是用于两个表连接在一起的关键。 一个FOREIGN KEY 的表与链接的PRIMARY KEY 另一个表。 43.一个表可以包含多个FOREIGN KEY吗?

    31.5K20

    【21】进大厂必须掌握的面试题-65个SQL面试

    列出不同类型的联接? 有多种类型的联接用于检索表之间的数据。有四种类型的联接,即: 内部联接:MySQL中的内部联接是最常见的联接类型。它用于从满足联接条件的多个表中返回所有行。...左连接: MySQL中的左连接用于返回左表中的所有行,但仅返回右表中满足连接条件的匹配行。 右连接: MySQL中的右连接用于返回右表中的所有行,但仅返回满足连接条件的左表中的匹配行。...交叉联接产生两个表的叉积或笛卡尔积,而自然联接基于两个表中具有相同名称和数据类型的所有列。 Q28。什么是SQL中的子查询? 子查询是另一个查询中的查询,其中定义了查询以从数据库中检索数据或信息。...约束有两个级别,即: 列级约束 表级约束 Q44。如何从两个表中获取公用记录? 您可以使用INTERSECT从两个表中获取公用记录。...命名查询中用于模式匹配的运算符? LIKE运算符用于模式匹配,可以用作-。 %–匹配零个或多个字符。 例如-从学生姓名为’a%’的学生中选择* (下划线)–恰好匹配一个字符。

    9.5K22

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

    ,添加外部行; 内部行 & 外部行 内部行指的是基于谓词ON与另一侧匹配的行,外部行则是未匹配的行,外部行用NULL进行填充。...以下是网络上关于笛卡尔乘积的解释: 在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,**第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员...SQL中使用CROSS JOIN语句进行交叉联接查询,在逻辑处理上,交叉联接是最为简单的联接类型,它只获取表的笛卡尔乘积。...右表中不满足筛选条件的空行(外部行)则用NULL值填充。 RIGHT JOIN与LEFT JOIN作用相反。...SQL Server也常常出于优化查询的目的,在实际处理查询过程中对联接进行重新排序,但这不会影响到处理结果集的正确性。

    2.9K10

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

    内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。    2、外联接。...如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。       ...如果右表的某行在左表中没有匹配行,则将为左表返回空值。        3)FULL  JOIN 或 FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行。...当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   ...在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。 从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是: ON只进行连接操作,WHERE只过滤中间表的记录。

    6.7K10

    浅谈数据库Join的实现原理

    外部循环逐行消耗外部输入表。内部循环为每个外部行执行,在内部输入表中搜索匹配行。最简单的情况是,搜索时扫描整个表或索引;这称为单纯嵌套循环联接。如果搜索时使用索引,则称为索引嵌套循环联接。...两个表都按照关联字段排序好之后,Merge Join操作从每个表取一条记录开始匹配,如果符合关联条件,则放入结果集中;否则,将关联字段值较小的记录抛弃,从这条记录对应的表中取下一条记录继续进行匹配,直到整个循环结束...Build操作从build input输入中取出每一行记录,将该行记录关联字段的值使用hash函数生成hash值,这个hash值对应到hash table中的hash buckets(哈希表目)。...Probe(探测)阶段,SQL Server从probe input输入中取出每一行记录,同样将该行记录关联字段的值,使用build阶段中相同的hash函数生成hash值,根据这个hash值,从build...Hash join效率最高,因为只要对两张表扫描一次,Merge Join(合并联接)本身的速度很快,但如果需要排序操作,选择合并联接就会非常费时。

    6.6K100

    mysql explain用法和结果的含义

    这可能是最好的联接类型,除了const类型。 ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。...可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) range:只检索给定范围的行...range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。...这可能是最好的联接类型,除了const类型。 ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。...可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) range:只检索给定范围的行

    2.6K10
    领券