1 Star 0 Fork 1

杨超 / mysql学习

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
9数据过滤和排序.md 7.04 KB
一键复制 编辑 原始数据 按行查看 历史
杨超 提交于 2021-07-02 02:45 . z-trun

行数据过滤

在对数据进行查询的时候,有时候需要查询出表中某一行数据,或者对数据的空值进行处理

行查询

1. 查询指定行

查询表中第n行数据,可以先将前n行的数据查询出来,再将表中的前n-1行数据查询出来,最后通过使用NOT EXIST操作将表中第N行的数据显示出来

SELECT
	id,
	`name`,
	current_price
FROM
	(SELECT * FROM goods LIMIT 6) AA
WHERE
	NOT EXISTS (
		SELECT
			*
		FROM
			(SELECT * FROM goods LIMIT 5) BB
		WHERE
			AA.id = BB.id
	)

2. 随机查询一行数据

随机查询可以在表中随机查询抽出几行数据,供用户查看

在mysql中,随机查询可以通过RAND()函数来实现,它可以生成一个0~1之间的随机数

SELECT id,name,current_price FROM goods
ORDER BY RAND() LIMIT 5;

3. 在结果集中添加行号

在结果集中添加行号,可以方便查看

--- id 按照从大到小顺序重新排序,并对每行的数据进行编号 ---
SELECT
	(
		SELECT
			COUNT(id)
		FROM
			goods A
		WHERE
			A.id >= B.id
	) id,
	`name`,
	introduction,
	current_price
FROM
	goods B
ORDER BY
	1;

2 空值的判断

空值从技术上来说就是”未知的值“。但是空值并不包括0,一个或者多个空格组成的字符串,以及零长度的字符串。在实际应用中,空值还说明没有向数据库输入相应的数据,或者某个特定的记录行不需要使用该列。在实际操作中,下列几种情况可能使一列成为空值。

  • 其值未知。例如课程表中不明确具体的课程内容
  • 其值不存在。例如学习表中某个学生没有参数考试,所以该学生的考试成绩为空值
  • 列对表行不可用

1. 查询空值(IS NULL)

在表中有可能会出现空值,由于空值是未知的值,在对其进行查询的时候不可以像查询其他的值那样用比较或运算等。此时可以用IS NULL 操作符对空值进行查询,它可以查询到列中所有的控制

SELECT id,`name`,introduction FROM goods
WHERE introduction IS NULL;

2. 查询非空值(IS NOT NULL)

SELECT id,`name`,introduction FROM goods
WHERE introduction IS NOT NULL;

3. 对空值进行处理

通常需要把空值转化成一个有效的值,便于对数据的理解,或者防止表达式出错。 ISNULL()函数可以对控制转换成为有效的值,而NULLIF()函数可以根据指定的条件来生成空值

SELECT id,`name`,ISNULL(addtime) AS time FROM goods

列的数值不为NULL的时候,ISNULL()函数将返回原值,当为NULL的时候,ISNULL()函数将对其进行处理,用数值来替代

数据排序

理论上讲SLECET语句所返回的结果集都是无序的,结果集中的记录之间顺序主要取决于物理位置,对结果集的排序的唯一方式就是在SELECT查询中嵌入ORDER BY子语句,ORDER BY 子语句用来指定最后结果集中的顺序

1. 数值排序

1. 按照升序和降序排列

当使用SELECT语句查询数据表的时候,数据库系统并不能将数据以特定顺序呈现给用户,如果查询的表的数据比较大,则用户浏览起来很不方便,考虑到效率问题,在SQL中读取数据表的行时引入了一种索引的方法,结果集的行可能就会按照索引的顺序进行排列。

如果想控制每行的数据在结果集中的出现的顺序,可以向SELECT语句添加ORDER BY子句。 它使数据库对查询结果排序,这样就无需对自己编写的应用程序进行手工排序,ODEDER BY 子句必须放在查询语句的末尾,语法如下

ORDER BY { oder_by_expression [ ASC | DESC ] } [,.....n]

参数说明

参数 描述
order_by_expression 指定要排序的列,可以将排序的列指定为列名或者列的别名(可以由表名或者视图名限定)和表达式,或者指定为代表列选择列表内的名称,别名或者表达式的位置的负整数。可以指定多个排序列,ORDER BY子句的排序定义排序结果集的结构
ORDER_BY 子句可以包括未出现在此选择列表的项目,而且如果指定SELECT DISTINCT或者如果SELECT 语句包含union运算符的时候,列名或者列的别名必须是第一选择列表内的列名或者列的别名
ASC 指定按递增顺序(升序),从低到高排序,默认是递增顺序
DESC 指定按递减顺序(降序),从高到底排序
# 对商品价格进行降序排列
SELECT id,`name` , current_price FROM goods
ORDER BY current_price DESC;
# 对商品价格进行升序排列
SELECT id,`name` , current_price FROM goods
ORDER BY current_price ASC;

2. 使用别名排序

# 对商品价格进行排列,别名
SELECT id 编号,`name` 名称, current_price 价格 FROM goods
ORDER BY current_price DESC;
# 对商品价格进行排列,别名如果出现空格,则需要使用引号
SELECT id 编号,`name` 名称, current_price `商品 价格` FROM goods
ORDER BY current_price  DESC;

3. 对多列排序

有时按照一列进行排序之后,如果查询的记录比较多,那么查询结果可能依然不是很清晰,此时可以按照多个列进行排序。SQL指定多列排序,初级排序是对查询结果进行分类排序,第二级排序是对初级排序分好类的数据再次排序,以此类推

实际编程中经常需要对多列进行数据排序,例如要显示员工清单,可能需要按照姓名进行排序(首先按照姓排序,然后再对每一个姓的集合中按照名字排序),对于多个员工具有相同姓的情况,这样做很有意义

如果需要对多列进行字段排序,可以对所有要用于排序的列加以限制,当对多列数据进行排序时,优先顺序应该从左到右依次降低,所以在查询语句的ODRDER BY语句的各个列排序很重要

# 按照商品的价格列和商品名称列对结果进行排序
# 首先按照价格排序,然后按照名称排序
SELECT id,`name`,current_price   FROM goods
ORDER BY current_price,`name`;

对多列排序时,排序顺序有一定的规则。实际上,如果对主排列没有重复值,则不行行次排列,如果在主排列中出现重复值,则需要进行次排列

说明,在ORDERY BY子句中的第一列为主排序,第二列为次排序

如果希望某个列上进行降序列,而在其他列上进行升序排列,可以使用DESC关键字对希望降序排列进行限制,如果要对多个列进行降序排序,必须对每个指定DESC关键字

4. 对数据表中的指定行进行排序

#对数据表的前几行数据进行排序
SELECT id,`name`,current_price FROM goods 
ORDER BY current_price DESC LIMIT 3;
#对数据表的后几行数据进行排序
SELECT id,`name`,current_price FROM goods 
ORDER BY current_price  LIMIT 3;
1
https://gitee.com/yashirochaos/mysql-learning.git
git@gitee.com:yashirochaos/mysql-learning.git
yashirochaos
mysql-learning
mysql学习
master

搜索帮助