SQL子查询、内连接和外连接查询
1.掌握相关。 2.体会各种查询的异同及相互之间的转换,体会各种查询的执行过程,为综合应用打下良好的基础。 ● 查询没有选修指定课程号的学生的学号、姓名、性别、出生日期和级别。课程号由局部变量提供。 declare @Cno char(6); set @Cno='a00002'; select sno as 学号,sname as 姓名,sex as 性别,birthday as 生日,enter_year as 级别 from Student where sno not in(select sno from Select_Course as SC where cno in( select cno from Course where SC.cno=@Cno )); 【SQL子查询、内连接和外连接查询】 在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,它首先执行并返回结果,这个结果再作为外部查询的一部分来处理。在提供的描述中,有两处使用了子查询: 1. `sno not in(select snofrom Select_Course as SCwhere cno in(select cno from Coursewhere SC.cno=@Cno ))` 这里的子查询`select cno from Course where SC.cno=@Cno`首先找出指定课程号的所有课程,然后外层子查询`select snofrom Select_Course as SC where cno in (...)`找出选修了这些课程的学生,最后外部查询通过`not in`操作符找出未选修指定课程的学生信息。 2. `NOT EXISTS ( SELECT * FROM Select_Course AS SC WHERE sno=S.sno and SC.cno=@Cno)` 这里使用了`NOT EXISTS`子查询,检查每个学生是否不存在选修了指定课程的记录。 **内连接(INNER JOIN)** 是一种连接两个表的方式,只返回两个表中匹配的行。在查询中,内连接用于找出选修了指定课程且成绩在80分及以上的学生信息: ```sql SELECT S.sno as 学号, sname as 姓名, sex as 性别, cname, year(getdate())-year(birthday) as 年龄, score AS 成绩 FROM student as S INNER JOIN Select_Course as SC ON S.sno=SC.sno INNER JOIN Course as C ON SC.cno=C.cno WHERE SC.cno=@Cno1 and score>=80 ``` **外连接(LEFT/RIGHT JOIN)** 返回左表或右表的所有行,即使在另一个表中没有匹配的行。在查询中,使用了右外连接找出还未被任何学生选修的课程: ```sql SELECT C.cno AS 课程号, cname AS 课程名称,class_hourse as 学时,study_num as 学分 FROM Select_Course as SC RIGHT OUTER JOIN Course as C ON SC.cno=C.cno WHERE SC.sno IS NULL ``` **自然连接(NATURAL JOIN)** 是一种特殊的内连接,它基于两个表中具有相同名称的列进行连接。虽然例子中没有使用自然连接,但可以理解为它将根据共享列自动匹配并合并两个表的数据。 **总结**: 掌握子查询、内连接和外连接的使用,能够帮助我们更高效地从数据库中提取所需信息。子查询可以在主查询中嵌套,用于筛选或提供条件;内连接用于获取两个表的匹配行;而外连接则保留了所有单边数据,无论是否有匹配。理解这些概念并灵活运用,是数据库查询能力的基础,对于进行复杂的数据分析和报告制作至关重要。
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助