mysql高级函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql高级函数相关的知识,希望对你有一定的参考价值。
参考技术A 1.select concat(name, money) from account; :拼接字段
2.select length(name) from account;:查询字节长度(根据编码集utf-8,一个汉字占三个字节)
3.select ifnull(money, 10) from account;:如果money为null,显示10
4.select round(money,1) from account;:保留一位小数四舍五入
5.select floor(money) from account; :向下取整
6.select ceil(money) from account;:向上取整
7.select truncate(money, 1) from account;:截断(截取一位小数)
8.select mod (10, 3);:取余(相当于select 10%3;)
9.select upper(name) from account; :将名字变成大写
10.select lower(name) from account;:将名字变成小写
11.select substring(name, 1) from account;:截取名字下标从1开始的所有字段(注意:mysql的下标都是从1开始)
12.select substring(name, 1, 4) from account;:截取名字下标从1开始,长度为4的字段
13.select now();:返回当前系统的日期和时间
14.select curdate();:返回当前系统的日期
15.select curtime();:返回当前系统的时间
16.select date_format(now(), \'%Y年%m月%d日\') as \'当前时间\';:将时间转换成字符串
17.select count(name) from account;:计算name的个数(忽略null)
18.select count( ) from account;:计算个数(不忽略null,类似:select count(1) from account;)
19.select lpad(name, 10, \' \'), money from account;:指定字段在左边填充到指定长度(rpad:右边填充)
20.select replace(name, \'an\', \'*\'), money from account;:替换指定字段
21.select * from user limit 0,5;:查询前5条数据(下标0开始,数量:(page - 1) * size, size)
22.select * from boy union select * from girl;:两个结果合成一个(会自动去重,不去重用:union all)
1.select sum(money) from account;:求和(忽略null,null和任何值相加都为null)
2.select sum(money) from account;:求平均数(忽略null)
3.select max(money) from account;:求最大值(忽略null)
4.select min(money) from account;:求最小值(忽略null)
5.select name, money, if(money is null, \'呵呵\', \'哈哈\') 备注 from account;:if语句
6.case条件语句
1.create table copy like user;:复制user表(只复制表的字段)
2.create table copy select * from user;:复制user表(字段数据一起复制)
3.create table copy select username,age from user;:复制user表(复制指定的字段,数据一起复制)
4.create table copy select username,age from user where 0;:复制user表(复制指定的字段,数据不复制)
5.alter table 表名 add|drop|modify|change column 列名【列类型 约束】;:修改表
1.等值连接:select s.studen, t.teacher from study s, teacher t where s.t_id = t.id;(求交集部分)
在MySQL中实现Rank高级排名函数
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名效果。
在这里我用一个简单例子来实现排名的查询:
首先我们先创建一个我们需要进行高级排名查询的players
表,
CREATE TABLE `players` (
`pid` int(2) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(2) NOT NULL,
PRIMARY KEY (`pid`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `players` (`pid`, `name`, `age`) VALUES
(1, ‘Samual‘, 25),
(2, ‘Vino‘, 20),
(3, ‘John‘, 20),
(4, ‘Andy‘, 22),
(5, ‘Brian‘, 21),
(6, ‘Dew‘, 24),
(7, ‘Kris‘, 25),
(8, ‘William‘, 26),
(9, ‘George‘, 23),
(10, ‘Peter‘, 19),
(11, ‘Tom‘, 20),
(12, ‘Andre‘, 20);
1、在MySQL中实现Rank普通排名函数
在这里,我们希望获得一个排名字段的列,以及age
的升序排列。所以我们的查询语句将是:
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age
| PID | NAME | AGE | RANK |
|-----|---------|-----|------|
| 10 | Peter | 19 | 1 |
| 12 | Andre | 20 | 2 |
| 2 | Vino | 20 | 3 |
| 3 | John | 20 | 4 |
| 11 | Tom | 20 | 5 |
| 5 | Brian | 21 | 6 |
| 4 | Andy | 22 | 7 |
| 9 | George | 23 | 8 |
| 6 | Dew | 24 | 9 |
| 7 | Kris | 25 | 10 |
| 1 | Samual | 25 | 11 |
| 8 | William | 26 | 12 |
要在mysql中声明一个变量,你必须在变量名之前使用@
符号。FROM子句中的(@curRank := 0)
部分允许我们进行变量初始化,而不需要单独的SET
命令。当然,也可以使用SET
,但它会处理两个查询:
SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age
2、查询以降序排列
首要按age的降序排列,其次按name进行排列,只需修改查询语句加上ORDER BY
和 DESC
以及列名即可。
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age DESC, name
| PID | NAME | AGE | RANK |
|-----|---------|-----|------|
| 8 | William | 26 | 1 |
| 7 | Kris | 25 | 2 |
| 1 | Samual | 25 | 3 |
| 6 | Dew | 24 | 4 |
| 9 | George | 23 | 5 |
| 4 | Andy | 22 | 6 |
| 5 | Brian | 21 | 7 |
| 12 | Andre | 20 | 8 |
| 3 | John | 20 | 9 |
| 11 | Tom | 20 | 10 |
| 2 | Vino | 20 | 11 |
| 10 | Peter | 19 | 12 |
3、在MySQL中实现Rank普通并列排名函数
现在,如果我们希望为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的age
)。为此,我们使用了一个额外的变量。
SELECT pid, name, age,
CASE
WHEN @prevRank = age THEN @curRank
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM players p,
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age
| PID | NAME | AGE | RANK |
|-----|---------|-----|------|
| 10 | Peter | 19 | 1 |
| 12 | Andre | 20 | 2 |
| 2 | Vino | 20 | 2 |
| 3 | John | 20 | 2 |
| 11 | Tom | 20 | 2 |
| 5 | Brian | 21 | 3 |
| 4 | Andy | 22 | 4 |
| 9 | George | 23 | 5 |
| 6 | Dew | 24 | 6 |
| 7 | Kris | 25 | 7 |
| 1 | Samual | 25 | 7 |
| 8 | William | 26 | 8 |
如上所示,具有相同数据和排行的两行或多行,它们都会获得相同的排名。玩家Andre, Vino, John 和Tom都有相同的age,所以他们排名并列第二。下一个最高age的玩家(Brian)排名第3。这个查询相当于MSSQL和ORACLE 中的DENSE_RANK()函数。
4、在MySQL中实现Rank高级并列排名函数
当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是实际排名中存在有关系的差距。
SELECT pid, name, age, rank FROM
(SELECT pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank,
@incRank := @incRank + 1,
@prevRank := age
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY age) s
这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于MSSQL和ORACLE中的RANK()函数。
| PID | NAME | AGE | RANK |
|-----|---------|-----|------|
| 10 | Peter | 19 | 1 |
| 12 | Andre | 20 | 2 |
| 2 | Vino | 20 | 2 |
| 3 | John | 20 | 2 |
| 11 | Tom | 20 | 2 |
| 5 | Brian | 21 | 6 |
| 4 | Andy | 22 | 7 |
| 9 | George | 23 | 8 |
| 6 | Dew | 24 | 9 |
| 7 | Kris | 25 | 10 |
| 1 | Samual | 25 | 10 |
| 8 | William | 26 | 12 |
在这里我们可以看到,Andre,Vino,John和Tom都有相同的age,所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6,而不是第3,因为有4个人并列排名在第2。
好的,我希望在这些例子后,能让你了解RANK()和DENSE_RANK()之间的区别,并且知道在哪里应使用哪个查询来获取MySQL中的rank函数。谢谢。
作者:风澈vio
链接:https://www.jianshu.com/p/bb1b72a1623e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
以上是关于mysql高级函数的主要内容,如果未能解决你的问题,请参考以下文章