例1: 查询每个学生及其选修课程的情况
select *
-> from stu,score
-> where stu.sno=score.sno;
并不会去除重复项
3. 运算中有两种特殊情况,一种称为笛卡尔积连接,另一种称为自然连接。
笛卡尔积
select *
-> from course,score;
4. 如果按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则为自然连接
自然连接表
也就是手动选择删除重复的
select course.cno,cname,sno,sdegree
-> from score,course
-> where course.cno=score.cno;
查询每一门课的间接选修课
以stu表为主体列出每个学生的基本情况以及其选课情况
mysql> select stu.sno,sclass,sname,ssex,sage,cno,sdegree
-> from stu,score
-> where stu.sno=score.sno;
+-----+--------+-------+------+------+-------+---------+
| sno | sclass | sname | ssex | sage | cno | sdegree |
+-----+--------+-------+------+------+-------+---------+
| 101 | 3 | 李军 | 男 | 17 | 3-105 | 64.0 |
| 101 | 3 | 李军 | 男 | 17 | 6-166 | 85.0 |
| 103 | 1 | 陆君 | 男 | 18 | 3-105 | 92.0 |
| 103 | 1 | 陆君 | 男 | 18 | 3-245 | 86.0 |
| 105 | 1 | 匡明 | 男 | 15 | 3-105 | 88.0 |
| 105 | 1 | 匡明 | 男 | 15 | 3-245 | 75.0 |
| 107 | 3 | 王丽 | 女 | 14 | 3-105 | 91.0 |
| 107 | 3 | 王丽 | 女 | 14 | 6-166 | 79.0 |
| 108 | 3 | 曾华 | 男 | 16 | 3-105 | 78.0 |
| 108 | 3 | 曾华 | 男 | 16 | 6-166 | 81.0 |
| 109 | 1 | 王芳 | 女 | 18 | 3-105 | 76.0 |
| 109 | 1 | 王芳 | 女 | 18 | 3-245 | 68.0 |
+-----+--------+-------+------+------+-------+---------+
12 rows in set (0.00 sec)
mysql> select stu.sno,sname
-> from stu,score
-> where stu.sno=score.sno and score.cno='3-105' and score.sdegree>70;
查询等值连接选修了课程的学生的全部信息
mysql> select *
-> from stu inner join score
-> on stu.sno=score.sno;
没有重复项
mysql> select stu.*,cno,sdegree
-> from stu inner join score
-> on stu.sno=score.sno;
内连接,返回查询结果集合中仅是符合查询条件的
外连接,返回不止是这些
mysql> select *
-> from stu left join score
-> on stu.sno=score.sno;
交叉连接不带where子句,它返回被连接的两个表所有数据行的笛卡尔积
mysql> select *
-> from stu cross join course;
mysql> select sclass
-> from stu
-> where sname='王丽';
mysql> select sno,sname
-> from stu
-> where stu.sclass=3;
mysql> select sno,sname,sclass
-> from stu
-> where sclass=
-> (select sclass
-> from stu
-> where sname='王丽');
mysql> select cno,sno
-> from score x
-> where sdegree>=(select avg(sdegree)
-> from score y
-> where y.sno=x.sno);
主查询与子查询用谓词IN连接
【例】:
查询所有选修了6-166号课程的学生的学号、姓名
mysql> select sno,sname
-> from stu
-> where sno in
-> (select sno
-> from score
-> where cno='6-166');