五、在where子句后的排序
1、ORDER BY子句
ORDER BY 子句用于根据一个或者多个字段对查询结果(结果集)进行排序,可以是降序,也可以是升序。默认情况下,大部分数据库将查询结果按照升序排序。
ORDER BY基本语法:
select column_name
from table_name
where condition
order by column1,column2,..asc--升序
select column_name
from table_name
where condition
order by column1,column2,..desc--降序
可以在order by子句中指定多个多个排序的字段,它们之间可以用逗号隔开;
但是,必须确定这些字段都在所在的列中。
ASC 关键字表示升序,DESC 关键字表示降序;如果不写,大部分数据库默认为 ASC。
DESC表示的是从大到小排序;
ASC表示的是从小到大排序。
例子:
查询教师表 teachers
中教师年龄 age
的唯一值,并将结果按照年龄 age
进行升序排序。
表定义: teachers (教师表)。
SQL语句实现:
select distinct age--年龄 age 的唯一值
from teachers
order by age asc;--升序排序
执行输出结果:
| age |
| :-- |
| 18 |
| 20 |
| 21 |
| 28 |
注意:
order by子句必须跟在where后面使用,如果题目有提where子句后面的条件的情况下。
2、GROUP BY子句:分组
GROUP BY 子句用来根据指定的字段对结果集(选取的数据)进行分组,如果某些记录的指定字段具有相同的值,那么它们将被合并为一条数据。通俗地理解,GROUP BY 子句将根据指定的字段合并数据行。
借助 SQL 聚合函数,可以对分组的数据进行再次加工,例如:
SUM( ) 函数可以对指定字段的值进行求和;
COUNT( ) 函数可以计算某个分组内数据的条数;
AVG( ) 函数可以对指定字段的值求平均数。
GROUP BY 子句的基本语法如下:
select column_name
from table_name
where conditions
group by column1,column2,..
order by column1,column2,..
注意:
GROUP 子句使用说明:
GROUP BY 子句需要和 SELECT 语句一起使用;
如果有 WHERE 子句,那么 WHERE 子句需要放在 GROUP BY 子句之前;
如果有 ORDER BY 子句,那么 ORDER BY 子句需要放在 GROUP 子句之后。
示例
现在有包含如下记录的 website 表:
+----+----------------+----------------------------+-----+-------+---------+---------+
| id | name | url | age | alexa | uv | country |
+----+----------------+----------------------------+-----+-------+---------+---------+
| 1 | 百度 | https://www.baidu.com/ | 21 | 4 | 5010.5 | CN |
| 2 | 淘宝 | https://www.taobao.com/ | 17 | 8 | 3996.75 | CN |
| 3 | C语言中文网 | http://c.biancheng.net/ | 12 | 7923 | 11.62 | CN |
| 4 | Google | https://www.google.com/ | 23 | 1 | 36474 | US |
| 5 | GitHub | https://github.com/ | 13 | 95 | 216.3 | US |
| 6 | Stack Overflow | https://stackoverflow.com/ | 16 | 48 | 592.2 | US |
| 7 | Yandex | http://www.yandex.ru/ | 11 | 53 | 591.82 | RU |
| 8 | VK | https://vk.com/ | 23 | 23 | 1206 | RU |
+----+----------------+----------------------------+-----+-------+---------+---------+
每个国家网站的总访问量,那么 GROUP BY 子句的写法如下:
SELECT country, SUM(uv) AS total --as取别名total
FROM website
GROUP BY country;
AS关键字用来给字段起一个临时的别名,该别名只显示在结果集中,并不会更改原始表的字段名执行输出结果:
+---------+--------------------+
| country | total |
+---------+--------------------+
| CN | 9018.869999885559 |
| RU | 1797.8200073242188 |
| US | 37282.50001525879 |
+---------+--------------------+
3、TOP子句:限制返回数据的条数
TOP 子句用于限定要返回的记录的数据,可以是一个具体的数字,也可以是一个百分数。
对于拥有成千上万条记录的大型数据表来说,TOP 子句非常有用,它能够压缩结果集的大小,提高程序查询效率。
注意,并不是所有的数据库都支持 TOP 子句,有些数据库使用其它的等价语句来替代,例如:
MySQL 使用 LIMIT 子句获取指定数量的记录;
Oracle 使用 ROWNUM 子句获取指定数量的记录。
语法
SELECT 语句中的 TOP 子句的基本语法如下:
select top (number) column_name
from table_name
where condition;
示例
现在有包含如下记录的 website 表:
+----+----------------+----------------------------+-----+-------+---------+---------+
| id | name | url | age | alexa | uv | country |
+----+----------------+----------------------------+-----+-------+---------+---------+
| 1 | 百度 | https://www.baidu.com/ | 21 | 4 | 5010.5 | CN |
| 2 | 淘宝 | https://www.taobao.com/ | 17 | 8 | 3996.75 | CN |
| 3 | C语言中文网 | http://c.biancheng.net/ | 12 | 7923 | 11.62 | CN |
| 4 | Google | https://www.google.com/ | 23 | 1 | 36474 | US |
| 5 | GitHub | https://github.com/ | 13 | 95 | 216.3 | US |
| 6 | Stack Overflow | https://stackoverflow.com/ | 16 | 48 | 592.2 | US |
| 7 | Yandex | http://www.yandex.ru/ | 11 | 53 | 591.82 | RU |
| 8 | VK | https://vk.com/ | 23 | 23 | 1206 | RU |
+----+----------------+----------------------------+-----+-------+---------+---------+
SQL Server 支持 TOP 子句,以下语句在 SQL Server 上运行通过,它将获取 website 表中的前三条记录:
SELECT TOP 3 * FROM website;
执行输出结果:
+----+-------------+-------------------------+-----+-------+---------+---------+
| id | name | url | age | alexa | uv | country |
+----+-------------+-------------------------+-----+-------+---------+---------+
| 1 | 百度 | https://www.baidu.com/ | 21 | 4 | 5010.5 | CN |
| 2 | 淘宝 | https://www.taobao.com/ | 17 | 8 | 3996.75 | CN |
| 3 | C语言中文网 | http://c.biancheng.net/ | 12 | 7923 | 11.62 | CN |
+----+-------------+-------------------------+-----+-------+---------+---------+
使用 MySQL 数据库,请使用 LIMIT 子句替代:
SELECT * FROM website LIMIT 3;
使用 Oracle 数据库,请使用 ROWNUM 子句替代:
SELECT * FROM website WHERE ROWNUM <= 3;