MySQL- sql语句基础

文章目录

1.select后对表进行修改(delete)

报错:You can't specify target table 'Person' for update in FROM clause
原因:mysql不能在同一语句中先select出同一表中的某些值,然后对这个表做修改
错误写法

sql 复制代码
delete from Person 
where id not in(
  select min(id) id
  from Person 
  group by email 
)

解决方法:添加临时表

正确写法

sql 复制代码
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() 函数的语法:

sql 复制代码
GROUP_CONCAT(
    DISTINCT 字段 ----去重
    ORDER BY 字段 ----ASC/DESC
    SEPARATOR sep ---分隔符: SEPARATOR ','
);

用例

sql 复制代码
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 次或多次。
.:匹配任意一个字符。
\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\.。
$:表示一个字符串或行的结尾。

例子

sql 复制代码
SELECT user_id, name, mail
FROM Users
-- 请注意,我们还转义了`@`字符,因为它在某些正则表达式中具有特殊意义
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';

3.DATE_FORMAT()

将日期值格式化为特定格式,请使用DATE_FORMAT函数。 DATE_FORMAT函数的语法如下:

sql 复制代码
DATE_FORMAT(date,format);  ---date 字段,format 需要格式
DATE_FORMAT(trans_date,'%Y-%m')  ---%Y-%m 2023-08
format date
%D 英文后缀如:0th, 1st, 2nd等的一个月之中的第几天
%d 如果是1个数字(小于10),那么一个月之中的第几天表示为加前导加0, 如:00, 01,02, ...31
%H 24小时格式的小时,前导加0,例如:00,01...23
%h 小时,12小时格式,带前导零,例如:01,02 ... 12
%Y 表示年份,四位数,例如2000,2001
%y 表示年份,两位数,例如00,01
%m 具有前导零的月份名称,例如:00,01,02,... 12
%M 月份全名称,例如:January, February,...December
format date
%Y-%m-%d 2017/04/30
%Y-%m 2017/04

4.count() 加条件

  1. COUNT( state='approved' OR NULL ) >需要在后面 + or null

  2. COUNT( IF (state = 'approved', 1, NULL ) )

需要注意的是,count只有在字段数据为NULL时才不计入数量,如果IF (state = 'approved', 1, NULL ) 改为IF (state = 'approved', 1, 0 ) ,那么非 approved的数据也会被计入其中导致错误。

相关推荐
瀚高PG实验室11 分钟前
使用pg_stat_statements抓取数据库TOP SQL
数据库·sql·postgresql·瀚高数据库
Flynt1 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei1 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩2 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
yanwumuxi2 小时前
【数据库系列】opensearch数据备份和恢复
数据库
anxiao_m2 小时前
2026企业AI数字孪生选型攻略,不同场景对应不同解决方案
大数据·网络·数据库
SelectDB2 小时前
从 ClickHouse 迁移到 Doris:SQL 兼容、同步与验证清单(实战笔记)
大数据·数据库·数据分析
小溪学编程2 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
这个DBA有点耶2 小时前
非关系型数据库到底有几种?键值、文档、列族、图,一篇讲透
mysql·架构·nosql
SelectDB2 小时前
Doris 还是 ClickHouse?一张表说清 6 个关键差异(实战笔记)
大数据·数据库·数据分析