小技巧:如何将别人的小型数据集直接保存到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函数。谢谢。