join行转列,union列转行

1、join行转列

成绩表grades1,添加数据

CREATE TABLE `grades1` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(20) DEFAULT NULL COMMENT '姓名',
  `subject` varchar(20) DEFAULT NULL COMMENT '学科',
  `score` int(4) DEFAULT NULL COMMENT '成绩',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (1, 'lyy', '英语', 100);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (2, 'lyy', '数学', 98);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (3, 'lyy', '语文', 97);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (4, 'gss', '英语', 89);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (5, 'gss', '数学', 88);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (6, 'gss', '语文', 87);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (7, 'liming', '英语', 79);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (8, 'liming', '数学', 77);
INSERT INTO `grades1`(`id`, `name`, `subject`, `score`) VALUES (9, 'liming', '语文', 75);

表grades1原数据

表数据

查询sql

-- 1.使用 join on 查询
SELECT yw.name,yw.score '语文',sx.score '数学',yy.score '英语'
FROM
(SELECT NAME,score FROM grades1 WHERE SUBJECT='语文') yw JOIN
(SELECT NAME,score FROM grades1 WHERE SUBJECT='数学') sx JOIN
(SELECT NAME,score FROM grades1 WHERE SUBJECT='英语') yy
ON yw.name=sx.name AND sx.name=yy.name

-- 2.使用 join using 查询
SELECT yw.name,yw.score '语文',sx.score '数学',yy.score '英语'
FROM
(SELECT NAME,score FROM grades1 WHERE SUBJECT='语文') yw JOIN
(SELECT NAME,score FROM grades1 WHERE SUBJECT='数学') sx USING(NAME) JOIN
(SELECT NAME,score FROM grades1 WHERE SUBJECT='英语') yy USING(NAME)

查询结果


注意:以上join连接语句使用了join buffer缓冲区进行查询,可以使用执行计划EXPLAIN进行查看
join buffer

2、union列转行

成绩表grades2,添加数据

CREATE TABLE `grades2` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(20) DEFAULT NULL COMMENT '姓名',
  `语文` int(4) DEFAULT NULL COMMENT '语文',
  `数学` int(4) DEFAULT NULL COMMENT '数学',
  `英语` int(4) DEFAULT NULL COMMENT '英语',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `grades2`(`id`, `name`, `语文`, `数学`, `英语`) VALUES (1, 'lyy', 88, 89, 87);
INSERT INTO `grades2`(`id`, `name`, `语文`, `数学`, `英语`) VALUES (2, 'gss', 93, 92, 91);
INSERT INTO `grades2`(`id`, `name`, `语文`, `数学`, `英语`) VALUES (3, 'liu', 99, 88, 77);

表grades2原数据

查询sql

SELECT NAME,'语文' SUBJECT,语文 score FROM grades2  -- '语文',该列为自加列subject;语文,该列为成绩score
UNION ALL
SELECT NAME,'数学' SUBJECT,数学 score FROM grades2
UNION ALL
SELECT NAME,'英语' SUBJECT,英语 score FROM grades2

注意:union与union all的区别:union在表关联的时候会自动进行去重操作,union all关联所有数据(包含重复);
在没有去重需求时,建议使用union all,效率较高

查询结果

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值