小技巧:如何将别人的小型数据集直接保存到MySQL数据库中
首先,你需要安装Navicat Premium。接下来,你需要学会如何使用它来创建表。然后,将别人提供的csv文件或txt文件用程序或Office工具等进行格式处理。第一行应该是字段名称,最好以逗号分隔。第二行开始以后是值,值之间也用逗号分隔。处理好后,导入数据。
具体操作步骤如下:
1. 右键点击目标表,选择“导入向导”。
2. 在“字段分隔符”中输入逗号(,)。
3. 在“导出类型”中选择“文本”。
4. 在“源字段”和“目标字段”中分别输入相应的字段名。
5. 点击“开始”,等待导入完成。
此外,我推荐使用NotePad++这个轻便的文本编辑器。它可以打开超大的文本文件,并进行格式转换。在替换功能中,支持正则表达式,可以轻松处理复杂的文本内容。
方法一:
在MySQL中,没有类似于SQL Server或Oracle中的rank()函数来获取排名。但在实际工作中,我们经常需要将查询后排序得到的排名记录下来。根据网上提供的排名方法,我们可以进一步扩展实现方式。
```sql
select
tmp.id,tmp.name,tmp.score,
@j:=@j+1 as j,
@k:=(case when @pre_score=tmp.score then @k else @j end) as rank,
@pre_score:=tmp.score as pre_score
from
(
-- 成绩排序
select * from score order by score desc
) tmp,
-- @k 表示最终的排名(相同值时序号相同)
-- @j 表示顺序排名
-- @pre_score上一次排序值
(select @k :=0,@j:=0, @pre_score:=0) sdcore;
```
方法二:
假设你有一个数据集如下:
```plaintext
rank,username
100,Lucy
127,Lucy
146,Lucy
137,Lucy
104,Lucy
121,Lucy
136,Lily
100,Lily
100,Lily
105,Lily
136,Lily
149,ytt
116,ytt
116,ytt
149,ytt
106,ytt
117,ytt
```
以下是重构后的代码:
方法一:
```sql
SELECT a.username, a.rank, find_in_set(a.rank, b.rank_gp) AS rank_cnt
FROM group_concat AS a,
(SELECT username, GROUP_CONCAT(rank ORDER BY rank DESC SEPARATOR ',') AS rank_gp FROM group_concat GROUP BY username) b
WHERE a.username = b.username
ORDER BY a.username ASC, a.rank DESC;
```
方法二:
```sql
CREATE TABLE `sam` (
`a` INT(11) DEFAULT NULL,
`b` INT(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `sam` VALUES (1,10),(1,15),(1,20),(1,25),(2,20),(2,22),(2,33),(2,45);
SELECT
a,
b,
ROW_NUMBER() OVER (PARTITION BY a ORDER BY b DESC) AS rownum,
RANK() OVER (PARTITION BY a ORDER BY b DESC) AS rank
FROM
sam;
```
方法三:
```sql
CREATE TABLE `sam` (
`a` INT(11) DEFAULT NULL,
`b` INT(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `sam` VALUES (1,10),(1,15),(1,20),(1,25),(2,20),(2,22),(2,33),(2,45);
SELECT
a,
b,
ROWNUM AS rownum,
RANK() OVER (PARTITION BY a ORDER BY b DESC) AS rank
FROM
(SELECT * FROM sam ORDER BY a ASC, b DESC) tmp;
```
在MySQL中实现Rank普通排名函数,可以使用以下查询语句:
```sql
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players p, (
SELECT @curRank := 0
) q
ORDER BY age;
```
这个查询语句会在年龄升序排列的基础上,为每个年龄分配一个排名。
在MySQL中实现Rank普通并列排名函数,可以使用以下方法:
1. 使用变量初始化和自增操作:
```sql
SET @curRank := 0;
SELECT (@curRank := @curRank + 1) AS rank, pid, name, age
FROM players
ORDER BY age DESC, name;
```
2. 使用窗口函数(仅适用于MySQL 8.0及以上版本):
```sql
WITH ranked_players AS (
SELECT pid, name, age, @curRank := IF(@name = name, @curRank + 1, 1) AS rank, @name := name
FROM players, (SELECT @curRank := 0, @name := '') init_vars
ORDER BY age DESC, name
)
SELECT * FROM ranked_players;
```
这两种方法都可以实现在MySQL中对Players表进行普通并列排名。
现在,如果我们希望为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的age)。为此,我们使用了一个额外的变量。
```sql
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()函数。
这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于MSSQL和ORACLE中的RANK()函数。
```sql
(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;
```
| 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函数。谢谢。