mysql 列转行,合并字段的方法(必看)

 更新时间:2017年03月25日 11:55:19   投稿:jingxian  
下面小编就为大家带来一篇mysql 列转行,合并字段的方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

数据表:

列转行:利用max(case when then)

max---聚合函数 取最大值

(case course when '语文' then score else 0 end) ---判断

as 语文---别名作为列名

SELECT
 `name`,
 MAX(
  CASE 
  WHEN course='语文' THEN
   score
  END
 ) AS 语文,
 MAX(
  CASE 
  WHEN course='数学' THEN
   score
  END
 ) AS 数学, 
 MAX(
  CASE 
  WHEN course='英语' THEN
   score
  END
 ) AS 英语
FROM
 student
GROUP BY `name`
;

合并字段显示:利用group_cancat(course,”:”,”score”)

SELECT
 `name`,
 GROUP_CONCAT(course, ":", score) AS 成绩
FROM
 student
GROUP BY
 `name`;

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。
比较抽象,难以理解。

通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函

数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。

group_concat函数应该是在内部执行了group by语句,这是我的猜测。

1.测试语句:

SELECT
 GROUP_CONCAT(`name`)
FROM
 student
GROUP BY
 `name`;

结果去查找name中去查找哪些值是一样的,如果相等,就全部列出来,以逗号分割进行列出,如下:

group_concat('name')

2.测试:

SELECT
 GROUP_CONCAT(`name`)
FROM
 student
;

结果:

group_concat('name')

上面是否可以证明,group_concat只有与group by语句同时使用才能产生效果? 下面进行了实际测验

3.测试常量对group_concat()的配置影响:

SET @@GROUP_CONCAT_MAX_LEN=4

手册中提到设置的语法是这样的:

SET [SESSION | GLOBAL] group_concat_max_len = val;

两种有什么区别?

SET @@global.GROUP_CONCAT_MAX_LEN=4;
global可以省略,那么就变成了:SET @@GROUP_CONCAT_MAX_LEN=4;

4.使用语句

SELECT
GROUP_CONCAT(`name`)
FROM
student;

结果得到:

group_concat('name')

结论:group_concat()函数需要与group by语句在一起使用,才能得到需要的效果。

原因可以这样理解:group_concat()得到是属于x组的所有成员(函数里面列参数指定需要显示哪些字段)。x组从哪里来?

如果没有group by进行指定,那么根本不知道group_concat()根据哪个分组进行显示出成员。 所以,像上面没有group by子句的时候,就显示了刘备,关羽,张飞,刘备,关羽,张飞,刘备,关羽,张飞。

实际中什么时候需要用到这个函数?

假如需要查询的结果是这样:左边显示组名,右边想显示该组别下的所有成员信息。用这个函数,就可以省去很多事情了。

另外,假如我这样使用:

SELECT
 `name`,
 GROUP_CONCAT(course, ":", score) AS 成绩
FROM
 student
;

意义不大。

group_concat()指定一个列是最好的情况。如果指定了多个列。

SELECT
 `name`,
 GROUP_CONCAT(course, ":", score) AS 成绩
FROM
 student
GROUP BY
 `name`;

那么显示结果类似这样:

group_concat(course,":",score)

以上这篇mysql 列转行,合并字段的方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql锁表和解锁语句分享

    mysql锁表和解锁语句分享

    对于MySQL来说,有三种锁的级别:页级、表级、行级
    2011-09-09
  • mysql类似oracle rownum写法实例详解

    mysql类似oracle rownum写法实例详解

    在本篇文章里小编给大家分享的是关于mysql类似oracle rownum写法以及相关实例内容,需要的朋友们可以学习下。
    2019-09-09
  • mysql 协议的ping命令包及解析详解及实例

    mysql 协议的ping命令包及解析详解及实例

    这篇文章主要介绍了mysql 协议的ping命令包及解析详解及实例的相关资料,这里附有简单实例代码并附下载源码,需要的朋友可以参考下
    2017-01-01
  • MYSQL慢查询与日志的设置与测试

    MYSQL慢查询与日志的设置与测试

    这篇文章主要给大家介绍了关于MYSQL慢查询与日志的设置与测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Mysql 查询JSON结果的相关函数汇总

    Mysql 查询JSON结果的相关函数汇总

    这篇文章主要介绍了Mysql 查询 JSON 结果的相关函数汇总,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL InnoDB如何保证事务特性示例详解

    MySQL InnoDB如何保证事务特性示例详解

    这篇文章主要给大家介绍了关于MySQL InnoDB如何保证事务特性的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 如何用Navicat操作MySQL

    如何用Navicat操作MySQL

    这篇文章主要介绍了如何用Navicat操作MySQL,帮助大家使用可视化工具来连接 MySQL,感兴趣的朋友可以了解下
    2021-05-05
  • MySQL OOM 系统二 OOM Killer

    MySQL OOM 系统二 OOM Killer

    前面一节重点分享了Linux的内存分配策略,基于上述的分配策略,为了规避超售的风险,Linux采了一种OOM Killer的机制,即系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存
    2016-07-07
  • mysql5.7.20 安装配置方法图文教程(win10)

    mysql5.7.20 安装配置方法图文教程(win10)

    这篇文章主要为大家详细介绍了win10下mysql5.7.20 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • mysql同步问题之Slave延迟很大优化方法

    mysql同步问题之Slave延迟很大优化方法

    这篇文章主要介绍了mysql同步问题之Slave延迟很大优化方法,需要的朋友可以参考下
    2016-05-05

最新评论