文章目录
- 1.select后对表进行修改(delete)
- 2.函数GROUP_CONCAT()
- 3.使用正则表达式
1.select后对表进行修改(delete)
报错:You can’t specify target table ‘Person’ for update in FROM clause
原因:mysql不能在同一语句中先select出同一表中的某些值,然后对这个表做修改
错误写法
delete from Person
where id not in(
select min(id) id
from Person
group by email
)
解决方法:添加临时表
正确写法
delete from Person
where id not in(
select * from (
select min(id) id
from Person
group by email
) t1
)
2.函数GROUP_CONCAT()
我们可以使用函数 GROUP_CONCAT() 将多行中的多个值组合成一个字符串。下面显示了 GROUP_CONCAT() 函数的语法:
GROUP_CONCAT(
DISTINCT 字段 ----去重
ORDER BY 字段 ----ASC/DESC
SEPARATOR sep ---分隔符: SEPARATOR ','
);
用例
select
sell_date ,
count(distinct product) num_sold ,
group_concat(
distinct product
separator ','
) products
from
Activities
group by
sell_date
3.使用正则表达式
思路
一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。
正则表达式提供各种功能,以下是一些相关功能:
^:表示一个字符串或行的开头
[a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。
[0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。
[a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。
[^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。
[a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。
[a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。
.:匹配任意一个字符。
\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\.。
$:表示一个字符串或行的结尾。
例子
SELECT user_id, name, mail
FROM Users
-- 请注意,我们还转义了`@`字符,因为它在某些正则表达式中具有特殊意义
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';