辅导:SQLServer(SQL语句嵌套与EXISTS谓词)
来源:优易学  2011-10-23 12:58:06   【优易学:中国教育考试门户网】   资料下载   IT书店
  数据库的课讲到了EXISTS谓词,老师用了很长时间来讲,但发现同学们都不是很理解。我看了一会书又经过了一些思考,初窥了一些端倪。
  首先我们要了解一下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)
  到此结束
  最难的要数什么时候用到EXISTS,我想如果能理解EXISTS在语句中的作用,那么这个问题就很好解决了。
  青年人网站编辑后记:刚接触到数据库,上面的分析难免有很多不足和错误,请大家指出。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训