博主在工作中,常常需要使用sql语句来进行查询,总结发现,灵活使用这几个要点,就可以应付大部分简单情况。
一.连接:根据两个或多个表中的列之间的关系,从这些表中查询数据。
- JOIN或INNER JOIN: 返回左表和右表中相互匹配的行
- LEFT JOIN: 返回左表和右表中相互匹配的行,及左表中不相匹配的行
- RIGHT JOIN: 返回左表和右表中相互匹配的行,及右表中不相匹配的行
- FULL JOIN或FULL OUTER JOIN: 返回左表和右表中相互匹配的行,及不相匹配的行
- 应用举例
- 在一些题目中没有明确的暗示情况下,使用哪一种连接方式都可以;
- 也有一些情况,只能使用特定的连接方式。
1.join/inner join
必须使用inner join的情况
1 --查询所有未讲课的教师的Tname和Depart. 2 select TNAME,DEPART 3 from TEACHER 4 where TNO not in(select TEACHER.TNO from COURSE inner join 5 TEACHER on COURSE.TNO=TEACHER.TNO) 6 --或者使用 Except 7 select TNAME,DEPART from TEACHER 8 except 9 select TNAME,DEPART from COURSE join TEACHER on COURSE.TNO=TEACHER.TNO
上面的sql语句中的“select TEACHER.TNO from COURSE inner join TEACHER on COURSE.TNO=TEACHER.TNO”中,只能使用inner join,使用left join、right join、full join都是错误的。
2.left join和right join
使用了left join 的情况,调换一下表的位置,就可以用right join替换;反之亦然。
1 --查询所有学生的Sname、Cname和Degree列。 2 select SNAME,CNAME,DEGREE 3 from STUDENT left join SCORE on STUDENT.SNO=SCORE.SNO 4 left join COURSE on SCORE.CNO=COURSE.CNO
也可以写成
1 select SNAME,CNAME,DEGREE 2 from score right join STUDENT on STUDENT.SNO=SCORE.SNO 3 right join COURSE on SCORE.CNO=COURSE.CNO
3.使用full join的情况较少,暂时还没有用到。
二、嵌套
在sql语言中,一个select-from-where语句成为一个查询块。
将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询成为嵌套查询。
SQL语言允许多层嵌套查询,但要注意的是,子查询的select语句中不能使用order 不要子句,order by子句只能对最终查询结果排序。
当掌握了sql语句的执行顺序后,就会对这个限制的原因有更深刻的理解。
举例
子查询在where子句中
1 --查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 2 select * from SCORE where DEGREE>(select DEGREE from SCORE where SNO='109' and CNO='3-105')
三、子查询
上层的查询块称为外层查询或者父查询,下层查询块称为内层查询或者子查询。
子查询的位置可以很灵活,掌握这一点,感觉sql学习就有了很大的进展。
1.子查询可以放到where子句或having短语的条件中,这就是我们上面所介绍的嵌套查询
2.子查询可以出现在from子句中,这时子查询生成的临时派生表,称为主查询的查询对象
1 --查询所有选修了1号课程的学生姓名 (当然也可以使用嵌套查询) 2 select Sname from Student,(select * from SC where cno='1') SC1 where Student.sno=SC1.sno
3.子查询可以嵌套在INSERT语句中用以生成要插入的批量数据
1 --对每个系,求学生的平均年龄,再把结果插入Dept_age(Sdept,Avg_age)中 2 insert into Dept_age(Sdept,Avg_age) 3 select Sdept.AVG(Sage) 4 from Student 5 group by Sdept
要点总结
1.连接:inner join、right join、left join 、full join
2.嵌套:将一个查询块嵌套在另一个查询块的where子句或having短语的条件中
3.子查询的位置可以很灵活