命令:html
若库表为uft8字符集时,需转换为gbk编码再排序:【比较常见】
order by convert(columnname(排序的列名) using gbk) asc;
order by convert(columnname(排序的列名) using gbk) desc;
若库表为gbk字符集时,直接排序:
order by columnname(排序的列名) asc;
order by columnname(排序的列名) desc;
复制代码
举例:mysql
对数据库user表的name字段按照汉字拼音排序,user表数据以下: sql
查看user表的DDL:user表采用utf8字符集,中文不能按照拼音排序,需转换为gbk编码,再进行排序 数据库
对user表的name字段进行gbk编码再排序:【升序的话,英文排在中文前面的;反之降序排在后面】 bash
通常不存在表中有彻底重复的记录,由于咱们在设计数据库表时,都有主键(id),不可重复,因此常见状况都是表中某字段值存在重复。函数
<1> 查询某一字段存在重复值的命令:优化
举例:查询user表中name字段重复值ui
方式一:使用group by和having 【简洁,高效,推荐】编码
命令格式:select columnname(字段名), count(*) as count from tablename(数据库表名) group by columnname(字段名) having count > 1;
具体命令:
select name from user group by name having count(name) > 1;
或
select name, count(*) as count from user group by name having count > 1;
或
select name, count(name) as count from user group by name having count > 1 order by count desc;
复制代码
方式二:使用group by和临时表spa
命令:select name from (select name, count(name) as count from user group by name) as usertemp where count > 1;
复制代码
<2> 查询多个字段同时存在重复值的命令:
举例:查询user表中name和address字段同时存在重复值
命令格式:
select columnname1(字段名1), columnname2(字段名2), count(*) as count from tablename(数据库表名) group by columnname1(字段名1), columnname2(字段名2) having count > 1;
复制代码
<3> 查询某一字段存在重复值的具体行记录信息:
方式一:使用in + 子查询 【数据量大时,耗时长,效率低】
举例:先用子查询查出user表中name字段的重复值,而后在user全表中作in匹配。
方式二:使用临时表作关联查询 【创建临时表,耗时短,效率高,推荐】
举例:把user表中重复的name字段值存放临时表usertemp中,使用关联查询,查出重复name字段的具体行记录信息。
<4> 查询多个字段同时存在重复值的具体行记录信息:
举例:
表中重复记录: 指的是表中彻底重复的记录,即全部字段值均重复。
通常咱们在设计数据库表时,都有主键id,不可重复,因此通常不存在表中记录彻底重复的状况;若出现了此状况,建议先从表结构设计上查找问题,增长主键,优化表结构。
查询表中彻底重复的记录命令:【不经常使用】
select distinct * from tablename(数据库表名);
复制代码
思路:先按薪水字段降序排序,同时去掉重复项,结合limit,便可查出。
举例:user表信息
从user表中找出薪水第三高的用户信息
关于limit的坑提醒: 查询user表中薪水第三高的用户信息,以下写sql,能够吗?
select distinct salary, user.* from user order by salary desc limit 3-1,1;
select distinct salary, user.* from user order by salary desc limit (3-1),1;
复制代码
固然不能够,limit不支持计算表达式,带不带括号都不行,以下报错:
总结:查询第N高 = 降序(desc) + 去重(distinct) + limit(不含计算表达式)
扩展:查询第N高薪水,若是不存在,返回null。
思路:先查出第N高薪水,使用ifnull函数作判断显示。
举例:
MOD(x,y):返回x除以y后的余数。
select mod(5,2); -- 返回1
复制代码
菜鸟教程中有MySQL相关函数的整理介绍,地址:www.runoob.com/mysql/mysql…
实际应用举例:从user表中查出全部id为奇数的男性的用户信息,且按照薪资从高到低排名。
实际应用:user表中,更新操做,将男性(m)和女性(f)的性别进行交换。
update user set sex = if(sex='f','m','f');
或者
UPDATE user SET sex = (CASE sex WHEN 'm' THEN 'f' ELSE 'm' END); (为了区分字段,关键字大写)
复制代码
实际应用:user表中,交换相邻两行的用户信息,若user表中用户总数为奇数的话,最后一行用户信息不变。
解题思路:交换相邻两行数据能够转换为交换相邻两行id,而后按照id排序便可。
select (
case when mod(id,2)=1 and id = (select max(id) from user) then id
when mod(id,2)=1 then id+1 else id-1
end
) as id, name, sex, age, phone, address, salary, create_time, update_time from user order by id;
复制代码
DATEDIFF(d1,d2):返回d1 -> d2之间相隔的天数
select DATEDIFF('2001-01-01','2001-02-02'); -- -32
复制代码
实际应用:有一温度表weather记录着天天的平均温度,查出后一天比前一天温度高的日期。
温度表:
后一天比前一天温度高的日期:
select w1.date from weather w1 inner join weather w2 on DATEDIFF(w1.date, w2.date) = 1 and w1.temperature > w2.temperature;
复制代码
分为三类:
<1> inner join 内链接或等值链接
等价写法:
inner join <==> join
select * from a inner join b where a.id = b.id <==> select * from a, b where a.id = b.id;
复制代码
<2> left join 左链接
<3> right join 右链接
后续持续更新中...