SQL嵌套语句执行顺序

首先我们要了解一下SQL语句的执行过程。 

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

那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。 

其它的先不说了,只说WHERE。 

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)

 

 

http://blog.csdn.net/java166/article/details/4089728

转载于:https://www.cnblogs.com/bulemaple/articles/2830996.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fatal error: Python.h: No such file or directory

ubuntu下编译libxml2时&#xff0c;报错. 执行apt-get install python-dev即可

php 计划任务 不执行,CentOS 系统下 Laravel 计划任务 PHP artisan schedule:run 不执行,应该如何处理?...

服务器是centos系统&#xff0c;现在遇到一个很奇怪的问题&#xff0c;计划任务不能执行&#xff0c;本来设的是定时检查用户表&#xff0c;给当天过生日的用户发生日祝福短信&#xff0c;日志记录计划任务执行了&#xff0c;但没有短信发送&#xff0c;laravel日志中也没有记录…

(转)Win7下如何硬盘安装Ubuntu

1.下载Linux镜像及EasyBCD   以Ubuntu为例&#xff1a;http://www.ubuntu.com/desktop/get-ubuntu/download  系统引导软件EasyBCD&#xff1a;http://neosmart.net/EasyBCD/  2.设置NeoGrub启动项   1&#xff09;ubuntu下载文件放在C:\ubuntu-10.10-desktop-i386.iso&…

编译libxml2-2.6.26 __open_missing_mode 错误

调用open函数&#xff0c;因为使用open函数的时候&#xff0c;如果在第二个参数中使用了 O_CREAT&#xff0c;就必须添加第三个参数&#xff1a;创建文件时赋予的初始权。 解决方案&#xff1a;在调用open函数的那一行的参数里加个“0666”或者“0777”均可&#xff01; 如&…

卡巴斯基授权许可文件_制片方未提供电视台授权证明,构成根本违约吗?

在制作娱乐法101课程的过程中&#xff0c;需要检索很多案例&#xff0c;有时候也也看到一些似乎不太合理的判决书。在一起电视播映权纠纷中&#xff0c;合同中一般会常规约定制作方需要向电视台提交确保其在合同授权区域、授权范围、授权期限内具有合法播映权的证明文件的合同义…

月头月尾oracle取数,Oracle分析函数Over()的使用

今天为完成客户成品仓盘点的统计功能&#xff0c;做了盘点统计表&#xff0c;这个功能有点复杂&#xff0c;要将生产数据与库存的差异做成一个统计报表&#xff0c;报表要反映出差异的明细。其实&#xff0c;这个项目拖了也挺久了&#xff0c;本来客户计划用于2018年终盘点&…

一个快递小伙子带给我们的启示:认真有力量

今天加班一天&#xff0c;合肥漫天飞雪&#xff0c;出门就开始下&#xff0c;到了公司&#xff0c;这个世界全白了&#xff0c;看到了这篇文章&#xff0c;贴出来于大家共享&#xff01;认真有力量&#xff0c;大家认真努力工作哈&#xff01; 他是个快递小子&#xff0c;20岁出…

Win32 API串口编程

在工业控制中&#xff0c;工控机&#xff08;一般都基于Windows平台&#xff09;经常需要与智能仪表通过串口进行通信。串口通信方便易行&#xff0c;应用广泛。 一般情况下&#xff0c;工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的&#xff0c;只能由…

python安装vtk_python - 安装VTK for Python - SO中文参考 - www.soinside.com

最简单的方法第一个也是最简单的方法是使用Aptitude Package Manager安装软件包&#xff1a;sudo apt-get install libvtk5-dev python-vtk如果你想要最新版本如果你想要最新版本的VTK&#xff0c;你也可以自己构建它&#xff1a;确保安装了CMake&#xff1a;sudo apt-get inst…

oracle事务数统计,Oracle 查询事务数

查询“的”首先想到的是v$transaction, 确认这个思路是否正确&#xff1a;执行下面语句&#xff1a;SQL> select * from v$transaction;no rows selectedSQL>发现居然为空&#xff0c;why&#xff1f; 这时恍然大悟&#xff0c;v$transaction记录的是当前事务&#xff0c…

数据库的应用详解三

数据库的应用详解三 数据库的应用详解三 承接上一篇文章:《ADO.NET实例教学二》中设计到的多条件搜索的内容&#xff0c;下面我们就先针对这部分的内容进行深入的讲解。 一、做好准备 在什么情况下会遇到多条件搜索呢&#xff1f;在生活中有没有遇到类似的多条件搜索的情况。在…

arm for asterisk1.8

./configure --hostarm-linux后报错&#xff0c;找不到termcap&#xff0c;于是下载了termcap-1.3.1进行交叉编译。 再次./configure --hostarm-linux后依然报错&#xff0c;找不到libxml2&#xff0c;于是下载了libxml2-2.7.2进行交叉编译。 再次./configure --hostarm-linu…

python可以实现操作系统管理_Python并发编程 —— 操作系统基础

1、手工操作 —— 穿孔卡片1946年第一台计算机诞生--20世纪50年代中期&#xff0c;计算机工作还在采用手工操作方式。此时还没有操作系统的概念。特点&#xff1a;(1)用户独占全机。不会出现因资源已被其他用户占用而等待的现象&#xff0c;但资源的利用率低。(2)CPU 等待手工操…

oracle经纬度换算成xy坐标,谁有全套经纬度转换成XY坐标的好的软件?

用的实施么地图&#xff1f;标准地形图吗&#xff1f;如果是标准地形图&#xff0c;还是有办法转化的&#xff0c;因为用的是高斯-克吕格投影该投影按照投影带中央子午线投影为直线且长度不变和赤道投影为直线的条件&#xff0c;确定函数的形式&#xff0c;从而得到高斯一克吕格…

数学术语的英汉对照(权威,全面)

abbreviation 简写符号&#xff1b;简写 abscissa 横坐标 absolute complement 绝对补集 absolute error 绝对误差 absolute inequality 绝不等式 absolute maximum 绝对极大值 absolute minimum 绝对极小值 absolute monotonic 绝对单调 absolute value 绝对值 accelerate 加速…

交叉编译ncurses5.6

./configure --hostarm-linux -with-shared -without-debug make

粒子群 多目标 matlab_matlab 粒子群求解三角形垂心位置

续 https://www.toutiao.com/i6766960319995576843/设定三角形A顶点的坐标为 (x1,y1);(x2,y2);(x3,y3);随机初始化&#xff1b;计算得知垂心到三个顶点距离为&#xff1a;R(((x1^2 - 2*x1*x2 x2^2 y1^2 - 2*y1*y2 y2^2)*(x1^2 - 2*x1*x3 x3^2 y1^2 - 2*y1*y3 y3^2)*(x2^2…

php hasmany,浅谈laravel orm 中的一对多关系 hasMany

个人对于laravel orm 中对于一对多关系的理解文章表 article&#xff0c;文章自然可以评论&#xff0c;表 comment 记录文章的评论&#xff0c;文章和评论的关系就是一对多&#xff0c;一篇文章可以有多个评论。 在 comment 表中有字段 article 记录评论所属文章&#xff0c;文…

C类型转换

当执行算术运算时&#xff0c;如果类型不同都会发生类型转换 1、如果整形转换为signed不丢失数据&#xff0c;就转换为signed.否则需要转换为unsigned 如: 一类型为signed int,另一类型为unsigned short,因为signed可以容纳unsigned short的全部值&#xff0c;所以unsigned sho…

python多级字典_Python多层字典取值

#! /usr/bin/python# coding:utf-8"""author:Bingo.hefile: get_target_value.pytime: 2017/12/22"""def get_target_value(key, dic, tmp_list):""":param key: 目标key值:param dic: JSON数据:param tmp_list: 用于存储获取的数…