连表查询省略join案例

省去join的多次查询

先看表结构

CREATE TABLE `eb_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `姓名` varchar(50) NOT NULL DEFAULT '',
  `学科` varchar(50) NOT NULL DEFAULT '',
  `成绩` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='测试表';

数据如下

id 姓名 学科 成绩
1 张三 语文 20
2 张三 数学 30
3 张三 英语 50
4 李四 语文 60
5 李四 数学 70
6 李四 英语 90

执行连表sql

  • 不带join写法
    select A.*,B.*,C.* from eb_test A,eb_test B,eb_test C
  • 带join 写法
    select A.*,B.*,C.*
    from eb_test as A join eb_test as B join eb_test as C

    查询的结果如下

    本质上就是笛卡尔积 数据集就是 6 * 6 * 6 = 216 条

id 姓名 学科 成绩 id 姓名 学科 成绩 id 姓名 学科 成绩
1 张三 语文 20 1 张三 语文 20 1 张三 语文 20
2 张三 数学 30 1 张三 语文 20 1 张三 语文 20
3 张三 英语 50 1 张三 语文 20 1 张三 语文 20
4 李四 语文 60 1 张三 语文 20 1 张三 语文 20
5 李四 数学 70 1 张三 语文 20 1 张三 语文 20
6 李四 英语 90 1 张三 语文 20 1 张三 语文 20
1 张三 语文 20 2 张三 数学 30 1 张三 语文 20
2 张三 数学 30 2 张三 数学 30 1 张三 语文 20
3 张三 英语 50 2 张三 数学 30 1 张三 语文 20
4 李四 语文 60 2 张三 数学 30 1 张三 语文 20
5 李四 数学 70 2 张三 数学 30 1 张三 语文 20
6 李四 英语 90 2 张三 数学 30 1 张三 语文 20
1 张三 语文 20 3 张三 英语 50 1 张三 语文 20
2 张三 数学 30 3 张三 英语 50 1 张三 语文 20
3 张三 英语 50 3 张三 英语 50 1 张三 语文 20
4 李四 语文 60 3 张三 英语 50 1 张三 语文 20
5 李四 数学 70 3 张三 英语 50 1 张三 语文 20
6 李四 英语 90 3 张三 英语 50 1 张三 语文 20
1 张三 语文 20 4 李四 语文 60 1 张三 语文 20
2 张三 数学 30 4 李四 语文 60 1 张三 语文 20
3 张三 英语 50 4 李四 语文 60 1 张三 语文 20
4 李四 语文 60 4 李四 语文 60 1 张三 语文 20

数据分析

使用场景

我想查看每个学生的 不同学科的成绩,这个时候可以使用条件去重新组织

1.添加条件

  • 不带join写法
    select A.*,B.*,C.*
    from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名=C.姓名
  • 带 join写法
    select A.*,B.*,C.*
    from eb_test as A join eb_test as B on A.姓名 = B.姓名 join eb_test as C on B.姓名 = C.姓名

    结果如下

    因为添加了姓名相等的,这个时候结果是 54 条数据

对连接表记录进行筛选;得到(333)+(333)=27+27=54条记录

id 姓名 学科 成绩 id 姓名 学科 成绩 id 姓名 学科 成绩
1 张三 语文 20 1 张三 语文 20 1 张三 语文 20
2 张三 数学 30 1 张三 语文 20 1 张三 语文 20
3 张三 英语 50 1 张三 语文 20 1 张三 语文 20
1 张三 语文 20 2 张三 数学 30 1 张三 语文 20
2 张三 数学 30 2 张三 数学 30 1 张三 语文 20
3 张三 英语 50 2 张三 数学 30 1 张三 语文 20
1 张三 语文 20 3 张三 英语 50 1 张三 语文 20
2 张三 数学 30 3 张三 英语 50 1 张三 语文 20
3 张三 英语 50 3 张三 英语 50 1 张三 语文 20
1 张三 语文 20 1 张三 语文 20 2 张三 数学 30
2 张三 数学 30 1 张三 语文 20 2 张三 数学 30
3 张三 英语 50 1 张三 语文 20 2 张三 数学 30
1 张三 语文 20 2 张三 数学 30 2 张三 数学 30
2 张三 数学 30 2 张三 数学 30 2 张三 数学 30
3 张三 英语 50 2 张三 数学 30 2 张三 数学 30
1 张三 语文 20 3 张三 英语 50 2 张三 数学 30
2 张三 数学 30 3 张三 英语 50 2 张三 数学 30
3 张三 英语 50 3 张三 英语 50 2 张三 数学 30
1 张三 语文 20 1 张三 语文 20 3 张三 英语 50
2 张三 数学 30 1 张三 语文 20 3 张三 英语 50
3 张三 英语 50 1 张三 语文 20 3 张三 英语 50
1 张三 语文 20 2 张三 数学 30 3 张三 英语 50
2 张三 数学 30 2 张三 数学 30 3 张三 英语 50
3 张三 英语 50 2 张三 数学 30 3 张三 英语 50
1 张三 语文 20 3 张三 英语 50 3 张三 英语 50
2 张三 数学 30 3 张三 英语 50 3 张三 英语 50
3 张三 英语 50 3 张三 英语 50 3 张三 英语 50
4 李四 语文 60 4 李四 语文 60 4 李四 语文 60
5 李四 数学 70 4 李四 语文 60 4 李四 语文 60
6 李四 英语 90 4 李四 语文 60 4 李四 语文 60
4 李四 语文 60 5 李四 数学 70 4 李四 语文 60
5 李四 数学 70 5 李四 数学 70 4 李四 语文 60
6 李四 英语 90 5 李四 数学 70 4 李四 语文 60
4 李四 语文 60 6 李四 英语 90 4 李四 语文 60
5 李四 数学 70 6 李四 英语 90 4 李四 语文 60
6 李四 英语 90 6 李四 英语 90 4 李四 语文 60
4 李四 语文 60 4 李四 语文 60 5 李四 数学 70
5 李四 数学 70 4 李四 语文 60 5 李四 数学 70
6 李四 英语 90 4 李四 语文 60 5 李四 数学 70
4 李四 语文 60 5 李四 数学 70 5 李四 数学 70
5 李四 数学 70 5 李四 数学 70 5 李四 数学 70
6 李四 英语 90 5 李四 数学 70 5 李四 数学 70
4 李四 语文 60 6 李四 英语 90 5 李四 数学 70
5 李四 数学 70 6 李四 英语 90 5 李四 数学 70
6 李四 英语 90 6 李四 英语 90 5 李四 数学 70
4 李四 语文 60 4 李四 语文 60 6 李四 英语 90
5 李四 数学 70 4 李四 语文 60 6 李四 英语 90
6 李四 英语 90 4 李四 语文 60 6 李四 英语 90
4 李四 语文 60 5 李四 数学 70 6 李四 英语 90
5 李四 数学 70 5 李四 数学 70 6 李四 英语 90
6 李四 英语 90 5 李四 数学 70 6 李四 英语 90
4 李四 语文 60 6 李四 英语 90 6 李四 英语 90
5 李四 数学 70 6 李四 英语 90 6 李四 英语 90
6 李四 英语 90 6 李四 英语 90 6 李四 英语 90

再次加条件

  • 不带join写法
    select A.*,B.*,C.*
    from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名 = C.姓名 and A.学科 = '语文' and B.学科='数学' and C.学科='英语'
  • 带join写法
    select A.*,B.*,C.*
    from eb_test as A join eb_test as B on A.姓名 = B.姓名 join eb_test as C on B.姓名 = C.姓名 where A.学科 = '语文' and B.学科='数学' and C.学科='英语'
id 姓名 学科 成绩 id 姓名 学科 成绩 id 姓名 学科 成绩
1 张三 语文 20 2 张三 数学 30 3 张三 英语 50
4 李四 语文 60 5 李四 数学 70 6 李四 英语 90

优化下

select A.姓名,A.成绩 as 语文成绩,B.成绩 as 数学成绩,C.成绩 as 英语成绩
from eb_test A,eb_test B,eb_test C where A.姓名=B.姓名 and B.姓名 = C.姓名 and A.学科 = '语文' and B.学科='数学' and C.学科='英语'

结果如下

姓名 语文成绩 数学成绩 英语成绩
张三 20 30 50
李四 60 70 90
本作品采用《CC 协议》,转载必须注明作者和本文链接
good good study day day up
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
SELECT
    `name` '姓名',
    SUM( CASE WHEN course = '语文' THEN score ELSE 0 END ) AS '语文成绩',
    SUM( CASE WHEN course = '数学' THEN score ELSE 0 END ) AS '数学成绩',
    SUM( CASE WHEN course = '英语' THEN score ELSE 0 END ) AS '英语成绩' 
FROM
    eb_test 
GROUP BY
    `name`

file

3年前 评论
董雷 (楼主) 3年前
zzzzzzz- (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!