如何进行行列转换

行转列

场景:报表统计(sum())、汇总显示

表数据:

select * from score;

希望达到的效果

cross join

SQL如下:

select a.student_name '学生名', a.score '语文', b.score '数学', c.score '英语' from(select student_name, score from score where course_name='语文') across join(select student_name, score from score where course_name='数学') bcross join(select student_name, score from score where course_name='英语') cwhere a.student_name = b.student_name and b.student_name = c.student_name;

使用case

但是使用case的时候达到的效果不好,如下:

SQL如下:

select student_name '学生名',case when course_name = '语文' then score end '语文',case when course_name = '数学' then score end '数学',case when course_name = '英语' then score end '英语'

from score;

解决方案:在case的基础上使用分组,并使用sum()函数,SQL如下:

selectstudent_name,sum(case

when course_name = '语文' thenscoreelse 0

end) '语文',sum(case

when course_name = '数学' thenscoreelse 0

end) '数学',sum(case

when course_name = '英语' thenscoreelse 0

end) '英语'

fromscoregroup by student_name;

列转行

场景:属性拆分

表数据:

select * from interest;

希望达到的效果

SQL如下:

--需要使用序列表处理列转行的数据

create tabletb_sequence(

idint primary keyauto_increment

);--取决于逗号分割的数据量,这里兴趣爱好最多的就四个,那就暂时插入4条数据

insert into tb_sequence values(), (), (), ();select student_name '学生名', replace(substr(substring_index(interesting, ',', a.id), char_length(substring_index(interesting, ',', a.id - 1)) + 1), ',', '') '兴趣爱好'

fromtb_sequence across join(select student_name, concat(interesting, ',') interesting, length(interesting) - length(replace(interesting, ',', '')) + 1 size frominterest) bon a.id <= b.size;

场景:多列转行

表数据:

select * from student_dress;

希望达到的效果:

union all

SQL如下:

select student_name, 'cap' as '类别', cap '名称' fromstudent_dressunion all

select student_name, 'clothing' as '类别', clothing '名称' fromstudent_dressunion all

select student_name, 'pants' as '类别', pants '名称' fromstudent_dressunion all

select student_name, 'shoe' as '类别', shoe '名称' from student_dress order by student_name;

使用case

希望达到的效果:

SQL如下:

select student_name '学生名', coalesce(case when b.id = 1 then cap end,case when b.id = 2 then clothing end,case when b.id = 3 then pants end,case when b.id = 4 then shoe end)'名称' from student_dress a cross join tb_sequence b where b.id <= 4 order by student_name;

希望添加类别上去:

SQL如下:

select student_name '学生名',case

when b.id = 1 then 'cap'

when b.id = 2 then 'clothing'

when b.id = 3 then 'pants'

when b.id = 4 then 'shoe' end '类别',coalesce(case

when b.id = 1 thencapwhen b.id = 2 thenclothingwhen b.id = 3 thenpantswhen b.id = 4 then shoe end)'名称' from student_dress a cross join tb_sequence b where b.id <= 4 order by student_name;

如何生成唯一序列号

场景:数据库主键、业务序列号如发票号、车票号、订单号等。。。

生成序列号的方法:

MySQL:AUTO_INCREMENT

SQLServer:INDENTIDYTY/SEQUENCE

Oracle:SEQUENCE

PgSQL: SEQUENCE

优先选择系统提供的序列号生成方式

在特殊情况下可以使用SQL方式生成序列号

如何删除重复数据

产生数据重复的原因:

人为原因,如复录入数据,重复提交等。。。

系统原因,由于系统升级或者设计的原因使原来可以重复的数据变为不重复了

如何查询数据是否重复:

利用group by和having从句处理

如何处理重复的数据:

删除重复的数据,对于相同数据保留ID最大的

--创建测试删除重复数据表

CREATE TABLE`test_repeat` (

`id`bigint(20) NOT NULLAUTO_INCREMENT,

`name`varchar(45) NOT NULL,PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;--执行至少两次,这里执行两次即可

insert into test_repeat(name) values('Jef');--查询出的内容为执行的上处插入的条数

select * from test_repeat where name = 'Jef';--1、先把需要删除的数据查出来:

select a.id, a.name from test_repeat a join(select name, count(*) cnt, max(id) maxIdfromtest_repeatgroup by name having cnt > 1) b on a.name = b.name where a.id

delete a from test_repeat a join(select name, count(*) cnt, max(id) maxIdfromtest_repeatgroup by name having cnt > 1) b on a.name = b.name where a.id

select * from test_repeat;

如何在子查询中匹配两个值

常见的子查询使用场景

使用子查询可以避免由于子查询中的数据产生的重复

例子:

查询在超市购买过商品的学生名

select student_name '学生名' from student where student_id in(select student_id from student_shopping);

实现了去重

但是如果不用子查询,使用内连接

select student_name '学生名' from student s join student_shopping sp on s.student_id = sp.student_id;

这样购买了几件商品就会显示几次

可以使用distinct去重

select distinct student_name '学生名' from student where student_id in(select student_id from student_shopping);

使用子查询更符合语意,更好理解

查询出每一个学生购物种类最多的日期,并列出学生名,购物日期,购物种类

SQL如下:

select a.student_name '学生名', b.buy_date '购买日期', b.maxNum '购买种类' from student a join (select student_id, max(num) maxNum, buy_date from student_shopping group by student_id) b on a.student_id = b.student_id;

多列过滤的使用场景:

MySQL中独有的多列过滤方式

SQL如下,效果跟上图一样:

select a.student_name '学生名', b.buy_date '购买日期', b.num '购买种类' from student a join student_shopping b on a.student_id =

b.student_id where (b.student_id, b.num) in (select student_id, max(num) from student_shopping group by student_id);

如何解决同一属性的多值过滤

什么是同一属性的多值过滤

查询出含有Java技能并且技能等级>3的学生名、技能和技能等级

SQL如下:

select a.student_name '学生名', b.skill_name '技能名称', b.skill_level '技能等级' from student a join student_skill b on a.student_id = b.student_id where b.skill_name = 'Java' and b.skill_level > 3;

选择mysql开发的原因_MySQL开发技巧相关推荐

  1. mysql运用与实践_MySQL开发与实践 PDF 下载

    相关截图: 资料简介: 本书作为MySQL课程的教材,系统全面地介绍了有关MySQL数据库应用开发所涉及的各类知识.全书共分16章,内容包括数据库基础.MySQL概述.MySQL语言基础.数据库和表的 ...

  2. mysql开发与实践_MySQL开发与实践

    原标题:MySQL开发与实践 本书作为MySQL课程的教材,系统全面地介绍了有关MySQL数据库应用开发所涉及的各类知识.全书共分16章,内容包括数据库基础.MySQL概述.MySQL语言基础.数据库 ...

  3. mysql循环建表_MySQL 开发准则(总结自阿里巴巴开发手册)

    命名规范 [强制]对象名称必须用小写或者小写.下划线.数字组成. name;user_name; [强制]对象名称禁止使用 MySQL 保留关键字. 如 ORDER 等 [强制]对象名称要见名知其意, ...

  4. mysql 36条军规_mysql开发36条军规(转)

    (一)核心军规 (1)不在数据库做运算 cpu计算务必移至业务层: (2)控制单表数据量 int型不超过1000w,含char则不超过500w: 合理分表: 限制单库表数量在300以内: (3)控制列 ...

  5. mysql默认值无效_MySQL开发规范

    一.基础规范 1) 使用InnoDB存储引擎 2) 数据库字符集使用UTF8,校对字符集使用utf8_general_ci 3) 所有表.字段都尽量添加注释 4) 库名.表名.字段名使用小写字母,禁止 ...

  6. 安装mysql初始化失败原因_MySQL安装出错历险记 之 Framework初始化失败

    # 问题由来 这次学校要我们自己写一个项目,数据库用MySQL,然后进行一系列的增删改查. 心想着看老师写挺简单的,我先去下载一个MySQL吧,然后问题出现了 我刚刚下载好 MySQL 准备安装,突然 ...

  7. mysql慢查询原因_mysql 慢查询的原因分析点滴

    我们知道Mysql可以log下来运行的比较慢的sql语句. 不过,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在MySQL启动的时候加入一些参数. 如果在my.cnf里面修改,需增 ...

  8. mysql主从中断原因_MySQL 主从同步中断常见问题

    Error_code: 1032 [现象] Last_Error: Could not execute Update_rows event on table kebao.t1; Can't find ...

  9. mysql 垂直拆分 原因_mysql的水平拆分和垂直拆分 (转)

    http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...

  10. php mysql首字母查询_MySQL应用技巧实现查询汉字的拼音首字母

    其实最好的方法还是用 PHP 来取拼音首字母,在 MySQL 里新建一个字段来存放 php 里查询汉字的拼音首字母已经有很多参考的代码了. 现在给出在mysql 里实现的, 测试环境是mysql-5. ...

最新文章

  1. Ubuntu 14.04 64bit上编译安装MonaServer并测试
  2. 开放-封闭原则(The Open-Closed Principle,OCP)
  3. Quartz格式设置说明
  4. centos7.8源码编译安装nginx1.17.10
  5. VTK:Filtering之ConstrainedDelaunay2D
  6. 无法获得锁 /var/lib/dpkg/lock
  7. 老生常谈.优化linux内核参数
  8. ORACLE 10046 Trace
  9. 动态绘制柱状图饼状图
  10. 网站静态化处理--总述(1)
  11. 小甲鱼【C语言】《带你学C带你飞》笔记
  12. Android给图片添加带半透明背景的水印
  13. 观点| 胡小明:不确定性环境下的智慧城市顶层设计
  14. 白话大数据--Hash分片
  15. 来看一看2019年3月中国电商+手游平台用户口碑排行榜
  16. nginx代理内网服务器的图片服务器
  17. opencv中 画六边形
  18. TCP/IP详解学习笔记 这位仁兄写得太好了
  19. UR机器人TCP通讯示例 详细例程,手把手教会你
  20. 用 JavaScript 实现手势库 - 实现监听逻辑【前端组件化】

热门文章

  1. Atitit 项目常见问题 总结 prj prblm sumup 目录 第一章 提升可读性 复杂度简化 2 第二章 结构扁平化 2 第一节 缩短com.xxx.xxx名称 2 第二节 mod转
  2. Atitit 项目范围管理 目录 1. 应该包含下面过程:启动、范围计划、范围定义、范围核实及范围变更控制 1 1.1. 项目范围管理的五个过程 1 2. 启动过程 1 2.1. 项目章程(如质量、
  3. Atitit 自然语言处理(NLP)的应用 与 搜索引擎 目录 1.1. 搜索引擎并不是自然语言处理(NLP)的唯一应用。 2 1.2. NLP的应用 2 1.3. 社交网站信息流, 2 1.4.
  4. Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
  5. Atitit opencv3.0  3.1 3.2 新特性attilax总结
  6. Atitit js版本es5 es6新特性
  7. Atitit.基于dsl的methodinvoker
  8. atitit。全局变量的设计与实现 java php的异同
  9. paip.log4j 日志系统 参数以及最佳实践
  10. paip. C#.NET循环获取不同随机数的方法根据时间