SQL必需掌握的100个重要知识点:排序检索数据

2023-11-02 03:40

本文主要是介绍SQL必需掌握的100个重要知识点:排序检索数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.1 排序数据
正如上一课所述,下面的 SQL语句返回某个数据库表的单个列。但请看
其输出,并没有特定的顺序

输入▼
SELECT prod_name
FROM Products;

输出▼ 
prod_name
--------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

其实,检索出的数据并不是随机显示的。如果不排序,数据一般将以它
在表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,
如果数据随后进行过更新或删除,那么这个顺序将会受到 DBMS重用回
收存储空间的方式的影响。因此,如果不明确控制的话,则最终的结果
不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不
明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义。

子句(clause)
SQL语句由子句构成,有些子句是必需的,有些则是可选的。一个子
句通常由一个关键字加上所提供的数据组成。子句的例子有我们在前
一课看到的 SELECT 语句的 FROM 子句。

为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。
ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。请看下面
的例子:
输入▼
SELECT prod_name
FROM Products
ORDER BY prod_name;
分析▼
除了指示 DBMS软件对 prod_name 列以字母顺序排序数据的 ORDER BY
子句外,这条语句与前面的语句相同。结果如下。
输出▼
prod_name
--------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
Bird bean bag toy
Fish bean bag toy
King doll
Queen doll
Rabbit bean bag toy
Raggedy Ann 

注意: ORDER BY 子句的位置
在指定一条 ORDER BY 子句时,应该保证它是 SELECT 语句中最后一
条子句。如果它不是最后的子句,将会出错。

提示:通过非选择列进行排序
通常, ORDER BY 子句中使用的列将是为显示而选择的列。但是,实
际上并不一定要这样,用非检索的列排序数据是完全合法的。 

3.2 按多个列排序
经常需要按不止一个列进行数据排序。例如,如果要显示雇员名单,可
能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如
果多个雇员有相同的姓,这样做很有用。
要按多个列排序,只须指定这些列名,列名之间用逗号分开即可(就像
选择多个列时那样)。
下面的代码检索 3 个列,并按其中两个列对结果进行排序——首先按价
格,然后按名称排序。
输入▼
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name; 

输出▼ 

prod_id prod_price prod_name
------- ---------- --------------------
BNBG02     3.4900     Bird bean bag toy
BNBG01     3.4900     Fish bean bag toy
BNBG03     3.4900     Rabbit bean bag toy
RGAN01     4.9900     Raggedy Ann
BR01       5.9900     8 inch teddy bear
BR02       8.9900     12 inch teddy bear
RYL01      9.4900     King doll
RYL02      9.4900     Queen doll
BR03       11.9900    18 inch teddy bear

重要的是理解在按多个列排序时,排序的顺序完全按规定进行。换句话
说,对于上述例子中的输出,仅在多个行具有相同的 prod_price 值时
才对产品按 prod_name 进行排序。如果 prod_price 列中所有的值都是
唯一的,则不会按 prod_name 排序。
3.3 按列位置排序
除了能用列名指出排序顺序外, ORDER BY 还支持按相对列位置进行排
序。为理解这一内容,我们来看个例子:
输入▼
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
输出▼ 

prod_id prod_price prod_name
------- ---------- --------------------
BNBG02     3.4900     Bird bean bag toy
BNBG01     3.4900     Fish bean bag toy
BNBG03     3.4900     Rabbit bean bag toy
RGAN01     4.9900     Raggedy Ann
BR01       5.9900     8 inch teddy bear
BR02       8.9900     12 inch teddy bear
RYL01      9.4900     King doll
RYL02      9.4900     Queen doll
BR03       11.9900    18 inch teddy bear

分析▼ 
可以看到,这里的输出与上面的查询相同,不同之处在于 ORDER BY 子
句。 SELECT 清单中指定的是选择列的相对位置而不是列名。 ORDER BY 2
表示按 SELECT 清单中的第二个列 prod_price 进行排序。 ORDER BY 2,
3 表示先按 prod_price ,再按 prod_name 进行排序。
这一技术的主要好处在于不用重新输入列名。但它也有缺点。首先,不
明确给出列名有可能造成错用列名排序。其次,在对 SELECT 清单进行更
改时容易错误地对数据进行排序(忘记对 ORDER BY 子句做相应的改动)。
最后,如果进行排序的列不在 SELECT 清单中,显然不能使用这项技术。
提示:按非选择列排序
显然,当根据不出现在 SELECT 清单中的列进行排序时,不能采用这项
技术。但是,如果有必要,可以混合使用实际列名和相对列位置。
3.4 指定排序方向
数据排序不限于升序排序(从 A到 Z),这只是默认的排序顺序。还可以
使用 ORDER BY 子句进行降序(从 Z 到 A)排序。为了进行降序排序,
必须指定 DESC 关键字。
下面的例子以价格降序来排序产品(最贵的排在最前面):

输入▼
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
输出▼

如果打算用多个列排序,该怎么办?下面的例子以降序排序产品(最贵
的在最前面),再加上产品名:
输入▼
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
输出▼

prod_id prod_price prod_name
------- ---------- --------------------
BR03       11.9900    18 inch teddy bear
RYL01      9.4900     King doll
RYL02      9.4900     Queen doll
BR02       8.9900     12 inch teddy bear
BR01       5.9900     8 inch teddy bear
RGAN01     4.9900     Raggedy Ann
BNBG02     3.4900     Bird bean bag toy
BNBG01     3.4900     Fish bean bag toy
BNBG03     3.4900     Rabbit bean bag toy

 分析▼
DESC 关键字只应用到直接位于其前面的列名。在上例中,只对 prod_price
列指定 DESC ,对 prod_name 列不指定。因此, prod_price 列以降序排
序,而 prod_name 列(在每个价格内)仍然按标准的升序排序。

警告:在多个列上降序排序
如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。

请注意, DESC 是 DESCENDING 的缩写,这两个关键字都可以使用。与 DESC
相对的是 ASC (或 ASCENDING ),在升序排序时可以指定它。但实际上,
ASC 没有多大用处,因为升序是默认的(如果既不指定 ASC 也不指定
DESC ,则假定为 ASC )。

提示:区分大小写和排序顺序
在对文本性数据进行排序时, A 与 a 相同吗? a 位于 B 之前,还是 Z
之后?这些问题不是理论问题,其答案取决于数据库的设置方式。
在字典(dictionary)排序顺序中, A 被视为与 a 相同,这是大多数数
据库管理系统的默认做法。但是,许多 DBMS允许数据库管理员在需
要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这
样做)。
这里的关键问题是,如果确实需要改变这种排序顺序,用简单的 ORDER
BY 子句可能做不到。你必须请求数据库管理员的帮助。 

这篇关于SQL必需掌握的100个重要知识点:排序检索数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327849

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发