当前位置:   article > 正文

数据库多表链接查询的方式_sql三个表怎么连接查询

sql三个表怎么连接查询

多表联查可以通过连接运算实现,即将多张表通过主外键关系关联在一起进行查询。

分为非等值查询和等值查询:

需要用到的表: 

  1. 学生表:
  2. create table student(
  3. sid int(11),
  4. sname varchar(10),
  5. birthday datetime,
  6. ssex varchar(10),
  7. classid int(11)
  8. )
  9. 成绩表:
  10. create table sc(
  11. sid int(11),
  12. cid int(11),
  13. score decimal(18,1)
  14. )
  15. 课程表:
  16. create table course(
  17. cid int(11),
  18. cname varchar(10),
  19. tid varchar(10)
  20. )
  21. 班级表:
  22. create table class(
  23. classid int(11),
  24. classname varchar(20)
  25. )
  26. 老师表:
  27. create table teacher(
  28. tid int(11)primary key,
  29. tname varchar(10),
  30. tsex tinyint(4),
  31. tbirthday date,
  32. taddress varchar(255),
  33. temail varchar(255),
  34. tmoney decimal(20,2)
  35. )

 

 1.非等值查询(不属于内联):

语法:

select * from1,表2

举例(学生表的数据*班级表的数据*成绩表的数据的数量):

select count(*) from stuednt,class,sc

如上实例,此查询方式的实质是笛卡尔积的应用,若学生表有5行,班级表有2行,成绩表有10行,上例的查询结果便是5*2*10=100行数据。

不推荐使用非等值查询方式,因为当数据量庞大时,使用此方式便会造成大量的数据,从而降低效率。故此方式适用于数据量较小的情况。

 2.等值联查(内联查询): 

语法:

select * from1,表2 where 表1.字段1 =2.字段2......

举例:

select * from student,class where student.classid = class.classid

通过where后面的判断条件来获取需要的数据,主要分为以下三种(内连接、左连接、右连接):

①内联:inner join 

侧重于两个表之间的共性,它的作用是使用链接比较两个或多个表之间的共有数据,然后进行返回。

语法:

  1. select * from1
  2. inner join 表2
  3. on1.字段名 =2.字段名

举例(比如要查询学生的成绩,涉及到两张表:学生表和成绩表,使用内连接查询的数据就是下图红色部分)

  1. select * from student
  2. inner join sc on student.sid=sc.sid

延伸举例(五表联查)

  1. select *from student
  2. inner join sc on student.sid=sc.sid
  3. inner join course on sc.cid=course.cid
  4. inner join teacher on course.tid=teacher.tid
  5. inner join class on student.classid=class.classid

②左外联:left join 

以left join 左边的表(表1)为主表,从左表中返回所有的记录,即便在右表(表2)中没有匹配的行。

on的后面,根据条件进行过滤筛选,再生成临时查询结果。

where的后面,从临时查询结果中再根据条件进行筛选,生成最终结果。

语法:

  1. select * from1
  2. left join 表2
  3. on1.字段1=2.字段1

举例(使用左连接查询的数据就是下图红色部分):  

 

  1. select * from student
  2. left join class
  3. on student.classid=class.classid

 如果是三张表,可以通过两个 left join 来连接,即把前面两张表先 left join 之后当成一张虚拟表,然后再跟第三张表 left join。

③右外联:right join 

以left join 右边的表(表2)为主表,从右表中返回所有的记录,即便在左表(表1)中没有匹配的行。

语法:

  1. select * from1
  2. right join 表2
  3. on1.字段1=2.字段1

举例(使用右连接查询的数据就是下图红色部分):  

 

  1. select * from student
  2. right join class
  3. on student.classid=class.classid

3.举例一些考试的题:

* 根据上面的表结构找到语文分数相同的学生的个数

  1. select score,count(*) from sc
  2. where course=‘语文’
  3. group by score
  4. having count(*) >= 2

查询平均成绩大于70的学生姓名

  1. select sname from sc
  2. group by sname
  3. having avg(score) > 70

 * 查询出每门课都大于80分的学生的姓名

  1. select sname from student
  2. where sid not in
  3. (select sid from sc where score < 80)

 * 查询数学成绩最好的学生姓名

  1. select sname from student,sc
  2. where student.sid = sc.sid and
  3. cid = (select cid from course where cname = '数学')
  4. order by score desc limit 1

* 查询各科成绩平均分,显示课程名称和平均分并按照平均分降序排序 

  1. select cname, avg(score) 平均分 from course,sc
  2. where course.cid = sc.cid
  3. group by course.cid
  4. order by 平均分 desc

* 查询考试超过2门不及格学生的平均成绩 

  1. select avg(score) from sc where sid in
  2. (select sid from sc where score < 60 group by sid having count(*) >=2)

4.拓展发散:

因为举例中有用到子查询,所以简单写一下:子查询和关联查询的区别

子查询就是查询中又嵌套的查询,表连接都可以用子查询,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件,而表连接更适合与查看多表的数据。
子查询不一定需要两个表有关联字段,而连接查询必须有字段关联(所谓的主外键关系)
①表关联的效率要高于子查询,因为子查询走的是笛卡尔积
②表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询

对于数据量多的肯定是用连接查询快些,因为子查询会多次遍历所有的数据(视你的子查询的层次而定),而连接查询只会遍历一次。

但是数据量少的话也就无所谓是连接查询还是子查询,视自己的习惯而定。一般情况下还是用子查询来的好,容易控制。

预祝大家早日成为代码小能手!!!

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号