SQL的掌握程度对于开发很重要,尤其是涉及到多表大数据量的环境,很考验一个人的SQL能力,先实现后优化。
鉴于自己一般的sql水平,在此记录一些日常开发中学习的或即查即用的SQL
1.修改表结构,增加多个字段
alter table table_name
add column column_name1 varchar(100) default null comment "注释",
add column column_name2 varchar(100) default null comment "注释";
2.left join、right join、inner join
1)最近用的比较多的left join,当两表左连接时,on连接字段在多条记录中都有时,会导致查询出多条重复记录,我的解决办法是group by 左表的主键id
2)left join 查询为null值
需求:A left join B,希望得到的是 那些 与B有关联,并且B满足 B.b < c的结果,以及没有与B关联的结果都出来
问题:当以右表的字段作为where条件时,并且没有关联数据时,查询为空
解决①
select A.a,B.b from A left join B on A.c = b.c where A.a > 0 and (B.b is null or B.b < c);
解决②
select A.a,B.b from A left join B on A.c = b.c and B.b < c where A.a > 0;
3.limit的分页查询使用
基本使用 limit ?,?
在筛选查询时,设置limit为第一页,而不是当前页,当limit的偏移量超出了符合掉件的总记录数,就会查询为空列表
4.You can’t specify target table ‘表名’ for update in FROM clause错误
5.update多表联查更新
UPDATE pro_base_knowledge
INNER JOIN (
SELECT
knowledge_id,
COUNT(0) nums
FROM
pro_base_timu_knowledge
GROUP BY
knowledge_id
) b ON pro_base_knowledge.id = b.knowledge_id
SET pro_base_knowledge.timu_num = b.nums
6.count(case when(条件) then 列名 else 列名 end)
sql利用上述标题的语法在一条语句中count出不同条件的值
select c_id,
count(case when status = 0 then 'state' end) as 成功,
count(case when status = 1 then 'state' end) as 失败,
count(case when status = 2 then 'state' end) as 中断
from tableName