MySQL三表联合查询操作举例

目录
  • 一、题目概述
  • 二、查询思路
  • 三、错误总结
  • 附:sql 三个表联合查询(三表左联查询)
  • 总结

一、题目概述

给定三张表(学生表、科目表、成绩表),查出各科成绩最高的学生的信息(学号、姓名、科目名称、成绩)。三张表下所示。

二、查询思路

1.查询出各科的最高成绩

select max(s.`Score`) as MaxScore from score s group by s.`SubjectId`

2.查询出各科的最高成绩及对应的科目和学生编号(关键步骤)

此处通过子查询完成。根据步骤1中查出的最高成绩,再查成绩表中成绩等于最高成绩且科目相对应的记录

select b.* from (
   select max(s.`Score`) as MaxScore,s.`SubjectId` as SubId from score s group by s.`SubjectId`)
   f,score b where b.`SubjectId` = f.SubId and b.`Score` = f.MaxScore

该步骤的结果如下所示:

3. 查询出各科的最高成绩及对应的科目名称和学生编号

步骤2只涉及了成绩表,由于该表不含成绩名称,需要与科目表进行联表查询

SELECT b.`StudentId`,f.SubName,b.`Score` FROM (
   SELECT MAX(s.`Score`) AS MaxScore,s.`SubjectId` AS SubId,sub.`Name` AS SubName
   FROM score s LEFT JOIN SUBJECT AS sub ON s.`SubjectId` = sub.`SubjectNo`
   GROUP BY s.`SubjectId`)f,score b WHERE b.`SubjectId` = f.SubId AND b.`Score` = f.MaxScore

该步骤的结果如下所示:

4. 查询出各科的最高成绩及对应的科目名称和学生姓名

同理,再与学生表进行一次联表查询,查出学生姓名

SELECT stu.Name,t.* FROM
    (SELECT b.`StudentId` AS Sid,f.SubName AS SubName,b.`Score` AS Score FROM
         (SELECT MAX(s.`Score`) AS MaxScore,sub.`SubjectNo` AS SubNo,sub.`Name` AS SubName
          FROM score s LEFT JOIN SUBJECT AS sub ON s.`SubjectId` = sub.`SubjectNo` GROUP BY sub.`SubjectNo`)
    f,score b WHERE b.`StudentId` = f.SubNo AND b.`Score` = f.MaxScore)
t LEFT JOIN student stu ON stu.StudentNo = t.Sid ORDER BY t.Score

最终结果如下:

三、错误总结

完成本题中遇到的一些错误,简单总结以下

对group by的结果理解有问题。下面的SQL查询尝试查出最高成绩对应的学生Id,

SELECT s.`StudentId` AS Sid,
MAX(s.`Score`) AS MaxScore,sub.`Name` AS SubName FROM score s LEFT JOIN SUBJECT AS sub ON s.`SubjectId` =
sub.`SubjectNo` GROUP BY s.`SubjectId`

实际上SQL查出的学生Id都是3,即对应最高成绩的Id是错误的。原因在于group by只是在select的查询结果基础上根据分组指定的关键字进行分组,并将分组后的若干记录的中第一条进行展示,此处正好语数外分组的第一条记录的学生Id都是3,因此是错误的。总结来说group by 只进行了分组,记录中的其他字段需要另外想办法查询。

附:sql 三个表联合查询(三表左联查询)

关于在一个表中显示三个数据库表字段的查询。

首先要找的三个表中字段的对应关系,以哪一张表为主表(其他表字段增添这个主表上)作为显示页面上。

上代码

查询主表:csb_accessories_bjgh的全部,csb_accessories_bjqd表,csb_asset_directory表,的aname,atypes,/assetname,assettypes的字段。

关系:csb_accessories_bjgh.accessoriesid = csb_accessories_bjqd.accessoriesid

以及 csb_accessories_bjgh.assetid = csb_asset_directory.assetid

这是sql代码

SELECT
csb_accessories_bjgh.*,
csb_accessories_bjqd.aname,
csb_accessories_bjqd.atypes,
csb_asset_directory.assetname,
csb_asset_directory.assettypes
FROM
(( csb_accessories_bjgh LEFT JOIN csb_accessories_bjqd ON csb_accessories_bjgh.accessoriesid = csb_accessories_bjqd.accessoriesid ) LEFT JOIN csb_asset_directory ON csb_accessories_bjgh.assetid = csb_asset_directory.assetid )
WHERE
csb_accessories_bjgh.id IS NOT NULL

总结

到此这篇关于MySQL三表联合查询操作的文章就介绍到这了,更多相关MySQL三表联合查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL 数据库聚合查询和联合查询操作

    目录 1. 插入被查询的结果 2. 聚合查询 2.1 介绍 2.2 聚合函数 2.3 group by 子句 2.4 having 3. 联合查询 3.1 介绍 3.2 内连接 3.3 外连接 3.4 自连接 3.5 子查询 3.6 合并查询 1. 插入被查询的结果 语法: insert into 要插入的表 [(列1, ..., 列n)] select {* | (列1, ..., 列n)}from 要查询的表 上述语句可以将要查询的表的某些列插入到新的表中对应的某些列 示例1: 将 stud

  • 详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LE

  • mysql多表联合查询操作实例分析

    本文实例讲述了mysql多表联合查询操作.分享给大家供大家参考,具体如下: MySQL多表联合查询是MySQL数据库的一种查询方式,下面就为您介绍MySQL多表联合查询的语法,供您参考学习之用. MySQL多表联合查询语法: 复制代码 代码如下: SELECT * FROM 插入表 LEFT JOIN 主表 ON t1.lvid=t2.lv_id select * from mytable,title where 表名1.name=表名2.writer ; mysql版本大于4.0,使用UNIO

  • mysql远程跨库联合查询的示例

    目录 情况一2个库在同一台物理主机 情况二2个库不在同一台物理主机(即2个库分别在不同的物理主机) 注意:myemployees库和shoppingCart库在同一台物理主机,如果不在同一台物理主机该怎么办呢?下面我会介绍到. 情况一2个库在同一台物理主机 联合查询(不同的2个库,myemployees库和shoppingCart库),这2个库在同一台物理主机上,都在我本机. #联合查询(不同的2个库,myemployees库和shoppingCart库) SELECT emp01.`emplo

  • 详解MySQL 联合查询优化机制

    MySQL 联合查询执行策略. 以一个 UNION 查询为例,MySQL 执行 UNION 查询时,会把他们当做一系列的单个查询语句,然后把对应的结果放入到临时表中,最终再读出来返回.在 MySQL中,每个独立的查询都是一个联合查询,从临时表读取返回结果也一样. 这种情形下,MySQL 的联合查询执行很简单--它将这里的联合查询当做是嵌套循环的联合查询.这意味着 MySQL 会运行一个循环去从数据表读取数据行,然而在运行一个嵌套循环从下一个表读取匹配的数据行.这个过程一直持续,直到找到联合查询中

  • Mysql两表联合查询的四种情况总结

    一般来说,我们为了得到更完整的结果,我们需要从两个或更多的表中获取结果,我一般都是用select xxx,xxx from 表1,表2 where 表1.xxx=表2.xxx,我们一般都是进行的是这般的操作,其实mysql中还有一种操作,那就是join的操作,例如底下有两个表: 请看 "Persons" 表: 接下来请看 "Orders" 表: 以上的这两个表,然后我们把它们进行连接查询 SELECT Persons.LastName, Persons.FirstN

  • 对MySQL几种联合查询的通俗解释

    表a aid adate 1 a1 2 a2 3 a3 表b bid bdate 1 b1 2 b2 4 b4 两个表a.b相连接,要取出id相同的字段. select * from a inner join b on a.aid = b.bid 这是仅取出匹配的数据. 此时的取出的是: 1 a1 b1 2 a2 b2 那么left join 指: select * from a left join b on a.aid = b.bid 首先取出a表中所有数据,然后再加上与a.b匹配的的数据.

  • MySQL三表联合查询操作举例

    目录 一.题目概述 二.查询思路 三.错误总结 附:sql 三个表联合查询(三表左联查询) 总结 一.题目概述 给定三张表(学生表.科目表.成绩表),查出各科成绩最高的学生的信息(学号.姓名.科目名称.成绩).三张表下所示. 二.查询思路 1.查询出各科的最高成绩 select max(s.`Score`) as MaxScore from score s group by s.`SubjectId` 2.查询出各科的最高成绩及对应的科目和学生编号(关键步骤) 此处通过子查询完成.根据步骤1中查

  • MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    本文实例讲述了MySQL单表查询操作.分享给大家供大家参考,具体如下: 语法 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名                   WHERE 条件                   GROUP BY field                   HAVING 筛选                   ORDER BY field                   LIMIT 限制条数 二.关键字的执行优先级(重点) 重点中的重点:关键

  • Mysql的DQL查询操作全面分析讲解

    目录 DQL简介 具体操作 数据准备 简单查询 运算符 条件查询 排序查询 聚合查询 null值的处理 分组查询 分页查询 insert into select语句 总结 DQL简介 概念:DQL(data query language)数据查询语言 select操作 排序规则: - select 表达式1|字段,.... - from 表名 where 条件 - group by 列名 - having 条件 - order by 列名 asc|desc - limit 位置,数量 语法结构:

  • MySQL聚合查询与联合查询操作实例

    目录 一.聚合查询 1.聚合函数(count,sum,avg...) 2.GROUPBY子句 3.HAVING 二.联合查询((重点)多表) 1.内连接 2.外连接 3.自连接 4.子查询 5.合并查询 总结 一. 聚合查询 1.聚合函数(count,sum,avg...) 常见的统计总数.计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有: 注意最后面都是可以加上where,order by这些语句的,这些聚合函数会根据这些语句的结果集来进行查询 后面最好不要加上limit,因为MyS

  • MySQL 数据库聚合查询和联合查询操作

    目录 1.插入被查询的结果 2.聚合查询 2.1介绍 2.2聚合函数 2.3groupby子句 2.4having 3.联合查询 3.1介绍 3.2内连接 3.3外连接 3.4自连接 3.5子查询 3.6合并查询 1. 插入被查询的结果 语法: insert into 要插入的表 [(列1, ..., 列n)] select {* | (列1, ..., 列n)}from 要查询的表 上述语句可以将要查询的表的某些列插入到新的表中对应的某些列 2. 聚合查询 2.1 介绍 聚合查询:是指对一个数

  • Yii多表联合查询操作详解

    本文针对Yii多表联查进行汇总描述,供大家参考,具体内容如下 1.多表联查实现方法 有两种方式一种使用DAO写SQL语句实现,这种实现理解起来相对轻松,只要保证SQL语句不写错就行了.缺点也很明显,比较零散,而且不符合YII的推荐框架,最重要的缺点在于容易写错. 还有一种便是下面要说的使用YII自带的CActiveRecord实现多表联查 2. 整体框架 我们需要找到一个用户的好友关系,用户的信息放在用户表中,用户之间的关系放在关系表中,而关系的内容则放在关系类型表中.明显的我们只需要以关系表为

  • node.js中 mysql 增删改查操作及async,await处理实例分析

    本文实例讲述了node.js中 mysql 增删改查操作及async,await处理.分享给大家供大家参考,具体如下: 要对mysql进行操作,我们需要安装一个mysql的库. 一.安装mysql库 npm install mysql --save 二.对mysql进行简单查询操作 const mysql = require('mysql'); //创建数据库连接 let conn = mysql.createConnection({ //主机地址 host: '127.0.0.1', //用户

  • MySQL数据库多表操作通关指南(外键约束和多表联合查询)

    目录 1 多表关系 2 外键约束(FOREIGN KEY) 2.1 外键约束说明 2.2 外键约束的创建 2.3 外键约束实操:一对多关系 2.4 删除外键约束 2.5 外键约束实操:多对多关系 3 多表联合查询 3.1 联合查询的简介和分类 3.2 联合查询数据准备 3.3 交叉联合查询 3.4 内连接查询 3.5 外连接查询 3.6 子查询 3.6.1 子查询说明与实操 3.6.2 子查询中的关键字 3.7 自关联查询 写在最后 1 多表关系 一对一关系 比如:一个人有一个身份证,一个身份证

随机推荐