目录
重复数据:
字符串函数:
重复数据:
select 列名1,count(1) as count
from 表名
group by 列名1
having count>1 and 其他条件
select 列名1,列名2,count(1) as count
from 表名
group by 列名1,列名2
having count>1 and 其他条件
查询出重复数据的列,进行分组查询。
delete from 表名
where
(列名1,列名2) in (
select a.列名1,a.列名2 from (
select 列名1,列名2
from 表名
group by 列名1,列名2 having count(1) > 1
) a
)
and
id not in (
select b.id from (
select max(id) id
from 表名
group by 列名1,列名2 having count(1) > 1
) b
)
删除重复数据并保留id最大的数据
字符串函数:
CONCAT(s1,s2...sn) | 字符串 s1,s2 等多个字符串合并为一个字符串 |
SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedStrin;
>>>SQL Runoob Gooogle Facebook
CONCAT_WS(x, s1,s2...sn) | 同 CONCAT(s1,s2,...) 函数,但是每个字符串之间要加上 x,x 可以是分隔符 |
SELECT CONCAT_WS("-", "SQL", "Tutorial", "is", "fun!")AS ConcatenatedString;
>>>SQL-Tutorial-is-fun!
FIELD(s,s1,s2...) | 返回第一个字符串 s 在字符串列表(s1,s2...)中的位置 |
SELECT FIELD("c", "a", "b", "c", "d", "e");
>>>3
FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 |
SELECT FIND_IN_SET("c", "a,b,c,d,e");
>>>3
LOCATE(s1,s) | 从字符串 s 中获取 s1 的开始位置 |
POSITION(s1 IN s) | 从字符串 s 中获取 s1 的开始位置 |
FORMAT(x,n) | 函数可以将数字 x 进行格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入。 |
SELECT FORMAT(250500.5634, 2);
>>>250,500.56
INSERT(s1,x,len,s2) | 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 |
SELECT INSERT("google.com", 1, 6, "runoob");
>>>runoob.com
LCASE(s)/LOWER(s) | 将字符串 s 的所有字母变成小写字母 |
UCASE(s)/UPPER(s) | 将字符串转换为大写 |
LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len |
SELECT LPAD('abc',5,'xx');
>>>xxabc
RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len |
MID(s,n,len) | 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len) |
REPLACE(s,s1,s2) | 将字符串 s2 替代字符串 s 中的字符串 s1 |
STRCMP(s1,s2) | 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1 |
SUBSTR(s, start, length)/SUBSTRING(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 |
SUBSTRING_INDEX(s, delimiter, number) | 返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。 如果 number 是正数,返回第 number 个字符左边的字符串。 如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。 |
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1);
>>>c
数字函数:
ACOS(x)/ASIN(x)/ATAN(x) | 求 x 的反余弦值(单位为弧度),x 为一个数值 | |
CEIL(x)/CEILING(x) | 返回大于或等于 x 的最小整数 |
DEGREES(x) | 将弧度转换为角度 degrees |
RADIANS(x) | 将角度转换为弧度 radians |
GREATEST(expr1, expr2, expr3, ...) | 返回列表中的最大值 greatest |
LEAST(expr1, expr2, expr3, ...) | 返回列表中的最小值 least |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)truncate |
日期函数:
ADDDATE(d,n) | 计算起始日期 d 加上 n 天的日期 |
SELECT ADDDATE("2017-06-15", INTERVAL 10 DAY);
>>>2017-06-25
ADDTIME(t,n) | n 是一个时间表达式,时间 t 加上时间表达式 n |
SELECT ADDTIME("2020-06-15 09:34:21", "2:10:5");
>>> 2020-06-15 11:44:26
DATE_ADD(d,INTERVAL expr type) | 计算起始日期 d 加上一个时间段后的日期,type 值可以是:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
- SECOND_MICROSECOND
- MINUTE_MICROSECOND
- MINUTE_SECOND
- HOUR_MICROSECOND
- HOUR_SECOND
- HOUR_MINUTE
- DAY_MICROSECOND
- DAY_SECOND
- DAY_MINUTE
- DAY_HOUR
- YEAR_MONTH
|
DATE_SUB(date,INTERVAL expr type) | 函数从日期减去指定的时间间隔。 |
CURDATE()/CURRENT_DATE() | 返回当前日期 |
CURTIME()/CURRENT_TIME() | 返回当前时间 |
CURRENT_TIMESTAMP()/SYSDATE() | 返回当前日期和时间 |
LOCALTIME()/LOCALTIMESTAMP() | 返回当前日期和时间 |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 |
DATE_FORMAT(d,f) | 按表达式 f的要求显示日期 d |
SELECT DATE_FORMAT('2011-11-11 11-11-11','%Y-%m-%d %r');
>>>2011-11-11 11:11:11 AM
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday |
SELECT DAYNAME('select dayname('2022/10/15');')
>>>Saturday
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期一,以此类推 |
EXTRACT(type FROM d) | 从日期 d 中获取指定的值,type 指定返回的值。 |
FROM_DAYS(n) | 计算从 0000 年 1 月 1 日开始 n 天后的日期 |
select from_days(7894);
>>>0021-08-12
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 |
MAKEDATE(year, day-of-year) | 基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 |
select makedate(2023,55);
>>>2023-02-24
MAKETIME(hour, minute, second) | 组合时间,参数分别为小时、分钟、秒 |
MICROSECOND(date) | 返回日期参数所对应的微秒数 microsecond |
PERIOD_ADD(period, number) | 为 年-月 组合日期添加一个时段 |
PERIOD_DIFF(period1, period2) | 返回两个时段之间的月份差值 |
SEC_TO_TIME(s) | 将以秒为单位的时间 s 转换为时分秒的格式 |
STR_TO_DATE(string, format_mask) | 将字符串转变为日期 |
SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
>>>2017-08-10