您的位置:首页 > 数据库

SQL语句的各种连接查询

2014-07-28 09:11 417 查看
连接查询,等值和非等值连接
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');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息