SQL select查询原理--查询语句执行原则<转>

1.单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。

1)简单的单表查询

SELECT 字段 
FROM 表名 
WHERE 条件表达式

那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
WHERE关键字后面的是条件表达式。如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

例: 
SELECT * 
FROM STUDENT 
WHERE SNO = ‘1‘;

分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。

再说EXISTS谓词,EXISTS谓词也是条件表达式的一部分。当然它也有一个返回值(true或false)。

例: 
SELECT Sname 
FROM Student 
WHERE EXISTS 
(SELECT * 
FROM SC 
WHERE SC.Sno = Student.Sno AND SC.Cno = ‘1‘);

这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2,也就变成

SELECT Sname 
FROM Student 
WHERE EXISTS 虚表2

如果虚表为空表,EXISTS 虚表2 也就为false,不返回到SELECT,而p1指向下一条记录。如果虚表2不为空也就是有记录,那么EXISTS 虚表2 为true同,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。(这也是为什么嵌套的SQL语句SELECT 后面为一般为*的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用*就行,当然用别的也不会错。 )

注意,这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1Sname这一列。

嵌套就像:

for(int i = 0,i < n, ++i) 
for(int j = 0, j < n, ++j)

2,两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。

3.多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果.

4.不同类型的连接查询什么时候用

查两表关联列相等的数据用内连接。
左表的连接列是右表的子集时用右外连接。
右表的连接列是左表的子集时用左外连接。
左表的连接列和右表的连接列彼此有交集但彼此互不为子集时候用全外。
求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。
ON只进行连接操作,WHERE只过滤中间表的记录

转自http://blog.csdn.net/chenjian198819/article/details/6794316

时间: 2024-08-24 03:02:01

SQL select查询原理--查询语句执行原则<转>的相关文章

SQL 中的语法顺序与执行顺序

FROM : HOME SQL 是一种声明式语言 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果. SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思维去指示计算机如何操作. SQL 语句的语法顺序是: SELECT[DISTINCT] FROM WHERE GROUP BY HAVING UNION ORDER BY 执行顺序为: FROM WHERE GROUP

SQL 中的语法顺序与执行顺序(转)

很多程序员都很抵触SQL.其实SQL是一整为数不多的声明性语言,只是它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言. 今天大家共同学习下SQL的语法顺序与执行顺序.(入门级的.大神们可以直接点退出了哈.) SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明”. SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果. SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选

hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR

hive语句执行顺序 msyql语句执行顺序 代码写的顺序: select ... from... where.... group by... having... order by.. 或者 from ... select ... 代码的执行顺序: from... where...group by... having.... select ... order by... hive 语句执行顺序 大致顺序 from... where.... select...group by... having

从Select语句看Oracle查询原理(了解Oracle的查询机制)

第一步:客户端把语句发给服务器端执行 当我们在客户端执行select语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句.也就是说,Oracle客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端.虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用是不相同的.服务器上的数据库进程才会对SQL语句进行相关的处理.不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的.也就是说,在客户端连接上服务器后,在客户端

数据库SQL SELECT查询的工作原理

作为B/S架构的开发人员,总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.但是我从来没有研究过它们的工作原理,这篇我想说一说select在数据库中的工作原理. B/S架构中最经典的话题无非于三层架构,可以大概分为数据层,业务逻辑层和表示层,而数据层的作用一般都是和数据库交互,例如查询记录.我们经常是写好查询SQL,然后调用程序执行SQL.但是它内部的工作流程是怎样的呢?先做哪一步,然后做哪一步等,我想还有大部分朋友和我一样都不一定

python 3 mysql sql逻辑查询语句执行顺序

python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <havin

查询oracle 数据库 SQL语句执行情况

1.查看总消耗时间最多的前10条SQL语句 select *  from (select v.sql_id,  v.child_number,  v.sql_text,  v.elapsed_time,  v.cpu_time,  v.disk_reads,  rank() over(order by v.elapsed_time desc) elapsed_rank  from v$sql v) a  where elapsed_rank <= 10; 2.查看CPU消耗时间最多的前10条SQ

使用explain查询select查询语句执行计划

1.使用explain查询select查询语句执行计划 mysql> select * from baba where name ='fjdsjf'; +------+--------+ | id   | name   | +------+--------+ |    1 | fjdsjf | +------+--------+ 查询该sql语句的执行计划 mysql> explain select * from baba where name ='fjdsjf' \G; **********

select语句执行的顺序,子查询和联合查询【这三点都是重点】

select (字段或表达式) (from 资源) where 1(用来先处理筛选后加条件) (AND条件附加)(group by)(order by)(limit); 1.group by分组[分组的作用在于分组统计上使用分组,每组正常只显示一条信息][基本都是用在分组统计方面,配合聚合函数进行处理] [这个重点] group_concat(函数):会将组内的元素进行拼接显示[这个能够显示分组后的组内的显示效果] 多字段分组[group by+多个字段并列即可] [分组字段的使用主要还是在统计