懒人摘抄(内容转自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命令的结果按姓名进行了排序。 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

数据应用达人之SQL基础教程分享8-子查询、连接、组合查询

6.子查询 更为复杂的子查询 1、子查询 【知识点介绍】 学习到现在,我们已经使用WHERE进行了很多简单的查询,一个条件、多个条件的查询都处理过了。 那么什么是子查询?...

06-Oracle学习_练习-子查询 和 连接查询

1, 求部门中那些人的薪水最高 select  e.deptno, e.ename, e.sal from (select deptno, max(sal) max_sal from emp grou...

oracle子查询教程(ppt )

  • 2008-12-23 20:29
  • 211KB
  • 下载

Mysql之子查询实例(#代表是注释内容)

Mysql之子查询实例(#代表是注释内容)

SQL Server高级内容之子查询和表链接

1.子查询概念    (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询。    (2)自查询的分类   1)独...

报表控件NCreport教程:子查询系统设计

数据报表中经常需要用到主从数据关系,比如发票、订单等一类的特殊文件,在报表控件NCreport中也不例外。数据报表至少有一个表头和一个通过主键和外键关联的相关细节数据集。子查询系统则是通过父数据源驱动...

asp.net MVC + linq to Entity简单教程(五)linq to Entity中join的使用以及子查询

多表联查,可以说是我们写sql语句时最常用的一种方法。一般采用,内联(join),左联(left join),右联( right join)的方式。这里不多说了,想必大家也都了解。这里我要说的一点是在...

09--MySQL自学教程:多表查询之内连接、外连接以及【子查询】

1.为什么要拆表?去除冗余数据 2.表与表之间的关系

sqlite中如何查询数据库中存在的所有表?(转自:http://topic.csdn.net/u/20081231/16/6aee6233-32c2-4f20-a3d7-0cb154974ce4.)

sqlite中如何查询数据库中存在的所有表? 请指教!!! 官方文档就有。 http://www.sqlite.org/faq.html (7) How do I list all tab...
  • lslxdx
  • lslxdx
  • 2011-11-06 15:56
  • 2262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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