怎么把这样一个表:
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
###准备工作###
新建一个表a
填入数据
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('0','1991', '1', '1.1');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('1','1991', '2', '1.2');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('2','1991', '3', '1.3');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('3','1991', '4', '1.4');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('4','1992', '1', '2.1');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('5','1992', '2', '2.2');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('6','1992', '3', '2.3');
INSERT INTO a
(id
,year
, month
, amount
) VALUES ('7','1992', '4', '2.4');
##################
答案1:
select year,
(select amount from a as m where month=1 and m.year=a.year) as m1,
(select amount from a as m where month=2 and m.year=a.year) as m2,
(select amount from a as m where month=3 and m.year=a.year) as m3,
(select amount from a as m where month=4 and m.year=a.year) as m4
from a group by year;
运行查询结果为:
+------+--------------------+--------------------+--------------------+--------------------+
| year | m1 | m2 | m3 | m4 |
+------+--------------------+--------------------+--------------------+--------------------+
| 1991 | 1.100000023841858 | 1.2000000476837158 | 1.2999999523162842 | 1.399999976158142 |
| 1992 | 2.0999999046325684 | 2.200000047683716 | 2.299999952316284 | 2.4000000953674316 |
+------+--------------------+--------------------+--------------------+--------------------+
但是写成这样
select year,
(select amount from a as m where month=1 and a.year=a.year) as m1,
(select amount from a as m where month=2 and a.year=a.year) as m2,
(select amount from a as m where month=3 and a.year=a.year) as m3,
(select amount from a as m where month=4 and a.year=a.year) as m4
from a group by year;
就不对了。
很明显表a 和 别名m 并不等同,m.year=a.year 这种用法的原理是什么
别名的生成过程和生成原理没找到资料, 还大神不吝赐教谢谢!
a 和 别名m 并不等同,但是表结构相同或者相似,m.year=a.year 这种用法的原理是多表关联查询条件,即表连接操作。
首先,取别名的含义是代替原先的表名,上述的第二种写法是错误的,因为查询中已经用m代替了a的名称,那么针对于目前的查询表条件中,原先表名a是失效的,暂时不可用。因此a.year代表的是外表a,而不是查询字段中的a。自这里取别名其实是为了区分字段中的a和外层a.
a 和别名m是等同的,一但定义了别名,内表表名会被替换,内表只能由m来表示,也可以以默认形式由mysql自己识别
m.year=a.year == year=a.year
上面两种写法是相同的
而 a.year=a.year 条件两边指向都是外表a的列
select amount from a as m
这句话你可以看成你又创建了一个和a表一样字段,一样数据的m表;
这时候相当于是你操作了两张表,a和m;
select year from a group by year;这一句sql的作用是把所有数据按照年份进行分组,也就是结果只显示表中所存在的所有年份,
想你的数据,就只显示1991和1992两条数据
而子查询中的 select amount from a as m where month=1 and m.year=a.year;相当于把1991和1992这两个查出来的数据
作为查询参数付给了用于查询m表的子查询,目的是统计m表中数据;而m表相当于A表的一个复制,所以就是为了统计a表的数据报表