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只过滤中间表的记录

拓展:点击打开链接

时间: 2024-10-21 16:08:01

SQL Select查询原理--查询语句执行原则(基础)的相关文章

sql select all条件查询的用法

all 语法 scalar_expression { = | <> | != | > | >= | !> | < | <= | !< } ALL ( subquery ) scalar_expression 任何有效的表达式. { = | <> | != | > | >= | !> | < | <= | !< } 比较运算符. subquery 返回单列结果集的子查询.返回列的数据类型必须与 scalar_ex

SQL邮件自动应答(根据收到的邮件中的查询语句回复语句执行结果)

语句|执行 SQLMail可以收发邮件,可能好多人都有xp_sendmail发送过邮件,这里介绍一种邮件服务器接收邮件后,根据邮件内容(只能是查询语句)把邮件中的查询语句执行后的结果以附件形式自动返回给发送邮件者. eg: 发送邮件,邮件内容为: select top 10 id,name from sysobjects则服务器自动回复邮件,内容为上述查询语句的执行结果,以附件形式发送. 1:当然是先配置好SQL邮件服务了,这方面的资料比较多,此处不赘述. 2: 把sp_processmail稍

查询Oracle中正在执行和执行过的SQL语句_oracle

查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的SQL, b.machine 计算机名 FROM v$process a, v$session b, v$sqlarea c WHERE a.addr = b.paddr AND b.sql_hash_value = c.hash_value 其它网友给出的正

sql select语句的多表查询的使用方法

SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL SELECT 语法 SELECT 列名称 FROM 表名称以及: SELECT * FROM 表名称注释:SQL 语句对大小写不敏感.SELECT 等效于 select 实例 CREATE TABLE Manufacturers (    ManfID CHAR(8) NOT NULL PRIMARY KEY,    ManfName VARCHAR(30) NOT NULL ) ENGINE=INNODB

ruby sql select 查询语句用法

ruby sql select 查询语句用法 require 'mysql教程' m = Mysql.new("localhost","ruby","secret","maillist") r = m.query("SELECT * FROM people ORDER BY name") r.each_hash do |f|   print "#{f['name']} - #{f['email']

Sql语句之select 5种查询

select 5种子句:注意顺序where / group by /having / order by / limit / 清空表中的数据:truncate 表名: 导入表结构(不含数据): create table 表2 like 表1; 删除表:drop table 表名: 导入数据:insert into g2 select * from stu order by name, fenshu desc; //从临时表中查询=========子查询select * from (select *

select查询原理

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

详解SQL Server的简单查询语句_MsSql

前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

详解SQL Server的简单查询语句

前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT