SQL语句的各种连接查询

连接查询,等值和非等值连接
SELECT * FROM STUDENT,SC WHERE STUDENT.SNO=SC.SNO;
若在等值连接中把重复的属性列去掉,则为自然连接
SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT,SC WHERE STUDENT.SNO=SC.SNO;
自身连接,查询每一门课的间接先修课
SELECT  A.CNO,B.CPNO FROM COURSE A,COURSE B WHERE A.CPNO=B.CNO;
外连接,在通常的连接操作中,只有符合条件的元祖才能作为结果输出。如上上表中没有200215125学生的信息,原因是他没有选课。但有时我们需要以某个表为主题列出所有元祖的情况,比如说以student表为主体列出所有的学生选课情况,这时候就需要用外连接。
左外连接,也就是说以左边表为主体,不符合条件的情况右边表的属性上填空值,如:
SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT LEFT JOIN SC ON (STUDENT.SNO=SC.SNO);
右外连接,如果右表的某个元祖在左表中找不到匹配值,左表填null。比如说我们查看所有课程被选的情况,其实左外很合理,用右外只是为了演示:
SELECT SNO,SC.CNO,GRADE,CNAME,CCREDIT FROM SC RIGHT JOIN COURSE ON (SC.CNO=COURSE.CNO); 

全部外连接,full join,如果右表的某个元祖在左表中找不到匹配值,左表填null,如果左表的某个元祖在左表中找不到匹配值,右表填null。
SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT FULL JOIN S ON (STUDENT.SNO=S.SNO);
上语句不执行,原来mysql不支持full join,但是我们可以通过下面的方法来实现,这个叫做集合查询
SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT LEFT JOIN S ON (STUDENT.SNO=S.SNO)
UNION
SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT RIGHT JOIN S ON (STUDENT.SNO=S.SNO);

还有一个比较不一样的查询叫做子查询,带有exists谓词的子查询不返回任何数据,只产生逻辑真值或逻辑假值。比如:查询所有选修了1号课程的学生姓名。
SELECT SNAME FROM STUDENT WHERE
EXISTS
(SELECT * FROM SC WHERE SNO=STUDENT.SNO AND CNO='1');





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值