连表查询省略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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前

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