例3.42 查询每个学生及其选修课课程的情况

SELECT STUDENT.*,SC.*
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO;


当去掉 where 子句

这就是笛卡尔乘积

例3.50 对例3.49用自然连接完成

SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO;

//若在等值连接中把目标列中重复的属性列去掉则为自然连接

例3.51 查询选修二号课程且成绩在九十分以上的所有学生的学号和姓名

SELECT STUDENT.SNO,SNAME
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO AND SC.CNO='2' AND SC.GRADE>90;

例3.52 查询每一门课的间接先修课(自身链接)

SELECT FIRST.CNO,SECOND.CPNO
FROM COURSE FIRST,COURSE SECOND
WHERE FIRST.CNO=SECOND.CPNO;

// FIRST 和 SECOND 是别名 自身连接相当于把一张表看成两张表 用别分分别表示 然后按照子句来查询

例3.53 外连接

SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE
FROM STUDENT LEFT OUTER JOIN SC ON (STUDENT.SNO=SC.SNO);

例3.54 查询每个学生的学号、姓名、选修的课程名及成绩

SELECT STUDENT.SNO,SNAME,CNAME,GRADE
FROM STUDENT,SC,COURSE
WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO;

嵌套查询

例3.55 查询与刘晨在同一个系的学生

//分两步 查询刘晨在那个系 再查找系里的学生
非嵌套查询

SELECT SDEPT
FROM STUDENT
WHERE SNAME='刘晨';
SELECT SNO,SNAME,SDEPT
FROM STUDENT
WHERE SDEPT='CS';

嵌套查询

SELECT SNO,SNAME,SDEPT
FROM STUDENT
WHERE SDEPT IN(SELECT SDEPTFROM STUDENTWHERE SNAME='刘晨');


子查询不依赖于于父查询 成为不相关子查询

例3.56 查询选修了课程名为信息系统的学生学号和姓名

// 首先在course关系中找出信息系统的课程号为3
然后在SC 关系中找出选修了三号课程的学生学号
最后在student关系中去除sno和sname

SELECT SNO,SNAME
FROM STUDENT
WHERE SNO IN(
SELECT SNO
FROM SC
WHERE CNO IN(
SELECT CNO
FROM COURSE
WHERE CNAME='信息系统')
);

例 3.57找出每个学生超过他自己选修课程平均成绩的课程号

SELECT SNO,CNO
FROM SC X
WHERE GRADE>=(
SELECT AVG(GRADE)
FROM SC Y
WHERE X.SNO=Y.SNO);


这里面 x代表外层 y代表内层 由于内层用到了外层 所以这是一个 相关子查询
类似于 双重循环

带有ANY(some)或ALL 谓词的子查询

例3.58 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

SELECT SNAME, SAGE
FROM STUDENT
WHERE SAGE<ANY(SELECT SAGEFROM STUDENTWHERE SDEPT ='CS')
AND SDEPT !='CS';


或者用聚集函数
只要小于计算机系最大的学生的年龄就可

SELECT SNAME,SAGE
FROM STUDENT
WHERE SAGE<(
SELECT MAX(SAGE)
FROM STUDENT
WHERE SDEPT='CS')
AND SDEPT!='CS';

例3.59 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄

SELECT SNAME,SAGE
FROM STUDENT
WHERE SAGE<ALL(
SELECT SAGE
FROM STUDENT
WHERE SDEPT='CS')
AND SDEPT!='CS';


这个题也可以用聚集函数来做 道理是一样的 找到计算机系最小的学生即可

例3.60查询所有选修了1号课程的学生姓名。

select Sname,Sno
from student
where EXISTS(select *from SCwhere Sno=student.Sno AND Cno='1'
)

EXISTS 语句
相当于存在量词
EXISTI语句的返回值是 ture 或者false
EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

关于 in 和 exists 的区别
参考链接
in
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
看了别人对于in和exists区别的解释
觉得in是从子表和外表的笛卡尔积里选择正确的选项,而exists类似于双重循环 从外查询里选择一个和内查询里匹配

例 3.61查询没有选修1号课程的学生姓名。

select Sname,Sno
from student
where NOT EXISTS(select *from SCwhere Sno=student.Sno AND Cno='1'
)

例3.62 查询选修了全部课程的学生姓名

SQL中没有全称量词 all但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词y个学生及其选修课课程的情况

SELECT STUDENT.*,SC.*
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO

当去掉 where 子句这就是笛卡尔乘积

例3.50 对例3.49用自然连接完成

SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE
FROM SUTDENT.SC
WHERE STUDENT.SNO=SC.SNO;

//若在等值连接中把目标列中重复的属性列去掉则为自然连接

例3.51 查询选修二号课程且成绩在九十分以上的所有学生的学号和姓名

SELECT STUDENT.SNO,SNAME
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO AND SC.CNO='2' AND SC.GRADE>=90;

例3.52 查询每一门课的间接先修课(自身链接)

SELECT FIRST.CNO,SECOND.CPNO
FROM COURSE FIRST,COURSE SECOND
WHERE FIRST.CPNO=SECOND.CNO;

// FIRST 和 SECOND 是别名 自身连接相当于把一张表看成两张表 用别分分别表示 然后按照子句来查询

例3.53 外连接

SELECT STUDENT.SNO,SNO,SNAME,,SSEX,SAGE,SDEPT,CNO,GRADE
FROM STUDENT LEFT OUTER JOIN SC ON (STUDENT.SNO=SC.SNO);

例3.54 查询每个学生的学号、姓名、选修的课程名及成绩

SELECT STUDENT.SNO,SBANE,CNAME,GRADE
FROM STUDENT,SC,COURSE
WHERE STUDENT.SNO=SC.SNO AND SC.CNO=COURSE.CNO;

嵌套查询## 例3.55 查询与刘晨在同一个系的学生//分两步 查询刘晨在那个系 再查找系里的学生非嵌套查询

SELECT SDEPT
FROM STUDENT
WHERE SNAME='刘晨';
SELECT SNO,SNAME,SDEPT
FROM STUDENT
WHERE SDEPT='MA';

嵌套查询

SELECT SNO,SNAME,SDEPT
FROM STUDENT
WHERE SDEPT IN(
SELECT SDEPT
FROM STUDENT
WHERE SNAME='刘晨';

子查询不依赖于于父查询 成为不相关子查询

例3.56 查询选修了课程名为信息系统的学生学号和姓名

// 首先在course关系中找出信息系统的课程号为3 然后在SC 关系中找出选修了三号课程的学生学号 最后在student关系中去除sno和sname cSELECT SNO,SNAMEFROM STUDENTWHERE SNO IN(SELECT SNOFROM SCWHERE CNO IN(SELECT CNOFROM COURSEWHERE CNAME='信息系统'));## 例 3.57找出每个学生超过他自己选修课程平均成绩的课程号cSELECT SNO,CNOFROM SC XWHERE GRADE>=(SELECT AVG(GRADE)FROM SC YWHERE X.SNO=Y.SNO);这里面 x代表外层 y代表内层 由于内层用到了外层 所以这是一个 相关子查询类似于 双重循环# 带有ANY(some)或ALL 谓词的子查询## 例3.58 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄cSELECT SNAME, SAGEFROM STUDENTWHERE SAGE<ANY( SELECT SAGE FROM STUDENT WHERE SDEPT ='CS')AND SDEPT !='CS';或者用聚集函数只要小于计算机系最大的学生的年龄就可cSELECT SNAME,SAGEFROM STUDENTWHERE SAGE<(SELECT MAX(SAGE)FROM STUDENTWHERE SDEPT='CS')AND SDEPT!='CS';## 例3.59 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄sqlSELECT SNAME,SAGEFROM STUDENTWHERE SAGE<ALL(SELECT SAGEFROM STUDENTWHERE SDEPT='CS')AND SDEPT!='CS';这个题也可以用聚集函数来做 道理是一样的 找到计算机系最小的学生即可## 例3.60查询所有选修了1号课程的学生姓名。sqlselect Sname,Snofrom student where EXISTS( select * from SC where Sno=student.Sno AND Cno='1')EXISTS 语句相当于存在量词EXISTI语句的返回值是 ture 或者false EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。 关于 in 和 exists 的区别参考链接in确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。看了别人对于in和exists区别的解释觉得in是从子表和外表的笛卡尔积里选择正确的选项,而exists类似于双重循环 从外查询里选择一个和内查询里匹配## 例 3.61查询没有选修1号课程的学生姓名。sqlselect Sname,Snofrom student where NOT EXISTS( select * from SC where Sno=student.Sno AND Cno='1')

标题例3.62 查询选修了全部课程的学生姓名SQL中没有全称量词 all但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词


相当于没有一门课程是他不选修的

SELECT SNAME
FROM STUDENT
WHERE NOT EXISTS
(SELECT*FROM COURSEWHERE NOT EXISTS(SELECT *FROM SCWHERE SNO=STUDENT.SNOAND CNO=COURSE.CNO)
);

例3.63 查询至少选修了学生201215122选修的全部课程的学生号码


不存在这样的课程y,学生201215122选修了y,而学生x没有选

SELECT DISTINCT SNO
FROM SC SCX
WHERE NOT EXISTS
(SELECT *FROM SC SCYWHERE SCY.SNO='201215122' ANDNOT EXISTS(SELECT* FROM SC SCZWHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO)
);


这个理解起来比较困难
把学生y作为学生201512122 学生x为你要寻找的学生
我的把他想象成一个三重循环 每次从scx里拿出一个学生x, 从scy里选出一个y学生选的课程,在第三个where里判断 x学生和y学生是不是都选修了这门课 如果都选修了话 第三层循环返回一个F给第二层 第二层返回给第一层 T 表面这门课y和x都选了
如果恰好y选的课x都选了
那么最后第一层的结果应该是若干个T 取或 最后的结果就是或
如果有一门课y选了 x没选
那么第三层循环会返回给第二册一个T 第二层再返回给第一层一个F 最后结果应该是T和F 取或 或者干脆都是F 取或 这两种结果最后都是F
说明y选的课X 没选
我是这么理解的 感觉应该是没有问题 如果有问题可以说出来
感觉这个exists是挺难的
以后得多写写

数据库6:连接查询和嵌套查询相关推荐

  1. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

    学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...

  2. 数据库 - 连接查询、嵌套查询、集合查询

    连接查询 连接查询:同时涉及多个表的查询 连接条件或连接谓词:用来连接两个表的条件 一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2> ...

  3. 3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    文章目录 0.前言 1.思维导图 2.Student/SC/Course表数据及结构 3.SELECT语句的一般格式 4.单表查询 (1)选择表中的若干列 ① 查询指定列 ② 查询全部列 ③ 查询经过 ...

  4. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

  5. MySQL 基础 -- 多表关系(一对一、1对多(多对一)、多对多)、多表查询(内连接、外连接、自连接、子查询(嵌套查询)、联合查询 union)、笛卡儿积

    文章目录 1. 多表关系 1.1 一对多 1.2 多对多 1.3 一对一 2. 多表查询 2.1 数据准备 2.2 概述 2.3 笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 示例1:查询每一 ...

  6. 联表查询和嵌套查询—读懂数据库仓储

    数据仓储不像java.C++.JS等开发语言,而是数据库仓储更多用于对接产品工作,查询数据.分析数据.得出产品未来发展方向,与产品经理相关联,而联表查询和嵌套查询作为数据库基础的查询方法,学习使用,方 ...

  7. 实验五 连接查询和嵌套查询

    本实验基于school数据库实现 点击察看school数据库说明 实验五 连接查询和嵌套查询 一.实验目的 1.掌握Management Studio的使用. 2.掌握SQL中连接查询和嵌套查询的使用 ...

  8. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  9. Oracle数据库SQL语句(四)—子查询(嵌套查询)

    Oracle数据库SQL语句(四) 子查询(嵌套查询) 1.单行子查询 SELECT * FROM stuWHERE ID > (SELECT ID FROM stu WHERE NAME =' ...

  10. mysql练习-数据查询之嵌套查询

    将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询. 涉及到多个表的查询,除了可以使用多表连接查询以外,还可以利用嵌套子查询来完成. 由于连接查询比较耗时,当表 ...

最新文章

  1. [转]cocos2d-x
  2. AAAI22奖项公布,9000投稿选出唯一杰出论文,中科院自动化所获Distinguished论文奖...
  3. Angular开发者指南(五)服务
  4. Python实例 -- .git格式转为.png格式
  5. BugkuCTF-社工
  6. linux alsa 音频管理,在Linux上的高级音频控制
  7. Okhttp的封装和回调
  8. 惠普打印机怎么无线连接电脑_惠普打印机连不上无线?怎么解!
  9. 基于FPGA实现ADS1675数据采集
  10. 为什么css效果在本地测试没问题,上传到服务器后却显示位置乱动,css下拉菜单本地正常,上传后360浏览器中显示错位,火狐、IE8显示正常...
  11. 【转载】Android通过ksoap2调用.net(c#)的webservice
  12. 多说评论系统API调用和本地身份说明(JWT)
  13. Spring之事务管理与事务的传播特性
  14. Apache commons lang简介
  15. 六、股票市场分析实战项目一
  16. 智能语音技术的深度解析
  17. 3.ARMv7-M exception model(1)
  18. 谷歌中国开发者网站地址
  19. pycharm申请学生账号收不到邮件问题(不是你收不到而是你没找到,邮件被拦截了)
  20. 一种基于DSP的音频实时处理系统

热门文章

  1. 从零构建知识图谱-第二章知识图谱技术体系
  2. 延边大学计算机专业考研,计算机专业考研成功经验谈
  3. GetAsyncKeyState函数中按键的信息
  4. JuiceFS分布式文件系统源码分析(Java层)
  5. dreamweaver html css,Dreamweaver CC
  6. CodeForces 711C - Coloring Trees DP
  7. Pinyin4J使用方法
  8. CloudComparePCL 点云点匹配(基于点到面的距离)
  9. 【大数据】海量数据处理方法
  10. sqlite常用语句