连接查询,等值和非等值连接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。上语句不执行,原来mysql不支持full join,但是我们可以通过下面的方法来实现,这个叫做集合查询SELECT STUDENT.SNO,SNAME,SSEX,SAGE,SDEPT,CNO,GRADE FROM STUDENT FULL JOIN S ON (STUDENT.SNO=S.SNO);
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');
![]()
SQL语句的各种连接查询
最新推荐文章于 2024-05-26 19:50:30 发布