MYSQL 中group by,order by用法详解及其特殊用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/number1killer/article/details/77799941

group by 语句是一个经常会用到的select语句,通常用来对查询后的结果进行分组。例如:

mysql> select * from sc group by s;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    2 |    1 |    79 |
|    3 |    1 |    91 |
|    4 |    2 |    88 |
|    5 |    1 |    46 |
|    6 |    1 |    35 |
+------+------+-------+
6 rows in set (0.00 sec)

然而实际上如果是要按分组后的学生的编号S来查询sc表中学生的所有信息的话,上面这个结果却是错误的。那么先让我们来看一看原表:

mysql> select * from sc;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    1 |    2 |    78 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    2 |    3 |    92 |
|    2 |    4 |    68 |
|    3 |    1 |    91 |
|    3 |    2 |    47 |
|    3 |    3 |    88 |
|    3 |    4 |    56 |
|    4 |    2 |    88 |
|    4 |    3 |    90 |
|    4 |    4 |    93 |
|    5 |    1 |    46 |
|    5 |    3 |    78 |
|    5 |    4 |    53 |
|    6 |    1 |    35 |
|    6 |    2 |    68 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.00 sec)

那么这是为什么呢?

原来GROUP  BY语句是按照唯一性来进行分组的,也就是说GROUP BY自带了去重的功能,所以只要是学生编号相同的信息都只保留了一条记录。

那么如何才能按学生的编号S来查询sc表中的所有信息呢。这个时候我们就要用到MYSQL的另一函数ORDER BY了:

ysql> select * from sc order by s;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    1 |    2 |    78 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    2 |    3 |    92 |
|    2 |    4 |    68 |
|    3 |    1 |    91 |
|    3 |    2 |    47 |
|    3 |    3 |    88 |
|    3 |    4 |    56 |
|    4 |    2 |    88 |
|    4 |    3 |    90 |
|    4 |    4 |    93 |
|    5 |    1 |    46 |
|    5 |    3 |    78 |
|    5 |    4 |    53 |
|    6 |    1 |    35 |
|    6 |    2 |    68 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.00 sec)

显然由于输出的结果与原表完全相同,不便于作比较。那么我们就来看一看另一组对比:

mysql> select * from sc order by c;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    2 |    1 |    79 |
|    3 |    1 |    91 |
|    5 |    1 |    46 |
|    6 |    1 |    35 |
|    1 |    2 |    78 |
|    2 |    2 |    81 |
|    3 |    2 |    47 |
|    4 |    2 |    88 |
|    6 |    2 |    68 |
|    1 |    3 |    67 |
|    2 |    3 |    92 |
|    3 |    3 |    88 |
|    4 |    3 |    90 |
|    5 |    3 |    78 |
|    1 |    4 |    58 |
|    2 |    4 |    68 |
|    3 |    4 |    56 |
|    4 |    4 |    93 |
|    5 |    4 |    53 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.00 sec)

mysql> select * from sc group by c;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    1 |    2 |    78 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
+------+------+-------+
4 rows in set (0.00 sec)

显然ORDER BY的作用是根据查询数据的大小来排序的,它并不会对排序后的数据进行去重。ORDER BY排序默认为排升序,后面加DESC可以排降序。例如:

mysql> select * from sc order by score desc
    -> ;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    4 |    4 |    93 |
|    2 |    3 |    92 |
|    3 |    1 |    91 |
|    4 |    3 |    90 |
|    3 |    3 |    88 |
|    4 |    2 |    88 |
|    2 |    2 |    81 |
|    2 |    1 |    79 |
|    1 |    2 |    78 |
|    5 |    3 |    78 |
|    6 |    4 |    71 |
|    2 |    4 |    68 |
|    6 |    2 |    68 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    1 |    1 |    56 |
|    3 |    4 |    56 |
|    5 |    4 |    53 |
|    3 |    2 |    47 |
|    5 |    1 |    46 |
|    6 |    1 |    35 |
+------+------+-------+
21 rows in set (0.00 sec)

其实GROUP BY也是一样:

mysql> select * from sc group  by score desc;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    4 |    4 |    93 |
|    2 |    3 |    92 |
|    3 |    1 |    91 |
|    4 |    3 |    90 |
|    3 |    3 |    88 |
|    2 |    2 |    81 |
|    2 |    1 |    79 |
|    1 |    2 |    78 |
|    6 |    4 |    71 |
|    2 |    4 |    68 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    1 |    1 |    56 |
|    5 |    4 |    53 |
|    3 |    2 |    47 |
|    5 |    1 |    46 |
|    6 |    1 |    35 |
+------+------+-------+
17 rows in set (0.00 sec)

最后,再让我们看一组特殊的例子:

mysql> select * from sc group by s,c,score;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    1 |    2 |    78 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    2 |    3 |    92 |
|    2 |    4 |    68 |
|    3 |    1 |    91 |
|    3 |    2 |    47 |
|    3 |    3 |    88 |
|    3 |    4 |    56 |
|    4 |    2 |    88 |
|    4 |    3 |    90 |
|    4 |    4 |    93 |
|    5 |    1 |    46 |
|    5 |    3 |    78 |
|    5 |    4 |    53 |
|    6 |    1 |    35 |
|    6 |    2 |    68 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.00 sec)

mysql> select * from sc group by c,s,score;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    2 |    1 |    79 |
|    3 |    1 |    91 |
|    5 |    1 |    46 |
|    6 |    1 |    35 |
|    1 |    2 |    78 |
|    2 |    2 |    81 |
|    3 |    2 |    47 |
|    4 |    2 |    88 |
|    6 |    2 |    68 |
|    1 |    3 |    67 |
|    2 |    3 |    92 |
|    3 |    3 |    88 |
|    4 |    3 |    90 |
|    5 |    3 |    78 |
|    1 |    4 |    58 |
|    2 |    4 |    68 |
|    3 |    4 |    56 |
|    4 |    4 |    93 |
|    5 |    4 |    53 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.00 sec)

mysql> select * from sc group by score,c,s;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    6 |    1 |    35 |
|    5 |    1 |    46 |
|    3 |    2 |    47 |
|    5 |    4 |    53 |
|    1 |    1 |    56 |
|    3 |    4 |    56 |
|    1 |    4 |    58 |
|    1 |    3 |    67 |
|    6 |    2 |    68 |
|    2 |    4 |    68 |
|    6 |    4 |    71 |
|    1 |    2 |    78 |
|    5 |    3 |    78 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    4 |    2 |    88 |
|    3 |    3 |    88 |
|    4 |    3 |    90 |
|    3 |    1 |    91 |
|    2 |    3 |    92 |
|    4 |    4 |    93 |
+------+------+-------+
21 rows in set (0.00 sec)

我们可以看到GROUP BY 是优先对跟在他后面的第一个字段进行排序的并且也只对这一个字段进行排序,而且如果GROUP BY 后面跟的字段不只一个的话,那么GROUP BY就不会再对排序后的结果进行去重了。

那么ORDER BY 是不是优先对跟在他后面的第一个字段进行排序的并且也只对这一个字段进行排序呢?让我们来看一组例子:

mysql> select * from sc order by s,c,score;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    1 |    1 |    56 |
|    1 |    2 |    78 |
|    1 |    3 |    67 |
|    1 |    4 |    58 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    2 |    3 |    92 |
|    2 |    4 |    68 |
|    3 |    1 |    91 |
|    3 |    2 |    47 |
|    3 |    3 |    88 |
|    3 |    4 |    56 |
|    4 |    2 |    88 |
|    4 |    3 |    90 |
|    4 |    4 |    93 |
|    5 |    1 |    46 |
|    5 |    3 |    78 |
|    5 |    4 |    53 |
|    6 |    1 |    35 |
|    6 |    2 |    68 |
|    6 |    4 |    71 |
+------+------+-------+
21 rows in set (0.01 sec)

mysql> select * from sc order by c,score,s;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    6 |    1 |    35 |
|    5 |    1 |    46 |
|    1 |    1 |    56 |
|    2 |    1 |    79 |
|    3 |    1 |    91 |
|    3 |    2 |    47 |
|    6 |    2 |    68 |
|    1 |    2 |    78 |
|    2 |    2 |    81 |
|    4 |    2 |    88 |
|    1 |    3 |    67 |
|    5 |    3 |    78 |
|    3 |    3 |    88 |
|    4 |    3 |    90 |
|    2 |    3 |    92 |
|    5 |    4 |    53 |
|    3 |    4 |    56 |
|    1 |    4 |    58 |
|    2 |    4 |    68 |
|    6 |    4 |    71 |
|    4 |    4 |    93 |
+------+------+-------+
21 rows in set (0.00 sec)

mysql> select * from sc order by score,c,s;
+------+------+-------+
| s    | c    | score |
+------+------+-------+
|    6 |    1 |    35 |
|    5 |    1 |    46 |
|    3 |    2 |    47 |
|    5 |    4 |    53 |
|    1 |    1 |    56 |
|    3 |    4 |    56 |
|    1 |    4 |    58 |
|    1 |    3 |    67 |
|    6 |    2 |    68 |
|    2 |    4 |    68 |
|    6 |    4 |    71 |
|    1 |    2 |    78 |
|    5 |    3 |    78 |
|    2 |    1 |    79 |
|    2 |    2 |    81 |
|    4 |    2 |    88 |
|    3 |    3 |    88 |
|    4 |    3 |    90 |
|    3 |    1 |    91 |
|    2 |    3 |    92 |
|    4 |    4 |    93 |
+------+------+-------+
21 rows in set (0.00 sec)

显然ORDER BY也具有相同的特性。






         



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页