Luckyxyz
首页
归档
关于
友链
切换模式
返回顶部
首页
技术实践
书斋絮语
说点儿什么
Luckyxyz
首页
技术实践
书斋絮语
说点儿什么
首页
归档
关于
友链
【软考】左右全外连接语句、子查询、带 EXISTS 子查询
技术实践
·
今天
Luckyxyz
左外连接语句 其结果包括第一个命名表(“左” 表,出现在 JOIN 子句的最左边)中的所有行,不包括右表中的不匹配行: ```sql SELECT course.课程名, teacher.姓名 FROM course LEFT JOIN teacher ON (course.任课教师编号 = teacher.教师编号) ``` 右外连接语句 其结果中包括第二个命名表(“右” 表,出现在 JOIN 子句的最右边)中的所有行,不包括左表中的不匹配行 ```sql SELECT course.课程名, teacher.姓名 FROM course RIGHT JOIN teacher ON (course.任课教师编号 = teacher.教师编号) ``` 全外连接 链接结果中包括不匹配的行,即保留不匹配信息,可以使用全外连接。FULL OUTER JOIN,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行 ```sql SELECT course.课程名, teacher.姓名 FROM course FULL JOIN teacher ON (course.任课教师编号 = teacher.教师编号) ``` --- 子查询 一般子查询 一个查询是另一个查询的条件。 select ?from ?where (select ?from ?) 例子,检索 student 表中与学号“105”的学生同年出生的所有学生的学号,姓名和出生日期列 ```sql SELECT 学号, 姓名, YEAR(出生日期) AS '出生年份' FROM student WHERE YEAR(出生日期) = (SELECT YEAR(出生日期) FROM student WHERE 学号 = '105') ``` 例子,检索考试成绩为最高分的学生姓名 ```sql SELECT 姓名 FROM student WHERE 学号 = (SELECT 学号 FROM score WHERE 分数 = (SELECT MAX(分数) FROM score WHERE 分数 IS NOT NULL ) ) ```  一个子查询的返回值为多行时,需要使用 ANY、ALL、IN、NOT IN 等选项,他们与查询条件一起构成返回一组值的子查询 例子,检索选修学生人数多于 5 人的某课程的任课教师姓名 ```sql SELECT 姓名 FROM teacher WHERE 教师编号 IN ( SELECT x.任课教师编号 FROM course x, score y -- 这个查出来的记过就是下面这张大表 WHERE x.课程号 = y.课程号 GROUP BY x.任课教师编号 HAVING COUNT(x.任课教师编号) > 5 -- 统计 任课教师编号的行数,有一行就加一 ) ```  例子,检索选修课程编号为 '3-105' 课程且成绩至少高于选修课程编号为 '3-245' 课程的学生的课程号、学号、分数,并按分数从高到低次序排列 ```sql SELECT 课程号, 学号, 分数 FROM score WHERE 课程号 = '3-105' AND 分数 > ANY ( SELECT 分数 FROM score WHERE 课程号 = '3-245' ) ORDER BY 分数 DESC ``` 例子,检索选修课程编号为 '3-105' 课程且成绩高于选修课程编号为 '3-245' 课程的的学生的课程号、学号、分数 意思是,要选择出选修 3-105 中的分数,全部,大于 3-245 的。就是比如 3-245 的分数有 86,75,68。那么选择出来的 3-105 的分数,必须要大于 所有 3-245 的分数 --- 相关子查询 一般子查询,每个子查询仅执行一次,返回的值为主查询的 WHERE 子句所用。 子查询不只执行一次的:相关子查询 --- 带 EXISTS 测试的子查询 一般用在 WHERE 子句中,其后紧跟一个 SELECT 子查询,从而构成一个条件 EXISTS 代表 存在量词,带有 EXISTS 谓词的子查询不返回任何数据,只返回逻辑真值和逻辑假值。 当子查询的结果不为空集时返回逻辑真值,否则返回逻辑假值  这里先到教师表(上面的表,命名为 a)中 查教师编号,假设拿 804 这个教师编号,去下面的课程表中对应查询,判断是否有这个相等的行。 第一行任课教师编号是 825,没有对应上;第二行任课教师编号是 804,对应上了,意味着存在这样一条记录,那么教师编号 804 这个子查询的结果就不为空,所以就会返回【真】,就会把教师表(表 a)中 804 这一行给选择出来,然后按照投影:姓名、系别,投影出结果:李诚、计算机系 再看 831,拿 831 到表 b 中进行查询,发现 831 跟表 b 中任何一个任课教师的教师编号都不相等,也就是说,这个子查询的结果是空集,那么这个结果就会返回一个【假】,所以就不会把 表 a 831 这一行的姓名和系别投影出来  NOT EXISTS 取非,跟上面的相反。当子查询找到了这样的行,WHERE 条件为 假;当子查询没找到这样的行,则 WHERE 条件为真
软考
取消回复
提交评论
Luckyxyz
我们谈论生活,讨论技术,借由文字,抵达心灵。
热门文章
Obsidian 迁移全记录(又名:纯小白的闭坑指南)
【Kubernetes】第一个实例 - Java Web 应用
新年新气象,关于年终总结,关于未来展望
使用宝塔面板对网站、数据库等进行定时备份到腾讯云 COS 对象存储
2025 年
在细雨中呼喊,在困顿中挣扎
Ubuntu 22.04 server 安装教程
最新评论
山佳Ellen: 有独到的见地,有个性的思想,精彩!
t: 2026 扬帆起航, 喜迎新年,万象更新, 时间旅行,人间探索,...
tls: 赞一个
lovingchina: 我也准备从Joplin迁移到Obsidian,刚好参考你这一篇哈...
tl.s: 很棒的一本书,可以解答很多人们关于人工智能的疑惑。或许未来怎样谁...
tl.s: 很实用 🦆🦆
tl.s: 绘图很清晰,图示质量很高
热门标签
Kubernetes
软考
读书笔记
Linux
Ubuntu
生活随笔
生活
2025
Python3
Debian
Ansible
空间智能
openFuyao
技术实践
在细雨中呼喊
粤ICP备2024349207号