以前学连接查询时看的书上举的例子都是没有实际意义的,随便凑上两个表格,只是了解的语法,但却不明白到底为什么要用连接查询,连接查询的好处是什么。最近在学Hibernate,重温sql时想到一个特别好的案例(体会:不学数据库方面的编程,很难学好SQL语句,因为数据库中的数据多数是为程序调用而设计的,不明白从数据库到应用中间这个转换过程,学起来体会的不深)。
学sql语言按知识点学是学不深的,sql是关系型数据库的查询语言,学sql必须从关系入手。所谓关系,其实就是两个对象之间的存在的联系,比如学生和课程这两个独立对象是多对多关系,两者的联系纽带是学生选择课程,从而可以产生一个新表,选修表。sql中复杂的查询与重要的知识点往往都集中在两个对象产生的新表上,所以,抓住派生出来的表,在派生出来的表上多下功夫,就可以学好sql。还有一种是相似对象之间的一对多关系,两者相互独立,又密切相连,比如BBS系统中的主帖和跟帖,两者就像人与人之间上下级关系一样,两个人之间本来是独立的,但因为在一家单位,因为工作而联系在一起(与之相反的则是学生和班级这种一对多关系,两者差别很大)。
案例一:选修表(学生和课程产生的关系)
上了大学以后,不再有纸质的成绩单,每当学期末的时候总是在学校教务系统上查成绩。现在想想,查看全班成绩用的就是连接查询。涉及两个表,学生表和成绩表。用到学生表的学号、姓名字段,成绩表的学号、课程号、成绩字段。模拟实现如下:
表结构:
成绩表:score | 学生表:students | 课程表:courses |
|
|
内连接查询结果:学生表内连接成绩表,按班级筛选
查询语句 | 显示结果 |
select st.name,st.classId,sc.courseId,sc.score from students as st inner join scores as sc on st.id=sc.studentId where st.classId='13'; |
左外连接查询结果:学生表左外连接成绩表,按班级筛选
查询语句 | 显示结果 |
select st.name,st.classId,sc.courseId,sc.score from students as st left outer join scores as sc on st.id=sc.studentId where st.classId='13'; |
右外连接:结果和内连接一样,因为在这个例子中不可能出现有成绩无学生的情况
查询语句 | |
select st.name,st.classId,sc.courseId,sc.score from students as st right outer join scores as sc on st.id=sc.studentId where classId=13; |
案例二:课程表(授课表和班级表产生的关系)源自学生管理系统
案例三:电影主演表(电影与演员产生的关系)源自影片管理系统
案例四:文章分类表(文章和类型产生的关系)源自博客系统