1、数据库查询 子查询 :在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询。 use northwind select t.orderid, t.customerid from ( select orderid, customerid from orders ) as t go1 use pubs select title, price, (select avg(price) from titles) as average, price-(select avg(price) from titles) as di
2、fference from titles go2 子查询通常与 IN、 Exist谓词及比较运算符结合使用 ( 1) IN子查询格式为:expression NOT IN ( subquery )【 例 】 要查找选修了课程号为 101的课程的学生的情况:SELECT * FROM XSWHERE 学号 IN( SELECT 学号 FROM XS_KC WHERE 课程号 = 101 )在执行包含子查询的 SELECT语句时,系统先执行子查询,产生一个结果表,再执行查询。本例中,先执行子查询:SELECT 学号FROM XS_KCWHERE 课程名 = 1013数据库查询比较子查询格式为:ex
3、pression | = | != | =,!=,!,当比 较 符 为 =时 就是等值连 接。【 例 】 自然连接查询:若在目标列中除去相同的字段名,则为自然连接SELECT XS.* , XS_KC.课程号 , XS_KC.成绩FROM XS , XS_KCWHERE XS.学号 = XS_KC.学号【 例 】 查找选修了 206课程且成绩在 80分以上的学生姓名及成绩。SELECT 姓名 , 成绩FROM XS , XS_KCWHERE XS.学号 = XS_KC.学号 AND 课程号 = 206 AND 成绩 = 807内连接 内连接可以用于多个表的连接【 例 】 查找 XSCJ数据库每
4、个学生的情况以及选修的课程情况。SELECT *FROM XS INNER JOIN XS_KC ON XS.学号 = XS_KC.学号还有一种特例,可以将一个表与它自身进行连接,称为自连接,若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。【 例 】 查找不同课程成绩相同的学生的学号、课程号和成绩。SELECT a.学号 ,a.课程号 ,b.课程号 ,a.成绩FROM XS_KC a JOIN XS_KC b ON a.成绩 =b.成绩 AND a.学号 =b.学号 AND a.课程号 !=b.课程号8外连接 外连接的结果表
5、不但包含满足连接条件的行,还包含相应表中的所有行。外连接包括三种: ( 1)左外连接 (left outer join):结果集中除了包括满足连接条件的行外,还包括左表的所有行; ( 2)右外连接 (right outer join):结果集中除了包括满足连接条件的行外,还包括右表的所有行; ( 3)完全外连接 (full outer join):结果集中除了包括满足连接条件的行外,还包括两个表的所有行; 注:外连接只能对两个表进行。9外连接【 例 】 查找所有学生情况,及他们选修的课程号,若学生未选修任何课,也要包括其情况。SELECT XS.* , 课程号FROM XS LEFT OUTER JOIN XS_KC ON XS.学号 = XS_KC.学号【 例 】 查找被选修了的课程的选修情况和所有开设的课程名。SELECT XS_KC.* , 课程名FROM XS_KC RIGHT JOIN KC ON XS_KC.课程号 = KC.课程号【 例 】 列出学生所有可能的选课情况。SELECT 学号,姓名,课程号,课程名FROM XS CROSS JOIN KC注:外 连 接只能 对 两个表 进 行,交叉 连 接不能有条件,且不能 带 where子句。10