1、CONCAT(str1,str2,...)
返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。
select CONCAT('My', 'S', 'QL');
select CONCAT('My', NULL, 'QL');
运行结果
MySQL
Null
2 LENGTH(str) 返回字符串str的长度.
select LENGTH('text');
//结果:4
select studentname,phone,length('phone')from student;
//结果:phone的长度是多少就多少,phone这个字段式9为号码就是9,是11位号码就是11
//查询phone这个字段长度为11的行
select studentname ,phone from student where length(phone)=11;
3 LOCATE(substr,str) 和 POSITION(substr IN str)
返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.
select LOCATE('bar', 'foobarbar'); -> 4
select LOCATE('xbar', 'foobar'); -> 0
LOCATE(substr,str,pos)
返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在 str里面,返回0。
select LOCATE('bar', 'foobarbar',5); -> 7
4 INSTR(str,substr)
返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,除了 参数 被颠倒。
select INSTR('foobarbar', 'bar'); -> 4
select INSTR('xbar', 'foobar');-> 0
5 LPAD(str,len,padstr)
返回字符串str,左面用字符串padstr填补直到str是len个字符长。
select LPAD('hi',4,'??'); -> '??hi'
6 RPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填补直到str是len个字符长。
select RPAD('hi',5,'?'); -> 'hi???'
7 LEFT(str,len)
返回字符串str的最左面len个字符。
select LEFT('foobarbar', 5);
-> 'fooba'
8 RIGHT(str,len)
返回字符串str的最右面len个字符。
select RIGHT('foobarbar', 4);
-> 'rbar'
9 SUBSTRING(str,pos,len)
从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。
select SUBSTRING('Quadratically',5,6);
-> 'ratica'
10 LTRIM(str)
返回删除了其前置空格字符的字符串str。
select LTRIM(' barbar');
-> 'barbar'
11 RTRIM(str)
返回删除了其拖后空格字符的字符串str。
select RTRIM('barbar ');
-> 'barbar'
12 TRIM(str)返回删除了两边的空字符串str
select TRIM(' bar ');
-> 'bar'
13 SPACE(N)
返回由N个空格字符组成的一个字符串。
mysql> select SPACE(6);
-> ' '
14 REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出现由字符串to_str代替。
select REPLACE('www.mysql.com', 'w', 'x');
-> 'xxx.mysql.com'
15 REPEAT(str,count)
返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL。
select REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
16 REVERSE(str)
返回颠倒字符顺序的字符串str。
select REVERSE('abc');
-> 'cba'
17 INSERT(str,pos,len,newstr)
返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr代替。
select INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic
18 ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。
select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'
19 FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, ...清单的索引。如果str没找到,返回0。FIELD()是ELT()反运算。
select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
20 LOWER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。
select LCASE('QUADRATICALLY');
-> 'quadratically'
21 UPPER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
select UCASE('Hej');
-> 'HEJ'
mysql 时间函数:
1 DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。
select DAYOFWEEK('1998-02-03');
-> 3
2 WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
select WEEKDAY('1997-10-04 22:23:00');
-> 5
3 DAYOFMONTH(date)
返回date的月份中日期,在1到31范围内。
select DAYOFMONTH('1998-02-03');
-> 3
4 DAYOFYEAR(date)
返回date在一年中的日数, 在1到366范围内。
select DAYOFYEAR('1998-02-03');
-> 34
5 MONTH(date)
返回date的月份,范围1到12。
select MONTH('1998-02-03');
-> 2
6 DAYNAME(date)
返回date的星期名字。
select DAYNAME("1998-02-05");
-> 'Thursday'
7 MONTHNAME(date)
返回date的月份名字。
select MONTHNAME("1998-02-05");
-> 'February'
8 QUARTER(date)
返回date一年中的季度,范围1到4。
select QUARTER('98-04-01');
-> 2
9 WEEK(date)
10 WEEK(date,first)
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,从星期一开始。
select WEEK('1998-02-20');
-> 7
select WEEK('1998-02-20',0);
-> 7
select WEEK('1998-02-20',1);
-> 8
11 YEAR(date)
返回date的年份,范围在1000到9999。
select YEAR('98-02-03');
-> 1998
12 HOUR(time)
返回time的小时,范围是0到23。
select HOUR('10:05:03');
-> 10
13 MINUTE(time)
返回time的分钟,范围是0到59。
select MINUTE('98-02-03 10:05:03');
-> 5
14 SECOND(time)
回来time的秒数,范围是0到59。
select SECOND('10:05:03');
-> 3
15 PERIOD_ADD(P,N)
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。
select PERIOD_ADD(9801,2);
-> 199803
16 PERIOD_DIFF(P1,P2)
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。
select PERIOD_DIFF(9802,199703);
-> 11
17 DATE_ADD(date,INTERVAL expr type)
18 DATE_SUB(date,INTERVAL expr type)
19 ADDDATE(date,INTERVAL expr type)
20 SUBDATE(date,INTERVAL expr type)
SECOND 秒 SECONDS
MINUTE 分钟 MINUTES
HOUR 时间 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"
DAY_HOUR 天和小时 "DAYS HOURS"
YEAR_MONTH 年和月 "YEARS-MONTHS"
HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"
例如:
select adddate('1997-12-31',interval 1 month);
->1998-01-31
select date_add('1997-12-31',interval 1 month);
->1998-01-31
21 TO_DAYS(date)
给出一个日期date,返回一个天数(从公元后第一天到data的天数)。 0000
select TO_DAYS('1997-10-07');
-> 729669
22 FROM_DAYS(N)
给出一个天数N,返回一个DATE值。
select FROM_DAYS(729669);
-> '1997-10-07'
23 DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字 (January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
所有的其他字符不做解释被复制到结果中。
select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。
下面是一个练习的例子,前提是有一张学生表,表中有学生的出生日期,
查询学生表中每个学生的出生月份(或者财务表中每个月的信息)
SELECT studentname ,borndate,DATE_FORMAT(borndate,'%m')
FROM student
查询学生表中在1989年出生的学生的学生的出身月份
SELECT studentname ,borndate,DATE_FORMAT(borndate,'%m')
FROM student WHERE DATE_FORMAT(borndate,'%Y')='1989'
24 TIME_FORMAT(time,format)
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个NULL值或0
25 Mysql取系统函数:
Select curtime();
Select curdate():
Select sysdate():
select now();
获得当前时间的方法
SELECT NOW();//当前年月日是分秒
SELECT curdate();//当前年月日
SELECT curtime();//当前时分秒
当前是几月份
SELECT DATE_FORMAT(NOW(),'%m')
SELECT DATE_FORMAT(NOW(),'%c');
SELECT DATE_FORMAT('2021-09-13','%c')
还有一些时间函数使用的例子
统计1989年每个月有多少个学生出生并进行排序升序
SELECT DATE_FORMAT(borndate,'%m'),COUNT(1) FROM student
WHERE date_format(borndate,'%Y')='1989'
GROUP BY date_format(borndate,'%m') ORDER BY COUNT(1);
查询学生表每个年份出生的人数
SELECT date_format(borndate,'%Y'),COUNT(1) FROM student
GROUP BY date_format(borndate,'%Y') ;
今天距离2008年北京奥运会开幕多少天了
SELECT to_days(now());公元后第一天到今天的时间
SELECT TO_DAYS('2008-8-8');公元后第一天到2008-8-8
SELECT to_days(now())-TO_DAYS('2008-8-8')
查询凌辉与金蝶的出生日期差
SELECT to_days(borndate) FROM student WHERE studentname='凌辉'
SELECT to_days(borndate) FROM student WHERE studentname='金蝶'
SELECT
(SELECT to_days(borndate) FROM student WHERE studentname='凌辉')
-
(SELECT to_days(borndate) FROM student WHERE studentname='金蝶')
流程控制函数:
1 IFNULL(expr1,expr2)
如果 expr1 为非 NULL 的,IFNULL() 返回 expr1,否则返回 expr2。
SELECT studentname,ifnull(address,'<未知地址>') FROM student;
2 NULLIF(expr1,expr2)
如果 expr1 = expr2 为真,返回 NULL,否则返回 expr1
3 IF(expr1,expr2,expr3) 如果 expr1 为真(expr1 <> 0 以及 expr1 <> NULL),那么 IF() 返回 expr2,否则返回 expr3
查询成绩表结果(显示及格\不及格即可)
SELECT studentno,subjectid,score ,
if(score>60,'合格','不合格')FROM result
查询每个学生各科成绩是否有不合格的
(出发点:各科成绩有一科小于60就是不合格)
SELECT studentno ,min(score),if(min(score)>=60,'合格','不合格')
FROM result
GROUP BY studentno
既然这里我们都用来IF(expr1,expr2,expr3),那么我们也说一说case,mysql中的case点类似于java中的if...else if..else.
查询学生表gradeid 1:显示 '新手';
2:显示 '入门';
3:显示 '高手';
SELECT studentname ,
(case gradeid when '1' then '新手'
when '2' then '入门'
ELSE '高手'
end)
FROM student
查询成绩表>90优秀 >70良好和 >=60及格 <60不及格
SELECT studentno,score,(
case when score>90 then '优秀'
when score>70 then '良好'
when score>=60 then '及格'
ELSE '不及格'
END )
FROM result
还有下面这个案例
#8)查询每个雇员的薪资,并给出薪资等级(例如>=10000高;>=8000and<10000 中等;<8000偏低)**
#考核知识点:case when 表达式的应用
select first_name,salary,
(case when salary>=10000 then '偏高'
when salary>=8000 then '中等'
else '偏低' end) level
from employees;
#**9)统计薪资大于等于10000的人数,小于10000的人数。**
select sum(case when salary>=10000 then 1 else 0 end ) '大于等于10000',
sum(case when salary<10000 then 1 else 0 end ) '小于10000'
from employees;
说道case那么就有我们的行列转换,这个很重要
当一张表中,我们有学生的学号,学科的id号,还有学生学科的成绩,这里明显学生学科的成绩有很多个,因为学生有多门学科,那么我们就可以进行列装换,把学号和对应的科目的成绩查出来.这里用max是固定写法,因为在这里我们的学生这一门科目也有可能考多次成绩,我们取最高的.
SELECT studentno 学号,
max(case subjectid when 1 then score END) 'c#基础',
max(case subjectid when 2 then score END) 'c#高级',
max(case subjectid when 3 then score END) 'mysql数据库',
FROM result
GROUP BY studentno