选择mysql开发的原因_MySQL开发技巧
如何进行行列转换
行转列
场景:报表统计(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开发技巧相关推荐
- mysql运用与实践_MySQL开发与实践 PDF 下载
相关截图: 资料简介: 本书作为MySQL课程的教材,系统全面地介绍了有关MySQL数据库应用开发所涉及的各类知识.全书共分16章,内容包括数据库基础.MySQL概述.MySQL语言基础.数据库和表的 ...
- mysql开发与实践_MySQL开发与实践
原标题:MySQL开发与实践 本书作为MySQL课程的教材,系统全面地介绍了有关MySQL数据库应用开发所涉及的各类知识.全书共分16章,内容包括数据库基础.MySQL概述.MySQL语言基础.数据库 ...
- mysql循环建表_MySQL 开发准则(总结自阿里巴巴开发手册)
命名规范 [强制]对象名称必须用小写或者小写.下划线.数字组成. name;user_name; [强制]对象名称禁止使用 MySQL 保留关键字. 如 ORDER 等 [强制]对象名称要见名知其意, ...
- mysql 36条军规_mysql开发36条军规(转)
(一)核心军规 (1)不在数据库做运算 cpu计算务必移至业务层: (2)控制单表数据量 int型不超过1000w,含char则不超过500w: 合理分表: 限制单库表数量在300以内: (3)控制列 ...
- mysql默认值无效_MySQL开发规范
一.基础规范 1) 使用InnoDB存储引擎 2) 数据库字符集使用UTF8,校对字符集使用utf8_general_ci 3) 所有表.字段都尽量添加注释 4) 库名.表名.字段名使用小写字母,禁止 ...
- 安装mysql初始化失败原因_MySQL安装出错历险记 之 Framework初始化失败
# 问题由来 这次学校要我们自己写一个项目,数据库用MySQL,然后进行一系列的增删改查. 心想着看老师写挺简单的,我先去下载一个MySQL吧,然后问题出现了 我刚刚下载好 MySQL 准备安装,突然 ...
- mysql慢查询原因_mysql 慢查询的原因分析点滴
我们知道Mysql可以log下来运行的比较慢的sql语句. 不过,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在MySQL启动的时候加入一些参数. 如果在my.cnf里面修改,需增 ...
- mysql主从中断原因_MySQL 主从同步中断常见问题
Error_code: 1032 [现象] Last_Error: Could not execute Update_rows event on table kebao.t1; Can't find ...
- mysql 垂直拆分 原因_mysql的水平拆分和垂直拆分 (转)
http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...
- php mysql首字母查询_MySQL应用技巧实现查询汉字的拼音首字母
其实最好的方法还是用 PHP 来取拼音首字母,在 MySQL 里新建一个字段来存放 php 里查询汉字的拼音首字母已经有很多参考的代码了. 现在给出在mysql 里实现的, 测试环境是mysql-5. ...
最新文章
- Ubuntu 14.04 64bit上编译安装MonaServer并测试
- 开放-封闭原则(The Open-Closed Principle,OCP)
- Quartz格式设置说明
- centos7.8源码编译安装nginx1.17.10
- VTK:Filtering之ConstrainedDelaunay2D
- 无法获得锁 /var/lib/dpkg/lock
- 老生常谈.优化linux内核参数
- ORACLE 10046 Trace
- 动态绘制柱状图饼状图
- 网站静态化处理--总述(1)
- 小甲鱼【C语言】《带你学C带你飞》笔记
- Android给图片添加带半透明背景的水印
- 观点| 胡小明:不确定性环境下的智慧城市顶层设计
- 白话大数据--Hash分片
- 来看一看2019年3月中国电商+手游平台用户口碑排行榜
- nginx代理内网服务器的图片服务器
- opencv中 画六边形
- TCP/IP详解学习笔记 这位仁兄写得太好了
- UR机器人TCP通讯示例 详细例程,手把手教会你
- 用 JavaScript 实现手势库 - 实现监听逻辑【前端组件化】
热门文章
- Atitit 项目常见问题 总结 prj prblm sumup 目录 第一章 提升可读性 复杂度简化	2 第二章 结构扁平化	2 第一节 缩短com.xxx.xxx名称	2 第二节 mod转
- Atitit 项目范围管理 目录 1. 应该包含下面过程:启动、范围计划、范围定义、范围核实及范围变更控制	1 1.1. 项目范围管理的五个过程	1 2. 启动过程	1 2.1. 项目章程(如质量、
- Atitit 自然语言处理(NLP)的应用 与 搜索引擎 目录 1.1. 搜索引擎并不是自然语言处理(NLP)的唯一应用。	2 1.2. NLP的应用	2 1.3. 社交网站信息流,	2 1.4.
- Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
- Atitit opencv3.0 3.1 3.2 新特性attilax总结
- Atitit js版本es5 es6新特性
- Atitit.基于dsl的methodinvoker
- atitit。全局变量的设计与实现 java php的异同
- paip.log4j 日志系统 参数以及最佳实践
- paip. C#.NET循环获取不同随机数的方法根据时间