多表联合查询

多表联合查询

多表联合查询可以通过连接运算实现,而连接运算又可以通过广义笛卡尔积后在进行选择运算来实现。

 

Select 多表联合查询语句

Select 列名 [[,列名]...] from 表名1,表名2,,... Where 查询条件;

 

可以使用as为表或者字段(属性)取别名;

 

Select 列名 [[,列名]...] from 表名1 [as] 别名1,表名2 [as} 别名2,,... Where 查询条件;

Select 列名1 [as] 列别名1 [[,列名2 [as] 列别名2]...] from 表名1 [as] 表别名1,表名2 [as] 表别名2,,... Where 查询条件;

[]”表示其中的内容可以省略;

 

查询条件中要包含连接条件,通过不同的连接条件可以实现等值连接、不等值连接等各种连接。

 

示例:

原表数据:

学生表 student

 

老师表 teacher:

 

课程表 course:

 

选课表 student_course:

 

按“0001”号课程成绩由高到低顺序显示所有学生学号、姓名、成绩(二表连接);

[sql]  view plain  copy
  1. SELECT  
  2.     student.student_id,  
  3.     student.student_name,  
  4.     student_course.score  
  5. FROM  
  6.     student,  
  7.     student_course  
  8. WHERE  
  9.     student.student_id = student_course.student_id  
  10. AND student_course.course_id = '0001'  
  11. ORDER BY  
  12.     student_course.score DESC;  

当两个(多个)表中有相同的字段(属性,列名)时,使用表名(或表别名).列名的形式对查询内容和条件内容进行区分。

运行结果:

 

按“高等数学”课程成绩由高到低顺序显示所有学生姓名、学号、分数、课程名(三表连接);

[sql]  view plain  copy
  1. SELECT  
  2.     st.student_id,  
  3.     st.student_name,  
  4.     sc.score,  
  5.     co.course_name  
  6. FROM  
  7.     student AS st,  
  8.     student_course AS sc,  
  9.     course AS co  
  10. WHERE  
  11.     st.student_id = sc.student_id  
  12. AND sc.course_id = co.course_id  
  13. AND co.course_name = '高等数学'  
  14. ORDER BY  
  15.     sc.score DESC;  

运行结果:

 

查询有薪水差额的任意两位教师(单表连接查询);

[sql]  view plain  copy
  1. SELECT  
  2.     t1.teacher_id AS '教工号1',  
  3.     t1.teacher_name AS '教师姓名1',  
  4.     t2.teacher_id AS '教工号2',  
  5.     t2.teacher_name AS '教师姓名2'  
  6. FROM  
  7.     teacher t1,  
  8.     teacher t2  
  9. WHERE  
  10.     t1.teacher_salary > t2.teacher_salary;  

运行结果:

 

(数据较多,这里只显示一部分)

查询既学过“0001”又学过“0002”号课程的所有学生学号;

[sql]  view plain  copy
  1. SELECT  
  2.     sc1.student_id '学号'  
  3. FROM  
  4.     student_course sc1,  
  5.     student_course sc2  
  6. WHERE  
  7.     sc1.student_id = sc2.student_id  
  8. AND sc1.course_id = '0001'  
  9. AND sc2.course_id = '0002';  

运行结果:

 

查询“0001”号课程比“0002”号课程成绩低的所有学生学号姓名;

[sql]  view plain  copy
  1. SELECT  
  2.     st.student_id '学号',  
  3.     st.student_name '姓名'  
  4. FROM  
  5.     student_course sc1,  
  6.     student_course sc2,  
  7.     student st  
  8. WHERE  
  9.     sc1.student_id = sc2.student_id  
  10. AND sc1.student_id = st.student_id  
  11. AND sc1.course_id = '0001'  
  12. AND sc2.course_id = '0002'  
  13. AND sc1.score < sc2.score;  

运行结果:

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值