看大佬们的灵活运用真羡慕....菜鸡只能打好笔记好好学习
select p.training_id,
p.main_title,
p.training_type,
p.lecturer,
from p_training_info p
where p.status = '1'
order by p.training_type,
case when p.training_type = 1 then p.train_start_dttm
else modify_dttm end
UPDATE b_rep a SET a.url =
REPLACE(a.chart_url, 'https', 'http') WHERE a.chart_url LIKE 'https%';
UPDATE b_rep a SET a.url =
CONCAT('http:', a.chart_url) WHERE a.public_url LIKE '//%';
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
https://www.w3school.com.cn/sql/sql_union.asp
在做这个操作时候有两个问题
ALTER TABLE p_email_user MODIFY email VARCHAR (128) DEFAULT NULL COMMENT '邮箱';
将其置为可空,如果第###插入外部邮箱数据到内部
INSERT INTO p_email_user (
email,
user_id,
datasource
)
SELECT
email,
signature_str AS user_id,
'2' as datasource
FROM
p_email_user_external;
select isnull(a,0) as a ,b,c from test
只有当a的值为null的时候,替代为0.
如果是空白也需要这样的话,isnull是没有效果的.
select case when len(a)=0 then 0 else isnull(a,0) end as a ,b,c from test
--这样,可以判断空白和null
不能使用:
<if test="sex=='Y'">
and 1=1
</if>
可以使用的方式有两种方式:
<if test = 'sex== "Y"'>
<if test="sex=='Y'.toString()">
如下sql需要使用cast(col as type)将varchar类型用户id字段转为int类型
SELECT
max(cast(userid AS SIGNED))
FROM
user
type的类型有
value | 描述 |
---|---|
DATE | 日期,格式为 'YYYY-MM-DD'. |
DATETIME | 日期加具体的时间,格式为 'YYYY-MM-DD HH:MM:SS'. |
TIME | 时间,格式为 'HH:MM:SS'. |
CHAR | 字符型 |
SIGNED | int |
UNSIGNED | 无符号int |
BINARY | 二进制型 |
DECIMAL | float型 |
在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯。比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,否则还会执行完全表扫描才 return。效率不言而喻
如果是清空表数据建议直接用 truncate,效率上 truncate 远高于 delete,因为 truncate 不走事务,不会锁表,也不会生产大量日志写入日志文件;truncate table table_name 后立刻释放磁盘空间,并重置 auto_increment 的值。delete 删除不释放磁盘空间,但后续 insert 会覆盖在之前删除的数据上。
delete from t where sex = 1;
如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:
答案: 怎么删除表的前 10000 行。比较多的朋友都选择了第二种方式,即:在一个连接中循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。
推荐第二种:第二种避免了长事务,delete 执行时 MySQL 会将所有涉及的行加写锁和 Gap 锁(间隙锁),所有 DML 语句执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。而本种方法分成多次占用锁,串行执行,不占有锁的间隙其他客户端可以工作,类似于现在多任务操作系统的时间分片调度,大家分片使用资源,不直接影响使用。
第三种效率虽高,但容易锁住同一条记录,发生死锁的可能性比较高
反例:
select * from user where userid=1 or age=18;
正例:
-- 使用 union all
select * from user where userid=1
union all
select * from user where age=18;
`
-- 或者分开两条 SQL写
select * from user where userid=1;
select * from user where age=18;
理由:使用or可能会使索引失效,从而全表扫描。
说明:
对于 or+没有索引的 age 这种情况。假设它走了 userId 的索引,但是走到 age 查询条件时,它还得全表扫描。也就是需要三步过程:全表扫描+索引扫描+合并。如果一开始就走全表扫描,直接一遍扫描就完事。
MySQL 是有优化器的,处于效率与成本考虑,遇到 or 条件,索引可能失效。看起来也合情合理。