SQL不同使用的方法

Posted 牧云的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL不同使用的方法相关的知识,希望对你有一定的参考价值。

        前面学习了部分基础的SQL数据库使用语句,每个语句每个关键字都有属于他们的固定意思和某些固定的搭配。就像count()必须要有group by返回子语句。但是好像在使用中却又并没有那么的死板。下面将拿出几道例题来分享给大家

例如下面

查询所有课程成绩小于60 分的同学

  •     select sno,sname from student s

where s.sno in(

select sc.sno from sc

where sc.score<60)

  •    select st.*,s.score from student st

join sc s on st.sno=s.sno

where s.score <60

这两个查询的结果都正确的但因为序号一的成绩查询是被包括在内部中查询然后再用学生表查询出和他一样sno的数据,所以序号一最终只能显示出小于60分同学的学生姓名学号却无法查询出他们的分数,而序号二中是先用join关联着学生表和成绩表再用where语句比较出成绩数据小于60分的同学,所以序号二可以把分数也查询并显示出来  以下就是①和②的结果对比图     

除了表查询的顺序不同可能会影响着某些结果,但一般里面的条件查询顺序却不会影响,甚至熟悉了那些关键字和对于数据的理解,一些较于复杂的方法都可以简写甚至是省略,比如我想多查寻出对应的课程:

我需要把他们都关联起来,和上面对比无非是多关联了一张表而已,where语句也并没有变化。

select student.sno,sname,score,cname

from student

join sc on sc.sno=student.sno

join course on course.cno=sc.cno

where sc.score<60;

但像这种简单的内连接我们可以直接查询三张不同的表就像我们省略as 一样省略掉join或inner join然后直接用where语句和and连接表之间的关系和判断他们的分数

select t.sno,sname,score,cname 

from student t,sc s,course

where t.sno=s.sno and course.cno=s.cno

and s.score<60

除了以上这些只需要查询判断第二个表的分值,还有稍微更复杂点的例如下面的三个查询方法,这里面需要连接三个表,并且判断第三个表中与之关联的人物。

查询学过「张三」老师授课的同学的信息

这个方法是一层一层嵌套进去的,但写的逻辑却显示查询出老师表并筛选出老师的名字和对应的id,然后括起来变成一个值再查询出课程查询出来的表连接形成专属于只有这个老师课下的课程,再为新的值并再次与成绩表关联得到这个老师所教出来的成绩,然后成为新值,最后和学生表关联最终得到的是学过这个老师的课的学生信息.

select * from Student

where Student.Sid in(

    select Sid from sc s,(

         select c.Cid from Course c,(

             select * from Teacher

             where Teacher.Tname='张三'

         )t

         where t.Tid=c.Tid

    )w

    where w.Cid=s.Cid

);

此方法的逻辑则比较简单明了,首先查询出学生表并where语句判断sid是后面子查询出来的结果,而后面的子查询是查询出成绩表和课程并连接紧接着和教师表连接后用and选择出老师的名字。

select * from student where student.Sid in

(select Sid s from sc s join Course c on c.Cid=s.Cid

join Teacher t on t.Tid=c.Tid and Tname='张三');

这个查询和上面那个一样,只不过这个子查询里的逻辑顺序不同,这里是直接把三个表查询出来再用where语句和and把他们给关联起来并选择找到老师。

select * from student where student.Sid in(

    select Sid from sc,Course,Teacher

    where sc.Cid=Course.Cid

    and Course.Tid=Teacher.Tid

    and Teacher.Tname='张三'

)

以上三个虽然查询方法都不同但是结果都一样,只是相较于第一个方法其他两个会更加的方便和快速,理解后可以更灵活的运用这些代码。

效果对比图:

这是我所学到的SQL,所以我要分享给你们,希望可以帮助到你们。

以上就是我的分享,新手上道,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!

以上是关于SQL不同使用的方法的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 基础之《学生表-教师表-课程表-选课表》

sql面试题(学生表_课程表_成绩表_教师表)

sql面试题(学生表_课程表_成绩表_教师表)

sql面试题(学生表_课程表_成绩表_教师表)

必看,经典sql面试题(学生表_课程表_成绩表_教师表)

SQL多个表联合查询优化的问题