初始数据
学生表
create table Student(Sid varchar(6), Sname varchar(10), Sage datetime, Ssex varchar(10)); insert into Student values('01' , '小唐' , '2002-07-11' , '男'); insert into Student values('02' , '小喜' , '2002-05-21' , '男'); insert into Student values('03' , '小欢' , '2002-05-21' , '男'); insert into Student values('04' , '小黄' , '2002-02-14' , '女');
成绩表
create table SC(Sid varchar(10), score decimal(18,1)); insert into SC values('01' , 80); insert into SC values('02' , 70); insert into SC values('04' , 50);
大概是这样
连接 表1.相同列=表2.相同列
一听连接这个东西就是把我们相同的列重合在一起,然后形成一个表,大概就是这样,数据结构还是和上一篇讲的一样三层结构
比如说在这里,我想把这两个表连起来,让我还可以看到每一个人的成绩
select Student.Sid,Sname,Sage,Ssex,score from Student, SC where Student.Sid= SC.Sid;
由于我们的sid是两个表都有的,所以说,我们还要去标明他们各自的所属关系,即student.sid和sc.sid。对于那一些我们单独没有重复的列名,我们就可以选择不标
这个时候我们发现一个问题,我们小欢同学的成绩不见了!!!,我们回到上面去看我们的成绩表,sid=3的根本没有学号和成绩,好吧,他根本没有成绩,但是这个时候我们想要他显示怎么办???
左右连接 表名 left/right outer join 表名 on(相同列名)
他和直接连接最大的不同就是,他会显示出没有的数据
右连接
select Student.Sid,Sname,Sage,Ssex,score from Student right outer join sc on(Student.Sid= SC.Sid);
就有人问了,小唐,小唐怎么还是一样的呀,嘿嘿,我还没有说完呢,我们现在的是右连接,只会显示我们右边所有的元组,我们右边是什么,那个是成绩表!!!我们可以交换两边的次序,同时也可以在不改变次序的情况下,使用左连接!!!
左连接
select Student.Sid,Sname,Sage,Ssex,score from Student left outer join sc on(Student.Sid= SC.Sid);
嵌套查询
这个东西,很多老师讲得很复杂,但是我的理解就真的很单纯,先举个例子吧
我们需要查找及格学生的名字!!!必须用嵌套
select Sname from Student where sid in ( select sid from sc where score>=60 );
简单的来说,就是我们在where里面使用a in b(就是a表里面包含b的输出),用下面的式子来查找相应的学号,然后在返回上一级里面的sid查找
不难发现的是,他就是由两个查询的基本结构,组成的
他的最底层的嵌套都可以单独执行,我们看看这个部分
输出的就是我们的符合条件的学号,返回上一级他的逻辑就是这样子来写
是不是一下子就清楚了,就是子循环返回的结果,传递给上一级,然后上一级再去做出选择