懒人摘抄(内容转自CSDN资源中教程)-数据查询06-子查询

原创 2007年09月19日 09:49:00

子查询

当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于SQL命令的WHERE子句中,我们按照子查询返回单个值还是一组值(此时子查询前应接关键字INANYALL)、查询一个表还是多个表进行分类,分别举例说明子查询的形式。

5.20查询和学号为105的学生同年出生的所有学生的nonamebirthday列。

SELECT sno,sname,sbirthday

FROM student

WHERE year(sbirthday)=

   (SELECT year(sbirthday)

FROM student

      WHERE sno='105')

本例执行结果如下:

sno   sname    sbirthday                  

----- -------- ------------------------

105   匡明       1975-10-02 00:00:00.000

109   王芳       1975-02-10 00:00:00.000

本例的执行过程是:先执行以下子查询:

SELECT year(sbirthday) FROM student WHERE sno='105'

其返回结果为1975,再执行主查询:

SELECT sno,sname,sbirthday

FROM student

WHERE year(sbirthday)=1975

这样得到本例的结果。

我们知道,一个查询可以涉及多个表的联合数据,一个子查询也可以使用表的连接方法从多个表中提取数据。但在这里,该子查询尽管从多个表提取数据,但也只能有一个返回值。

5.21查询“张旭”教师任课的学生成绩,并按成绩递增排列。

SELECT cno,sno,degree

FROM score

WHERE cno=

   ( SELECT x.cno

     FROM course x,teacher y

     WHERE x.tno=y.tno and y.tname='张旭')

ORDER BY degree DESC

本例执行结果如下:

cno        sno   degree       

---------- ----- ----------

6-166      101   85

6-166      108   81

6-166      107   79

上面的查询,返回值不论来自一个表还是多个表,都只返回单个值,即返回表中的某一行,如果返回多值,则要使用本节介绍的ANYALLINNOT IN等,它们与查询条件一起构造返回一组值的子查询。

5.22查询选修某课程的学生人数多于5人的教师姓名。

SELECT tname

FROM teacher

WHERE tno IN

     (SELECT x.tno

      FROM course x,score y

      WHERE x.cno=y.cno

      GROUP BY x.tno

      HAVING COUNT(x.tno)>5)

本例执行结果如下:

tname   

--------

王萍   

5.23查询存在有85分以上成绩的课程cno

SELECT DISTINCT cno

FROM score

WHERE degree IN

    (SELECT degree

     FROM score

     WHERE degree>85)

本例执行结果如下:

cno       

----------

3-105    

3-245    

5.24查询“计算机系”中与“电子工程系”不同职称的教师nameprof

SELECT tname,prof

FROM teacher

WHERE depart='计算机系' and prof NOT IN

   (SELECT prof

     FROM teacher

     WHERE depart='电子工程系')

本例执行结果如下:

tname    prof      

-------- ----------

李诚       副教授   

5.25查询选修编号为“3-105”的课程,且成绩至少高于编号为“3-245”的学生的cnonodegree,并按degree从高到低次序排列。

SELECT cno,sno,degree

FROM score

WHERE cno='3-105' and degree> ANY

    (SELECT degree

     FROM score

     WHERE cno='3-245')

ORDER BY degree DESC

本例执行结果如下:

cno        sno   degree              

---------- ----- --------------------

3-105      103   92

3-105      107   91

3-105      105   88

3-105      108   78

3-105      109   76

5.26查询选修编号为“3-105”的课程,且成绩高于所有编号为“3-245”成绩的学生的cnonodegree,并按degree从高到低次序排列。

SELECT cno, sno,degree

FROM score

WHERE cno='3-105' and degree>ALL

    (SELECT degree

      FROM score

      WHERE cno='3-245')

ORDER BY degree DESC

本例执行结果如下:

cno        sno   degree              

---------- ----- ----------

3-105      103   92

3-105      107   91

3-105      105   88

SQL命令还提供了UNION子句,它可以将多个SQL命令连接起来生成单个SQL无法做到的结果集合。VFP将第二次查询的结果附加到第一个结果上。

注意:在VFP中使用UNION子句遵守下列规则:

   ·  使用UNION连接的SELECT必须有相同的输出表达式格式,即对应栏目具有相同的数据类型的宽度。

   ·  仅最后一个SELECT可以带ORDER BYINTO子句,如果带ORDER BY,它影响整个显示结果。

   ·  UNION不能连接嵌套的SELECT语句。

5.27查询所有教师和学生的namesexbirthday

SELECT tname AS '姓名',tsex AS '性别',tbirthday AS '出生日期'

FROM teacher

UNION

SELECT sname,ssex,sbirthday

FROM student

本例执行结果如下:

姓名       性别   出生日期                                                  

-------- ---- ---------------------------

匡明           1975-10-02 00:00:00.000

李诚           1958-12-02 00:00:00.000

李军           1976-02-20 00:00:00.000

刘冰           1977-08-14 00:00:00.000

陆君           1974-06-03 00:00:00.000

王芳           1975-02-10 00:00:00.000

王丽           1976-01-23 00:00:00.000

王萍           1972-05-05 00:00:00.000

曾华           1976-09-01 00:00:00.000

张旭           1969-03-12 00:00:00.000

本例的结果将两个SELECT命令的结果已按照姓名进行了排序。

5.28查询所有教师和学生的namesexbirthday

SELECT tname AS '姓名',tsex AS '性别',tbirthday AS '出生日期'

FROM teacher

WHERE tsex=''

UNION

SELECT sname,ssex,sbirthday

FROM student

WHERE ssex=''

本例执行结果如下:

姓名       性别   出生日期                                                  

-------- ---- -------------------------------------

刘冰           1977-08-14 00:00:00.000

王芳           1975-02-10 00:00:00.000

王丽           1976-01-23 00:00:00.000

王萍           1972-05-05 00:00:00.000

本例的结果已将两个SELECT命令的结果按姓名进行了排序。 

懒人摘抄(内容转自CSDN资源中教程)-数据查询00

数据查询数据库存在的意义在于将数据组织在一起,以方便查询。“查询”的含义就是用来描述从数据库中获取数据和操纵数据的过程。SQL语言中最主要、最核心的部分是它的查询功能。查询语言用来对己经存在于数据库中...
  • popkiler
  • popkiler
  • 2007年09月19日 09:44
  • 385

懒人摘抄(内容转自CSDN资源中教程)-数据查询08-带EXISTS测试的子查询

带EXISTS测试的子查询   在子查询中,还可以使用EXISTS,它一般用在WHERE子句中,其后紧跟一个SQL子查询,从而构成一个条件,当该子查询至少存在一个返回值时,这个条件为真(.T.),否则...
  • popkiler
  • popkiler
  • 2007年09月19日 09:51
  • 431

懒人摘抄(内容转自CSDN资源中教程)-数据查询07-子查询

相关子查询在前面的例子中,每个子查询仅执行一次,返回的值为主查询的WHERE子句所用。在有的查询中,子查询不只执行一次,例如,要显示其成绩比该课程平均成绩高的成绩表,其主查询为:SELECT sno,...
  • popkiler
  • popkiler
  • 2007年09月19日 09:50
  • 469

懒人摘抄(内容转自CSDN资源中教程)-删除表

删除关联和表使用SQL语言要比使用企业管理器删除表容易得多。删除表的语法如下:DROP TABLE table_name其中,“table_name”指出要删除表的名称。例如,要删除book表,可执行...
  • popkiler
  • popkiler
  • 2007年09月19日 09:43
  • 351

懒人摘抄(内容转自CSDN资源中教程)-建表

表的创建使用CREATE TABLE语句来建立表,其语法如下:CREATE TABLE table_name(    column_namel data_type [NULL | NOT NULL] ...
  • popkiler
  • popkiler
  • 2007年09月19日 09:41
  • 427

懒人摘抄(内容转自CSDN资源中教程)-修改表

修改表SQL语言提供了ALTER TABLE语句来修改表的结构。基本语法如下:ALTER TABLE table_name  ADD [column_name data_type]       [PR...
  • popkiler
  • popkiler
  • 2007年09月19日 09:42
  • 366

懒人摘抄(内容转自CSDN资源中教程)-数据查询03-排序查询

排序查询通过在SELECT命令中加入ORDER BY子句来控制选择行的显示顺序。ORDER BY子句可以按升序(缺省或ASC)、降序(DESC)排列各行,也可以按多个列来排序。注意:ORDER BY子...
  • popkiler
  • popkiler
  • 2007年09月19日 09:46
  • 529

懒人摘抄(内容转自CSDN资源中教程)-数据查询01-投影查询

投影查询使用SELECT语句可以选择查询表中的任意列,其中,“列表名”指出要检索的列的名称,可以为一个或多个列。当为多个列时,中间要用“,”分隔。FROM子句指出从什么表中提取数据,如果从多个表中取数...
  • popkiler
  • popkiler
  • 2007年09月19日 09:45
  • 384

懒人摘抄(内容转自CSDN资源中教程)-数据查询02-选择查询

选择查询选择查询就是指定查询条件,只从表提取或显示满足该查询条件的记录。为了选择表中满足查询条件的某些行,可以使用SQL命令中的WHERE子句。WHERE子句的查询条件是一个逻辑表达式,它是由多个关系...
  • popkiler
  • popkiler
  • 2007年09月19日 09:46
  • 353

懒人摘抄(内容转自CSDN资源中教程)-数据查询05-表的连接查询

表的连接查询    在数据查询中,经常涉及到提取两个或多个表的数据,这就需要使用表的连接来实现若干个表数据的联合查询。在一个查询中,当需要对两个或多个表连接时,可以指定连接列,在WHERE子句中给出连...
  • popkiler
  • popkiler
  • 2007年09月19日 09:49
  • 529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:懒人摘抄(内容转自CSDN资源中教程)-数据查询06-子查询
举报原因:
原因补充:

(最多只允许输入30个字)