mysql开发技巧笔记
来源:互联网 发布:c语言中 ||是什么意思 编辑:程序博客网 时间:2024/06/09 14:22
行转列
SELECT u1.user_name,SUM(kills) FROM user1 u1JOIN user_kills uk ON u1.id = uk.user_idGROUP BY u1.user_name;
结果
使用 SUM 进行 行转列
SELECT * FROM( SELECT SUM(kills) as '沙僧' FROM user1 u JOIN user_kills uk on u.id = uk.user_id AND u.user_name = '沙僧')a CROSS JOIN( SELECT SUM(kills) as '猪八戒' FROM user1 u JOIN user_kills uk on u.id = uk.user_id AND u.user_name = '猪八戒')b CROSS JOIN( SELECT SUM(kills) as '孙悟空' FROM user1 u JOIN user_kills uk on u.id = uk.user_id AND u.user_name = '孙悟空')cSELECT SUM(case WHEN user_name = '孙悟空' THEN kills END) AS '孙悟空' , SUM(case WHEN user_name = '猪八戒' THEN kills END) AS '猪八戒' , SUM(case WHEN user_name = '沙僧' THEN kills END) AS '沙僧' FROM user1 u JOIN user_kills uk ON u.id = uk.user_id
列转行
应用场景
- 属性拆分
2. etl数据处理
1. 利用序列表处理列转行的数据
SELECT user_name, REPLACE ( SUBSTRING(SUBSTRING_INDEX(mobile, ',', a.id), CHAR_LENGTH(SUBSTRING_INDEX(mobile, ',', a.id - 1)) + 1) ,',','') AS mobileFROM tb_sequence aCROSS JOIN ( SELECT user_name, CONCAT(mobile, ',') AS mobile, LENGTH(mobile) - LENGTH(REPLACE(mobile, ',', '')) + 1 size FROM user1 b) b ON a.id <= b.size
2. 使用union进行列转行
SELECT user_name,'arms' AS equipment,arms AS eq_name FROM user1 u JOIN user1_equipment ue ON u.id = ue.user_idUNION ALL -- union all 如果没有重复 效率更高 SELECT user_name,'clothing' AS equipment,clothing AS eq_name FROM user1 u JOIN user1_equipment ue ON u.id = ue.user_idUNION ALL SELECT user_name,'shoe' AS equipment,shoe AS eq_name FROM user1 u JOIN user1_equipment ue ON u.id = ue.user_idORDER BY user_name
如何在子查询中匹配两个值
常见的子查询使用场景
查询出每一个取经人打怪最多的日期,并列出取经人的姓名,打怪最多的日期和打怪的数量
SELECT u.user_name,uk.timestr,uk.kills as kills FROM user1 u JOIN user_kills uk ON u.id = uk.user_idJOIN ( SELECT user_id,MAX(kills) AS kills FROM user_kills GROUP BY user_id )c ON uk.user_id = c.user_id AND uk.kills = c.kills
同一属性多值过滤
使用关联的方式实现多属性查询(1)
查询 user1_skill
中 同时具备 skill
为 念经
和变化
的取经人
SELECT u.user_name,s1.skill,s2.skillFROM user1 uJOIN user1_skill s1 ON u.id = s1.user_idJOIN user1_skill s2 ON u.id = s2.user_idWHERE s1.skill = '念经' AND s2.skill = '变化'AND s1.skill_level >0 AND s2.skill_level >0
使用关联的方式实现多属性查询(2)
查询 掌握的技能skill
大于等于2的取经人
SELECT u.user_name,s1.skill,s2.skill,s3.skill,s4.skillFROM user1 uLEFT JOIN user1_skill s1 ON u.id = s1.user_id AND s1.skill='念经' AND s1.skill_level > 0LEFT JOIN user1_skill s2 ON u.id = s2.user_id AND s2.skill='变化' AND s2.skill_level > 0LEFT JOIN user1_skill s3 ON u.id = s3.user_id AND s3.skill='腾云' AND s3.skill_level > 0LEFT JOIN user1_skill s4 ON u.id = s4.user_id AND s4.skill='浮水' AND s4.skill_level > 0WHERE (CASE WHEN s1.skill IS NOT NULL THEN 1 ELSE 0 END) + (CASE WHEN s2.skill IS NOT NULL THEN 1 ELSE 0 END) + (CASE WHEN s3.skill IS NOT NULL THEN 1 ELSE 0 END) + (CASE WHEN s4.skill IS NOT NULL THEN 1 ELSE 0 END) >= 2
使用GROUP BY
实现多属性查询
SELECT u.user_nameFROM user1 uJOIN user1_skill s ON u.id = s.user_idWHERE s.skill IN('变化','念经','腾云','浮水') AND s.skill_level > 0GROUP BY u.user_name HAVING COUNT(*) >= 2
如何计算累进税问题
- 先计算出各个区间 有多少钱需要缴税
SELECT user_name,money,low,high,LEAST(money - low,high - low) AS curmoney,rateFROM user1 u JOIN taxrate t ON u.money > t.lowORDER BY user_name,low
2. 将需要缴税部分的钱 乘以 税率
SELECT user_name,SUM(curmoney*rate) moneyFROM( SELECT user_name,money,low,high, LEAST(money - low,high - low) AS curmoney,rate FROM user1 u JOIN taxrate t ON u.money > t.low ORDER BY user_name,low) cGROUP BY user_name
阅读全文
0 0
- mysql开发技巧笔记
- 《MySQL开发技巧》笔记
- MySQL开发技巧学习笔记一
- MySQL开发技巧学习笔记二
- MySQL开发技巧学习笔记三
- MySQL学习笔记后续(开发技巧)
- MySql技巧个人笔记
- MYSQL开发技巧
- 33.mysql 开发技巧
- Mysql开发技巧
- mysql开发技巧
- 开发技巧-MYSQL
- mysql开发技巧1
- mysql开发技巧2
- 开发技巧笔记
- MySQL笔记以及一些技巧
- MySQL和PHP开发技巧
- Mysql之sql开发技巧
- 使用C++模拟动态密码验证
- Rotation effect
- 【四】数组(栈与堆)
- scrapy目录结构
- 排序算法之插入排序
- mysql开发技巧笔记
- LeetCode 0070
- 设计模式笔记2-策略模式
- C++函数调用 入栈以及出栈
- cmd常用命令
- java day03-day05 基础知识梳理
- c++经典题----统计一个文件“is”单词的个数
- String_Sequence(字符串的顺序存储)
- 排序算法之Shell排序(希尔排序)