今天学习SQL多表操作。多对多关系的表的建立,可以通过mysql数据库可视化管理工具来进行。在建立多对多关系的表,要先建立一个中间表,把两个表之间的主键放到中间表中,对于中间表,分别设置两个外键关联到这两个表之中。建议先建立多表之间的关系,再往表里面添加数据。
   今天的难点是多表查询,涉及到的重点知识有内连接查询,外连接(左外连接,右外连接)查询,和子查询三个。
   通过多表查询的练习后,个人觉得可以把多个表之间的查询看成一个整体表。因为表与表之间是有关联的,查询几个表的数据同样会得出一张大表。把N个表看成一个整体表,在逻辑上的理解会比较容易。
   另外通过子查询可以把一个复杂的查询转换为多个简单的小查询再进行拼接。

一、多表联合查询:
1.交叉查询:
  
  1).交叉查询是求多个表之间的笛卡儿积的所有情况,比如班级表classes有4个记录(数据),学生表student有9个记录,那么使用交叉查询所得到的就是36个记录。以表student为主表遍历classes表。像java中的二维数组遍历一样。
  交叉查询应用少,在求所有情况才使用。理解即可。

2).格式:
  (1).select * from classes cross join student;
  (2).select * from classes join student;
  (3).select * from student,classes;

其中corss join可以省略。

2.内连接(重点) inner join(inner 可以省略)
   把两个表看作两个集合,内连接就是求两个表交集的那部分。分为两部分:

-显示内连接:在SQL中显示的调用inner join关键字
      语法: select * from 表1 inner join 表2 on 关联条件

举例:
      
      select * from classes c inner join student s on c.cid = s.cno;

查找出c中cid的值等于s中cno的值的所有情况:

比如:cid = 1时,con = 1 有3个记录
           cid = 2时,con = 2 有3个记录
           cid = 3时,con  =3 有2个记录

-隐式内连接:在SQL中没有调用inner join关键字

语法:select * from表1,表2 where 关联条件 
   
      
3.外连接(重点) outter join(outer 可以省略)
    
    - 左外连接:LEFT JOIN 
        语法:select * from 表1 left outer join 表2 on 关联条件
    
        SELECT * from  classes c LEFT JOIN  student  s on c.cid = s.cno;

以左边的classes为主表,得到classes的所有数据。然后得到 c 与 s交集部分的数据;
    
   - 右外连接:RIGHT JOIN
        
        select * from classes c RIGHT JOIN student s on c .cid = s.cno;
  
        以右边的student为主表,先得到student的所有结果,然后再得到c 与s交集部分的数据

4.子查询

一个查询语句条件需要依赖另一个查询语句的结果。

select ename,job from emp y,emp l where y.mgr = l.empo;

多表查询的练习:

1.查询班级名称,和班级总人数

分析:

-1.查班级名称,班级总人数 :select c.cname,count(*) from student s,classes c
    -2.两张表的关联条件: where c.cid = s.cno;
    -3.因为student表里面的记录了学生的班级编号,是个重复的字段。因此要对s.cno分组: group by s.con;
    -4.合并 select c.cname,count(*) from student s,classes c where c.cid = s.cno group by s.con;

2.查询学生的姓名和学生所选的总课程平均成绩。

分析:
    -1.查询学生姓名,所学总课程平均成绩:select s.sname,VAG(sc.score) from  student s, stu_cour sc;

-2.在stu_cour表里求总课程平均成绩:首先 每个学生编号sno是重复的,对这个编号分组,就能得出每个学生所选的课程和成绩:group by sc.sno;

-3.两张表的关联条件: where s.sid = sc.sno;
     
    -4.合并:select s.sname,VAG(sc.score) from  student s, stu_cour sc where s.sid = sc.sno  group by sc.sno;

3.查询学生的姓名和学生的选课总数,显示选课超过2门学生姓名.

分析:当遇到"数目","总数","数":肯定是求数量,求数量就要用到分组统计count(*) 和group by。选课数量超过2门,只能用having关键字来写。

select s.sname,count(*) from from student s,stu_cour sc where s.sid = sc.sno group by sc.cno having count(*)>2;

4.查询平均成绩大于80分的学生的总数。

分析:因为求平均分和总数,这里涉及到两个聚合函数。把它拆分成题1"求平均成绩大于80分的学生",题2"求学生的总数"这两个问题

题1:"求平均成绩大于80分的学生":利用聚合函数 和分组:对stu_cour表中的学生学号sno分组,因为一个学生有一个学生有多个科目和成绩

select sc.sno from stu_cour sc GROUP BY sc.sno HAVING AVG(sc.socre)>80

题2:"学生的总数":select count(*) from student s where s.id =?;

用 in来连接:
select count(*) from student s where s.id in (select sc.sno from stu_cour sc GROUP BY sc.sno HAVING AVG(sc.socre)>80);
   
5.查询学生和平均成绩,但是平均成绩大于01班的任何一个学生的平均成绩。

-题目1:"01班的每个学生的平均成绩":
  学生的平均成绩
  select avg(sc.score) from stu_cour sc group by sc.son;

01班的学生:
  select s.sid from student s,classes c2 where s.cno  = c2.cid And c2.cname = '01班';

拼接:因为是01班的学生 所以通过sid in()来拼接
  select avg(sc.score) from stu_cour sc class group by sc.son where s.sid in (select s.sid from student s,classes c2 where s.cno  = c2.cid And c2.cname = '01班');

大于任何一个学生,应该是最大值了:all()
  查询学生和平均成绩:
  select s.sname,avg(sc.socre) from student s,stu_cour sc group by sc.sno having avg(sc.socre)>any

Java学Web——day09【SQL多表联合查询】相关推荐

  1. SQL 多表联合查询,收藏直接起飞!

    为什么需要多张数据库表进行查询呢?因为如果设计成一张表会造成数据冗余,造成数据库空间浪费,然而有时我们需要将多张表的数据整合并且查询出来,这时就需要通过表之间的主外键关联在一起进行查询. 查看获取表结 ...

  2. 万字详解 | SQL 多表联合查询方法,收藏直接起飞!

    为什么需要多张数据库表进行查询呢?因为如果设计成一张表会造成数据冗余,造成数据库空间浪费,然而有时我们需要将多张表的数据整合并且查询出来,这时就需要通过表之间的主外键关联在一起进行查询. 查看获取表结 ...

  3. postgres sql 多表联合查询_从零学会SQL-多表查询

    之前学习的内容几乎针对单个表进行简单操作,实际工作中可没有这么简单,复杂的表结构和多表数据关联进行分析,这时候需要我们掌握多表查询方法,一如既往,我们先看一下这篇的主要内容: 表的加法 表的联结 联结 ...

  4. 基本功:SQL 多表联合查询的几种方式

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/zt15732625878/article /details/79074123 前言 最近在项目中用到连接查询,连接查询是关系数 ...

  5. SQL 多表联合查询

    很少用join,这次学学,并备忘两篇文章! 转自:http://hcx-2008.javaeye.com/blog/285661 连接查询 通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要 ...

  6. SQL多表联合查询时采用字段模糊匹配

    先说一下背景和要求: 背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容. 要求:实现A表的名称字段和B表的名称字段要模糊匹配. 上图: ...

  7. SQL多表联合查询(交叉连接,内连接,外连接)

    连接查询:     1. CROSS 交叉连接:   交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数乘以第二个表中符合,查询条件的数据行数,例如d ...

  8. SQL 多表联合查询的几种方式

    来源:blog.csdn.net/zt15732625878/article/details/79074123    https://www.jb51.net/article/205675.htm 前 ...

  9. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

  10. hibernate的多表联合查询

    SQL多表联合查询的知识点回顾 /*连接查询      * 交叉连接:交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个      * 表中付汇查询条件的数据行乘以第二个表中符 ...

最新文章

  1. QIIME 2教程. 10数据导出ExportingData(2021.2)
  2. 机器学习梯度下降法举例
  3. Android中Activity的四种启动模式
  4. 【STM32】按键检测实验主要程序代码分析
  5. winform 异步弹窗窗体_玩转控件:重写/重绘Dev中MessageBox弹窗控件
  6. Bootstrap + Thymeleaf——预约维修前端页面设计(UI + JS数据校验 + JSON序列化 + AJAX提交)DEMO
  7. 计算机总体水平情况,学生信息技术起点水平情况调查分析报告
  8. [2013-08-19] nohup的使用
  9. netmiko 记录日志_Pythonnetmiko模块的使用 | 学步园
  10. .net系统自学笔记——数组
  11. 手机c语言有趣的小程序,一个有趣的小程序
  12. WPS安装office自定义项安装期间出错
  13. Python回归分析五部曲(二)—多重线性回归
  14. TCP-Hybla拥塞算法
  15. 数据仓库 Hive 从入门到小牛(一)
  16. 真实数据揭秘游戏主播能否月入100万
  17. 完美解决PC电脑0x0和0x800BFA07等错误,成功加入Windows10/11预览体验计划
  18. python 股票自动交易助手_哪些 Python 库让你相见恨晚?
  19. Echarts-----map(单独省级地图)
  20. 》技术应用:大数据产品体系

热门文章

  1. python中print是什么意思中文-python里print是什么意思
  2. android拉起软键盘,移动端JavaScript拉起软键盘
  3. unable to find account data for the submitted AuthenticationToken
  4. 4595: [Shoi2015]激光发生器
  5. 关于grpc 的keepalive 的一些知识
  6. ROS快速入门第三讲——ROS的Subscriber订阅者
  7. 阿里云mysql1227_Navicat连接阿里云Mysql遇到的的坑
  8. GPU并行计算版函数图像生成器
  9. C#中的Socket
  10. android layout.inflater,LayoutInflater.inflate详解