今天继续sql函数,预计还有1周多2周完成sql部分的学习。
1. 字符串函数
一、char_length(str)
计算参数str中有多少个字符,str可以是具体的一个字符串,也可以是表中的列
查看字符串“中国人”有几个字
mysql> select char_length(‘中国人’);
学生表中姓名为三个字的学生有哪些?
mysql> select sname,char_length(sname) from stu where char_length(sname)=3;
二、concat(str1,str2,……)
把参数str1和str2拼接成一个字符串
把‘我是’和‘中国人’拼接成一句话
mysql> select concat(‘我是’,‘中国人’);
学生表打印已分班的学生姓名和班级,以xxx是x班 的形式打印结果
mysql> select concat(sname,‘是’,cno,‘班’) from stu where cno is not null;
三、substring(str,pos,len)
把参数str字符串从第pos位起,截取len位
把‘我是中国人’字符串从第3位起截取3位字符
mysql> select substring(‘我是中国人’,3,3);
二班的同学都有什么姓氏?
mysql> select sname,substring(sname,1,1) from stu where cno=2;
2.日期函数
一、year(date1)、month(date1)
year(date1)
获取日期date1的年份
month(date1)
获取日期date1的月份
学生表中哪些同学是1990年出生的?
mysql> select sname,birth,year(birth) from stu where year(birth)=1990;
学生表中哪些同学是8月出生的?
mysql> select sname,birth,year(birth),month(birth) from stu where month(birth)=8;
二、其他日期函数
curdate()
获取当前日期
curtime()
获取当前时间
now()
获取当前的日期和时间
datediff(date1,date2)
返回date1和date2两个日期间隔的天数
计算2018年6月1日和2018年情人节之间间隔的天数
mysql> select datediff(‘2018-6-1’,‘2018-2-14’);
计算学生表中学生的年龄,显示姓名,生日,年龄(保留2位小数),只显示小于20岁的同学
mysql> select sname,birth,round(datediff(curdate(),birth)/365,2) 年龄 from stu where round(datediff(curdate(),birth)/365,2)<20;
3. 条件判断函数
一、if(expr,v1,v2)
如果表达式expr成立,返回v1值;否则,返回v2值
如果学生高考分大于等于520,其为统招生,否则其为委培生,从学生表中查找,显示姓名,考分,类型(统招或委培)
mysql> select sname,score,if(score>=520,‘统招’,‘委培’) 类型 from stu;
4. CASE运算符
一、CASE运算符为SQL语句增加了多重条件判断比if函数更加灵活
case when expr1 then v1 [when expr2 v2 then] …… else vn end
如果考分700以上,优秀,600以上,良好,520以上,中等,否则,较差,按照这个原则列出学生表中的学生,显示姓名,考分,和评判等级
mysql> select sname,score,(case when score>=700 then ‘优秀’ when score>=600 then ‘良好’ when score>=520 then ‘中等’ else ‘较差’ end) 等级 from stu;
5、空值处理函数
一、空值问题:
使用in时,值列表中有null值,不会返回null相关结果
mysql> select * from stu where cno in (2,null);
使用not in列表中有空值时,无查询结果返回
mysql> select * from stu where cno not in (2,null);
有时空值会造成意想不到的问题,需要用空值函数先对空值进行处理
二、常用空值处理函数
ifnull(v1,v2) – 如果v1为空返回v2,否则返回v1
isnull(expr) – 如果表达式为null空值,返回1,表达式非空则返回0
6. 聚合函数
一、聚合函数
max(列名)
统计出列中所有行中的最大值,列的数据类型可以是数值、字符、日期型
min(列名)
统计出列中所有行中的最小值,列的数据类型可以是数值、字符、日期型
sum(列名)
统计出列中所有行中数值的总和,列的数据类型不能是字符型
avg(列名)
统计出列中所有行中数值的平均值,列的数据类型不能是字符型
count(列名)
统计出列中所有行的数量,列中的如果有空值不会被统计计数
二、示例
找出学生中最高的身高、最轻的体重、平均高考分数、学生的总数
mysql> select max(height),min(weight),sum(score)/count(),avg(score),count(),count(sno),count(cno) from stu;
count(cno) =17 因为有3个学生班号是空值,空值不会被统计计数
count(*)统计的是所有行;count(sno)=20因为sno列中无空值
用一个查询语句找出学生中最低的身高、再显示所有人的姓名
mysql> select min(height),sname from stu;
报错语法错误了:min(height)只有1个值1行,sname有20行,1行对接20行是个矛盾的事情,因此不能这么写。