牛客网练习题:https://www.nowcoder.com/activity/oj
行列转换:
可以看出,
# 行转列
SELECT userid,
SUM(IF(`subject`='语文',score,0)) as '语文',
SUM(IF(`subject`='数学',score,0)) as '数学',
SUM(IF(`subject`='英语',score,0)) as '英语',
SUM(IF(`subject`='政治',score,0)) as '政治'
FROM tb_score
GROUP BY userid;
# 列转行
SELECT userid,'语文' AS course,cn_score AS score FROM tb_score1
UNION ALL
SELECT userid,'数学' AS course,math_score AS score FROM tb_score1
UNION ALL
SELECT userid,'英语' AS course,en_score AS score FROM tb_score1
UNION ALL
SELECT userid,'政治' AS course,po_score AS score FROM tb_score1
ORDER BY userid;
附:UNION与UNION ALL的区别(摘):
1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;
2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;
3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多;
参考链接:https://blog.csdn.net/u013982921/article/details/99652485
语法:http://c.biancheng.net/view/2419.html
- group by col1, col2、order by col1 desc, col2 asc
- date_sub(curdate(), interval 1 day) # 昨天
- limit 2,5、limit 5 offset 2 都相当于python的range(2,2+5)从索引为2开始往下取5条
查询执行顺序:
- 1. FROM 和 JOIN:
- 2. WHERE:在数据分组前进行过滤,不能使用col的别名。
- 3. GROUP BY:
- 4. SELECT:对结果col简单筛选
- 5. DISTINCT:如果数据行有重复DISTINCT 将负责排重.
- 6. HAVING:对结果集再次筛选,可以用col的别名。
- 7. ORDER BY:此时可以用AS别名.
- 8. LIMIT / OFFSET:
WHERE HAVING的区别:
- WHERE 在数据分组前进行过滤,不能使用聚合函数,不能使用col的别名。
- HAVING 对分组后的数据进行过滤,可以使用聚合函数,能使用col的别名。
三大范式:
- 第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
- 第二范式(2NF):第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)
- 第三范式(3NF):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
- 参考链接:https://www.cnblogs.com/wsg25/p/9615100.html
事务:https://blog.csdn.net/chuancheng_zeng/article/details/115260591
视图:
- 参考链接:https://blog.csdn.net/HXNLYW/article/details/81669964
- 同步视图到另一个数据库比较麻烦
# TODO:理解索引的原理过程、MYSQL锁
索引原理:https://zhuanlan.zhihu.com/p/113917726
https://www.cnblogs.com/Eva-J/articles/10126413.html#_label1