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 |
但是我们如何得到这个输出呢?
我已一步一步解释了该查询。请阅读以下内容:
因此 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 |
现在 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 |
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 | 乙 |
select section_,sum(marks)查询只会决定打印哪些列。决定打印section_和sum(marks)column。
| 部分_ | 和 |
|---|---|
| D | 185 |
| A | 245 |
| 乙 | 131 |
order by section_查询将对行进行升序排序。
| 部分_ | 和 |
|---|---|
| A | 245 |
| 乙 | 131 |
| D | 185 |
LIMIT 2;只会打印前 2 行。
| 部分_ | 和 |
|---|---|
| A | 245 |
| 乙 | 131 |
这就是我们得到最终输出的方式。
小智 15
好...
顺便说一句,查询分析器是您看到巨大差异的地方.不确定MySQL - SQL Server(微软)的亮点在于它没有最好的(但其中一个好的),但它确实有很好的可视化工具来显示查询计划,比较分析器的估计值真正的需求(如果他们有太多不同的表统计信息可能会关闭,所以分析器认为一个大表很小).他们在视觉上表现得很好.
DB2在一段时间内有一个很好的优化器,测量 - 我已经说过 - 盘速度将其纳入其估计值.Oracle长期以来"从左到右"(没有真正的分析),并采用了用户提供的查询提示(废话方法).我认为MySQL在开始时也非常原始 - 不确定它现在在哪里.
数据库中的表格式等 - 这是你不应该关心的事情.这是记录的(显然,特别是对于开源数据库),但为什么要关心?我已经做了大约15年左右的SQL工作,从来没有这种需要.这包括在某些领域做相当高端的工作.除非您尝试构建数据库文件修复工具....否则没有任何意义.
SQL语句子句执行顺序-
从 -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
我的回答是针对 Oracle 数据库的,它提供了与您的查询相关的教程。好吧,当 SQL 数据库引擎处理任何 SQL 查询/语句时,它首先开始解析,并在解析中执行三项检查Syntax、Semantic和Shared Pool。想知道这些检查是如何工作的?按照下面的链接。
一旦查询解析完成,它就会触发执行计划。但是,嘿数据库引擎!你够聪明。你会检查这个 SQL 查询是否已经被解析(软解析),如果是,那么你直接跳转到执行计划,否则你深入研究并优化查询(硬解析)。在执行硬解析时,您还可以使用名为Row Source Generation的软件,该软件提供从优化器接收的迭代执行计划。足够的!请参阅下面的 SQL 查询处理阶段。
注意 - 在执行计划之前,它还对变量的值执行绑定操作,一旦执行查询,它执行Fetch以获取记录并最终存储到结果集中。简而言之,顺序是——
PASRE -> BIND -> EXECUTE -> FETCH
对于更深入的细节,本教程正等着您。这可能对某人有帮助。
| 归档时间: |
|
| 查看次数: |
27885 次 |
| 最近记录: |