1
我们接着上一篇继续学习哦

子查询

基于集合的子查询

通过INNOTIN 来指明集合

// 查询跟李勇在一个系的同学
// 首先确定李勇所在的系,然后最为查询条件
1> SELECT Sno, Sname, Sdept FROM student
2> WHERE Sdept IN (
3> SELECT Sdept FROM student WHERE Sname="李勇");
4>
5> go
Sno     DSname     DSdept
--------D----------D--------------------
16101132D李勇        D计算机系
16101321D张锦杰       D计算机系

(2 行受影响)
1>

// 如果想排除李勇
1> SELECT Sno, Sname, Sdept FROM student
2> WHERE Sdept IN (
3> SELECT Sdept FROM student WHERE Sname="李勇")
4> AND Sname!="李勇";
5> go
Sno     DSname     DSdept
--------D----------D--------------------
16101321D张锦杰       D计算机系

(1 行受影响)
1>

用IN形式的子查询就是向外层查询的WHERE语句返回一个值的集合

// 查询成绩小于 90的学生的信息
1> SELECT Sno,Sname,Sdept FROM student
2> WHERE Sno IN(
3> SELECT Sno FROM SC
4> WHERE grade < 90);
5> go
Sno     DSname     DSdept
--------D----------D--------------------
13212311D张海        D数学系
16101132D李勇        D计算机系
16101321D张锦杰       D计算机系
16123211D吴斌        D信息系

(4 行受影响)
1>

// 还可以使用内连接
1> SELECT student.Sno,Sname FROM student JOIN SC
2> ON student.Sno = SC.Sno WHERE grade < 90;
3> go
Sno     DSname
--------D----------
13212311D张海
13212311D张海
16101132D李勇
16101132D李勇
16101321D张锦杰
16101321D张锦杰
16123211D吴斌
16123211D吴斌
16123211D吴斌
16123211D吴斌

(10 行受影响)
// 去掉重复即可
// 查找选修了c01并且是计算机系的结果
1> SELECT Sname, Sno, Sdept FROM student
2> WHERE Sno IN(
3> SELECT Sno FROM SC WHERE Cno = "c01")
4> AND Sdept = "计算机系";
5> go
Sname     DSno     DSdept
----------D--------D--------------------
李勇        D16101132D计算机系
张锦杰       D16101321D计算机系
// 查询选修了VB的课程的学生的信息
1> SELECT Sno,Sname FROM student
2> WHERE Sno IN(
3> SELECT Sno FROM SC
4> WHERE Cno IN (
5> SELECT Cno FROM course
6> WHERE Cname ="VB"));
7> go
Sno     DSname
--------D----------
13212311D张海
16101132D李勇
16123211D吴斌

(3 行受影响)
//
1> SELECT Sno 学号, COUNT(*) 选课门数, AVG(grade) 平均成绩
2> FROM SC WHERE Sno IN (
3> SELECT Sno FROM SC JOIN course C
4> ON SC.Cno = C.Cno
5> WHERE Cname="VB")
6> GROUP BY Sno;
7> go
学号      D选课门数       D平均成绩
--------D-----------D-----------
13212311D          3D         89
16101132D          3D         60
16123211D          4D         44

(3 行受影响)

// 子查询首先将SC于course左链接,查找选修了VB的学生的学号
1> SELECT Sno FROM SC JOIN course C
2> ON SC.Cno = C.Cno
3> WHERE Cname="VB";
4> go
Sno
--------
13212311
16101132
16123211

// 然后使用这些学号在SC中查找分组统计
// 最终得到结果

查询语句到此为止啦下面我们将学习数据库的插入和删除操作

插入数据
// 注意括号中的需要一一对应哦
1> INSERT INTO student VALUES ('16201321', '呜呜呜',23, '女','经管');
2> go

(1 行受影响)
1>
// 如果是只插入某几个字段,那么你要注意了哦,其他的字段是否定义为是可以为空
1> INSERT INTO student(Sno,Sname) VALUES ('1620131', 'S哒的撒');
2> go

(1 行受影响)
更新数据

无条件更新

1> UPDATE student SET Sage = Sage + 1;
2> go

(8 行受影响)

有条件的更新

// 
1> UPDATE student SET Sage = 20
2> WHERE Sno = "12122312";
3> go

(1 行受影响)

Meils
1.6k 声望157 粉丝

前端开发实践者