MySQL类型转换和select相关函数

类型转换

1.类型转换分为隐式转换和显式转换
示例: select 1=‘1’; 在这种情况就会发生类型转换,数字等于字符串,数据库在内部发生隐式转换

2.类型转换大部分发生在两种情况下
1)在select的where条件里面,一般是列与常量进行比较时,两者的数据类型不一样会发生类型转换。例如:字符串=数字 就会发生类型转换
2)在insert into 语句中,也容易发生数据类型的不一致而导致的类型转换。例如:t1有两个列,一个是id,一个是name,执行insert into t1 values(‘1’,’abc’);会发生类型转换,因为id列是数字,插入字符时,就会发生类型转换(补充:单引号里面的都是字符串)
上述两种情况都属于隐私类型转换

3.隐式类型转换又分为有害转换和无害转换,不管是哪一种,我们都要尽量不要发生隐式的类型转换
如何避免发生隐式转换呢?
1)在创建表定义列时,需要定义好列的数据类型
数字:int
字符串:varchar
日期:date
2)在执行select和insert语句时,对于常量来说:数字类型不要加引号;字符串类型一定 要加上引号;日期类型可以加上引号,也可以不加,最好是加上

cast函数
1.作用是将任意类型的表达式转换为指定类型的值(也就是显示转换),指定类型可以是以下任意类型的值
BINARY:二进制字符串
CHAR:字符串
DATE:日期 注:格式要匹配
DATETIME:日期函数
DECIMAL:浮点数
SIGNED:有符号整数
TIME:时间
UNSIGNED:无符号整数
2.常用语法:
1)cast(id as char) ##将id列转换为字符串类型
示例语句:select cast(id as char) from t1; ##将t1表中id列转为字符串类型
2)cast(123 as char) ##将常量123转换为字符串类型
示例语句:explain select * from t1 where name=cast(123 as char); #将123常量转为字符串,显示索引等信息

NULL值处理函数

IFNULL函数
如果一个列是空值,使用ifnull函数,可以指定null的显示名称
示例:select PLAYERNO,ifnull(LEAGUENO,’NO LEAGUENO’) from PLAYERS; ##显示 PLAYERNO列和LEAGUENO列,并将LEAGUENO列的null值使用NO LEAGUENO显示在这里插入图片描述if函数
1)使用if函数可以根据条件给一个列指定名称
示例:
select if(LEAGUENO is not null,LEAGUENO,’sorry no LEAGUENO’) from PLAYERS; ##查询LEAGUENO列,如果这个列是空的话,就显示原来的值,如果为空就会显示sorry no LEAGUENO。if有表判断的含义在这里插入图片描述2)if函数可以根据条件判断,给属于不同的条件的列起一个新的名称
示例:
select name,if(year(BIRTH_DATE)<1950 , ’老队员’ , ‘主力队员’) ,year(BIRTH_DATE) from PLAYERS;
##查询name列和如果BIRTH_DATE列的年大于1950,显示老队员,否则显示主力队员,最后再把BIRTH_DATE列的年显示出来;year(BIRTH_DATE)表示只取出BIRTH_DATE列中的年在这里插入图片描述case函数
对我们要显示的数据进行一个格式化的输出,使数据看起来更加清晰易懂
示例:(1)select name case sex ##当sex列为M时显示为男性
when ‘M’ then ‘男性’ ##当sex列为F时显示为女性
when ‘F’ then ‘女性’ ##当sex列为其他值时显示为无效值
else ‘无效值’ end sex_format ##并给显示的列起一个别名为sex_format,end是结束符
from PLAYERS; ,在这里插入图片描述(2)select name,year(birth_date),case #使用case函数查询name列和birth_date
列的年
when year(birth_date)<1950 then ‘老队员’ #小于1950为老队员
when year(birth_date)<1960 then ‘成年队员’
when year(birth_date)<1970 then ‘年轻队员’
else ‘小队员’ end grate #其他是小队员,end作为case函数的结束
符,grate是起的别名
from PLAYERS;在这里插入图片描述注:以上两种方式case的摆放位置不同,一个是后边跟需要格式化的列,一个是在需要格式化的列后加上case

组函数
1)组函数又叫做聚集函数(aggregation function),它在一个行的集合(一组行)上进行操作,对每个组给一个结果

2)常用的组函数
AVG :求平均值
COUNT :统计行的数量
MAX :求最大值
MIN :求最小值
SUM :求累加和

3)示例:
select max(id) from student; ##显示id列的最大值在这里插入图片描述select min(id) from student; ##显示id列的最小值在这里插入图片描述select avg(id) from student; ##求id列的平均值在这里插入图片描述select count(id) from student; ##显示id列的行数
select count(*) from student; ##显示student表的行数

4)默认情况下,组函数忽略列值为null的行,不把它们拿来参与计算在这里插入图片描述显然,null值没有才能与运算
可以使用select sum(amount)/5 from t1; ##将amount列求和再除5在这里插入图片描述也可以使用ifnull函数将null值参与计算
select avg(ifnull(amount,0)) from t1; ##求anmount列的平均值,如果有空值,替换为0,没有空值使用原来的数进行计算在这里插入图片描述5)count(distinct 列):返回列值非空的、并且列值不重复的行的数量
示例:SELECT count(DISTINCT town) FROM players; ##查询球员所居住的城市的数量在这里插入图片描述
6)补充:使用distinct函数可以去除重复的数据
示例:select distinct PLAYERNO from PENALTIES; ##查询哪些队员罚过款,并去除重复的球员在这里插入图片描述分组函数
1.order by 函数,可以使重复的数据排列在一起
示例:select name,town from PLAYERS order by town; #查询姓名和住址,并将住址列重复数据排放在一起在这里插入图片描述2.group by 函数:
GROUP BY 子句根据给定列或者表达式的每一个不同的值将表中的行分成不同的组。使用组函数返回每一组的统计信息
在使用GROUP BY 字句之前,通常会使用order by字句
示例:
(1)select town,count(name) from PLAYERS group by town; ##展示town列和name列的行数,并将town列中不同的数据分为一组,相同的数据一组在这里插入图片描述注:Stratford 对应的count(name)是7说明town列有七组相同的Stratford,当前操作就是我
们常说的分组聚合。
分组聚合语句的要求:select后面的列如果没有出现在group by中,那么这个列必须加上类
似于avg,count,sum,min等聚合函数,否则会报错
(2) select sum(AMOUNT),PLAYERNO from PENALTIES group by PLAYERNO; ##对PLAYERNO列进行分组,分完组之后进行求和计算在这里插入图片描述注:使用order by字句进行对比,order by字句会将重复的数据排放在一起显示,而group by字句会将重复的数据分为一组,然后在进行求和
补充:group by也可以按照多个列去分组

3.对分组聚合的结果进行过滤
不能使用WHERE子句对分组后的结果进行过滤,不能在WHERE子句中使用组函数
对分组结果进行过滤使用having字句
示例:select sum(AMOUNT),PLAYERNO from PENALTIES group by PLAYERNO having sum(AMOUNT) =100; ##对PLAYERNO列分组,然后进行求和,求完和之后将等于100的过
滤出来在这里插入图片描述4.GROUP_CONCAT()函数
MYSQL特有的组函数。该函数的值等于属于一个组的指定列的所有值。这些值一个挨一个的放置,以逗号隔开,并且以字符串表示
示例:select TEAMNO,group_concat(PLAYERNO) from MATCHES group by TEAMNO; ##对TEAM进行分组,每一组显示各自对应PLAYERNO,在一行显示,以逗号隔开在这里插入图片描述limit字句
MySQL特有的子句。它是SELECT语句中的最后一个子句(在order by后面)。它用来表示从结果集中选取最前面或最后面的几行。偏移量offset的最小值为0。示例:select playerno, name FROM players limit 4;## 显示前4行
在这里插入图片描述

示例:SELECT playerno ,sum(won) ##对won列求和
FROM matches
GROUP BY playerno ##对playerno进行分组,相同数据的分一组
ORDER BY sum(won) DESC ##对won列求的和进行降序排列
LIMIT 1; ##只显示第一行 (也就是求一名)在这里插入图片描述
带偏移量的limit
用来跳过前面的几行后再取
示例:SELECT playerno, name
FROM players
ORDER BY playerno ASC ##升序
LIMIT 3, 5; – 或者limit 5 offset 3; ##跳过前三行,在显示五行,也就是显示4-8行

注:limit 经常和order by字句联合在一起使用

猜你喜欢

转载自blog.csdn.net/qq_43028054/article/details/93759862