SQL查询如何工作?

Ana*_*man 27 sql

SQL查询如何工作?它是如何编译的?是否from首先编译该子句以查看该表是否存在?它是如何从数据库中实际检索数据的?表格存储在数据库中的方式和格式如何?

我正在使用phpmyadmin,有什么办法可以查看存储数据的文件吗?我正在使用MySQL

Abd*_*han 35

sql执行顺序:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT 。

SQL查询主要分三个阶段进行。

1) 行过滤 - 第 1 阶段:行过滤 - 第 1 阶段由 FROM、WHERE、GROUP BY、HAVING 子句完成。

2)列过滤:通过SELECT子句过滤列。

3) 行过滤 - 第 2 阶段:行过滤 - 第 2 阶段由 DISTINCT 、 ORDER BY 、 LIMIT 子句完成。

在这里我将用一个例子来解释。假设我们有一个学生表如下:

ID_ 姓名_ 分数 部分_
1 朱莉娅 88 A
2 萨曼莎 68
3 玛丽亚 10 C
4 猩红 78 A
5 阿什利 63
6 阿比尔 95 D
7 81 A
8 贾希德 25 C
9 索赫尔 90 D
10 拉希姆 80 A
11 卡里姆 81
12 阿卜杜拉 92 D

现在我们运行以下 sql 查询:

select section_,sum(marks) from students where id_<10 GROUP BY section_ having sum(marks)>100 order by section_ LIMIT 2;
Run Code Online (Sandbox Code Playgroud)

查询的输出是:

部分_
A 第247章
131

但是我们如何得到这个输出呢?

我已一步一步解释了该查询。请阅读以下内容:

1. FROM , WHERE 子句执行

因此 from 子句首先起作用,因此from students where id_<10查询将消除 id_ 大于或等于 10 的行。因此执行后仍保留以下行from students where id_<10

ID_ 姓名_ 分数 部分_
1 朱莉娅 88 A
2 萨曼莎 68
3 玛丽亚 10 C
4 猩红 78 A
5 阿什利 63
6 阿比尔 95 D
7 81 A
8 贾希德 25 C
9 索赫尔 90 D

2. GROUP BY 子句执行

现在 GROUP BY 子句将会出现,这就是为什么在执行GROUP BY section_rows 后将进行如下所示的分组:

ID_ 姓名_ 分数 部分_
9 索赫尔 90 D
6 阿比尔 95 D
1 朱莉娅 88 A
4 猩红 78 A
7 81 A
2 萨曼莎 68
5 阿什利 63
3 玛丽亚 10 C
8 贾希德 25 C

3.HAVING子句执行

having sum(marks)>100将消除团体。D组总分185分,A组总分247分,B组总分131分,C组总分35分。所以我们可以看到C组的总和不大于100。那么C组将被淘汰。所以表格看起来像这样:

ID_ 姓名_ 分数 部分_
9 索赫尔 90 D
6 阿比尔 95 D
1 朱莉娅 88 A
4 猩红 78 A
7 81 A
2 萨曼莎 68
5 阿什利 63

4. SELECT子句执行

select section_,sum(marks)查询只会决定打印哪些列。决定打印section_和sum(marks)column。

部分_
D 185
A 245
131

5. ORDER BY子句执行

order by section_查询将对行进行升序排序。

部分_
A 245
131
D 185

6. LIMIT子句执行

LIMIT 2;只会打印前 2 行。

部分_
A 245
131

这就是我们得到最终输出的方式。


小智 15

好...

  • 首先进行语法检查,然后生成表达式树 - 在此阶段,您还可以测试元素是否存在和"排队"(即表中是否存在字段).这是第一步 - 任何错误都可以告诉提交者真实.
  • 然后你有....分析.SQL查询与程序的不同之处在于它没有说如何做某事,只是结果是什么.设置基于逻辑.因此,您可以获得一个查询分析器(取决于产品不好 - oracle长期以来一直很糟糕,DB2是最敏感的,甚至是测量光盘速度)来决定如何最好地接近这个结果.这是一个非常复杂的野兽 - 它可能会尝试数十种或数百种方法来找到他认为最快的方法(基于成本,基本上是一些统计数据).
  • 然后执行.

顺便说一句,查询分析器是您看到巨大差异的地方.不确定MySQL - SQL Server(微软)的亮点在于它没有最好的(但其中一个好的),但它确实有很好的可视化工具来显示查询计划,比较分析器的估计值真正的需求(如果他们有太多不同的表统计信息可能会关闭,所以分析器认为一个大表很小).他们在视觉上表现得很好.

DB2在一段时间内有一个很好的优化器,测量 - 我已经说过 - 盘速度将其纳入其估计值.Oracle长期以来"从左到右"(没有真正的分析),并采用了用户提供的查询提示(废话方法).我认为MySQL在开始时也非常原始 - 不确定它现在在哪里.

数据库中的表格式等 - 这是你不应该关心的事情.这是记录的(显然,特别是对于开源数据库),但为什么要关心?我已经做了大约15年左右的SQL工作,从来没有这种需要.这包括在某些领域做相当高端的工作.除非您尝试构建数据库文件修复工具....否则没有任何意义.


MAC*_*MAC 5

SQL语句子句执行顺序-

从 -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

我的回答是针对 Oracle 数据库的,它提供了与您的查询相关的教程。好吧,当 SQL 数据库引擎处理任何 SQL 查询/语句时,它首先开始解析,并在解析中执行三项检查SyntaxSemanticShared Pool。想知道这些检查是如何工作的?按照下面的链接。

一旦查询解析完成,它就会触发执行计划。但是,嘿数据库引擎!你够聪明。你会检查这个 SQL 查询是否已经被解析(软解析),如果是,那么你直接跳转到执行计划,否则你深入研究并优化查询(硬解析)。在执行硬解析时,您还可以使用名为Row Source Generation的软件,该软件提供从优化器接收的迭代执行计划。足够的!请参阅下面的 SQL 查询处理阶段。

在此处输入图片说明

注意 - 在执行计划之前,它还对变量的值执行绑定操作,一旦执行查询,它执行Fetch以获取记录并最终存储到结果集中。简而言之,顺序是——

PASRE -> BIND -> EXECUTE -> FETCH

对于更深入的细节,本教程正等着您。这可能对某人有帮助。