mysql中的select经验分享 疑难杂症

1.中文字段排序

SELECT * 
FROM tablename 
ORDER BY convert(name using gb2312) ASC

2.如果name字段中含有A字符串,替换成B

UPDATE tablename SET name=replace(name, 'A', 'B'); 

3.将字段name改为name字段的值+A字符串

UPDATE tablename SET name=concat('A');

4.查询以英文逗号隔开的type字段里面是否有A值

SELECT * 
FROM tablename 
WHERE FIND_IN_SET('A',type)

5.time日期格式直接比较时间戳

SELECT * 
FROM tablename 
WHERE unix_timestamp(time)>1568799225

6.按照in的顺序查询出对应的值

SELECT 
* 
FROM tablename 
WHERE 
id IN (7215) 
ORDER BY field(id,7215 )

7.查询左表中以逗号隔开的a字段存在于右表中的值

t1表:

idtitleuserid
10数学2,3
20英语1,4

t2表:

idrealname
1张三
2李四
3王五
4赵六
SELECT 
t1.id,t1.title,GROUP_CONCAT(t2.realname) AS realname 
FROM t1 
LEFT JOIN t2 
ON FIND_IN_SET(t2.id,t1.userid) 
GROUP BY t1.id;

结果:

idtitlerealname
10数学李四,王五
20英语张三,赵六

8.查询右表中某字段包含左表某字段的值

t1表:

idtitleuserid
10数学2,3
20英语1,4

t2表:

idrealname
1张三
2李四
3王五
4赵六
SELECT 
t2.id,t1.realname,t1.title 
FROM t2 
LEFT JOIN t1 
ON FIND_IN_SET(t2.id,t1.userid);

结果:

idtitlerealname
1张三英语
2李四数学
3王五数学
4赵六英语

9.where中使用case判断处理,为了解决列别名无法作为where条件

t1表:

idrealnamerelateIdrelateTableIddeleted
1张三120
2李四330
3王五230
4赵六221

t2表:

idtitlestatus
1语文1
2数学2
3英语1

t3表:

idtitlestatus
1体育1
2美术2
3音乐1
SELECT
	t1.id,
	t1.realname,
	( CASE 
	WHEN t1.relateTableId = 2 THEN t2.title 
	WHEN t1.relateTableId = 3 THEN t3.title 
	END ) AS title
	FROM t1
	LEFT JOIN t2 ON t1.relateId = t2.id
	LEFT JOIN t3 ON t1.relateId = t3.id
	WHERE 
	CASE
	WHEN t1.relateTableId = 2 THEN t2.`status` IN ( '1', '2' ) 
	WHEN t1.relateTableId = 3 THEN t3.`status` IN ( '1', '2') 
	END
	AND
	t1.deleted = 0 
	ORDER BY t1.id asc

结果:

idrealnametitle
1张三语文
2李四音乐
3王五美术

10.中文字段值根据不同值另改为不同数字值后排序

t1表:

idnamescore
1张三良好
2李四良好
3王五优秀
4赵六及格
5贾七优秀
SELECT
	id,
	`name`,
	`score`,
CASE
		`score` 
		WHEN '优秀' THEN
		3 
		WHEN '良好' THEN
		2 
		WHEN '及格' THEN
		1 ELSE 0 
	END score_num 
FROM
	t1 
ORDER BY
	score_num DESC

结果:

idnamescorescore_num
5贾七优秀3
3王五优秀3
2李四良好2
1张三良好2
4赵六及格1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值