连表查询省略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 协议》,转载必须注明作者和本文链接