SQL嵌套语句执⾏顺序
SELECT字段
FROM表名
WHERE条件表达式
那他们是按什么顺序执⾏的呢? 分析器会先看语句的第⼀个词, 当它发现第⼀个词是SELECT关键字时候, 他会跳到FROM关键字, 然后通过FROM关键字到表名并把表装⼊内存. 接着是到WHERE关键字, 如果不到则返回到SELECT字段解析, 如果到WHERE, 则分析其中的条件, 完成后再回到SELECT分析字段. 最后形成⼀张我们要的虚表.
其他的先不说了, 只说WHERE.
WHERE关键字后⾯的是条件表达式. 如果学过C语⾔等编程语⾔就会知道, 条件表达式计算完成后, 会有⼀个返回值, 即0或⾮0, ⾮0即为真(true), 0即为假(false). 同理WHERE后⾯的条件表达式也有⼀个返回值, 真或假, 来确定接下来执不执⾏SELECT.
例:
SELECT *
FROM Studentsql中select是什么意思
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
如果虚表2为空, EXISTS 虚表2也就为false, 不返回到SELECT, ⽽p1指向下⼀条记录. 如果虚表2⾮空, 也就是有记录, 那么EXISTS 虚表2为true, 返回到SELECT并把p1指向的那条记录添加进主SQL语句的
虚表1当中. (这也是为什么嵌套的SQL语句SELECT后⾯⼀般为*的原因,因为它EXISTS返回的 只是true或false, 字段名没有意义, ⽤*就可以, 当然⽤别的也不会错.)
注意, 这⾥虽然嵌套的SQL语句分析完了, 但主SQL语句只执⾏了⼀次, 也就是说p1指向Student的第⼀条记录, p1还要指向Student表的下⼀条记录并分析, 这样⼜进⼊了嵌套中的SQL语句, 同上⾯说的⼀样分析. 当p1也到了Student表的结尾, 整个SQL语句结束. 返回虚表1中Sname这⼀列.
嵌套就像:
for(int i= 0; i < m; i ++){
for(int j = 0; j < n; j ++){
}
}
April 9th, 2016

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。