(五)MySQL数据库高阶语句之查询、视图、NULL值

本文详细介绍了MySQL的高级查询技巧,包括排序、区间判断、分组、限制结果、别名设置、通配符使用以及子查询的多层次嵌套。同时,讲解了视图的概念,如何创建和使用单表、多表视图,以及视图在数据查询中的作用。此外,还探讨了NULL值的特性和处理方法。通过对这些内容的学习,读者能够更好地掌握MySQL数据库的高级查询和管理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等,本章具体介绍MySQL数据库对查询的结果集的排序

一、MySQL的高阶查询

类比于windows 任务管理器
使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段

1、排序

1.1、按照关键字排序

  • 语法
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... 
  • ASC 是按照升序进行排序的,是默认的排序方式,即 ASC 可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC方式进行排序。
  • DESC 是按降序方式进 行排列。当然 ORDER BY 前面也可以使用 WHERE 子句对查询结果进一步过滤。

创建一个表格:
数据库有一张www表,记录了学生的id,姓名,分数,地址和班级

create table www (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));
insert into www values(1,'lilei',90,'nanjing',1);
insert into www values(2,'hanmeimei',90,'shanghai',2);
insert into www values(3,'wangwu',70,'shanghai',3);
insert into www values(4,'zhangsan',99,'xuzhou',5);
insert into www values(5,'lili',98,'xuzhou',4);
insert into www values(6,'wangsan',10,'wuxi',3);
insert into www values(7,'tianqi',11,'wuxi',5);
mysql> select * from www;

在这里插入图片描述

  1. 分数按照升序排列
select id,name,score from www order by score;	

在这里插入图片描述
2. 分数按照降序排列

select id,name,score from www order by score desc;	

在这里插入图片描述

  1. order by还可以结合where进行条件过滤
select name,score from www where hobbid='3' order by score desc;	##筛选爱好是4的学生按分数降序排列

在这里插入图片描述

1.2、多字段排序

ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定
但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义

select id,name,hobbid from www order by hobbid desc,id desc;  ##查询学生信息先按兴趣id降序排列,相同分数的,id也按降序排列
	从www表内查询id、name、hobbid进行多字段的组合排序
	hobbid进行降序排序,再在相同hobbid中的id进行降序

在这里插入图片描述

select id,name,hobbid from www order by id desc,hobbid desc;		##这里的id值没有重复的,所以此种排序没有意义

在这里插入图片描述

2、区间判断及查询不重复记录

2.1、AND/OR ——且/或

and:同时满足
or:只要满足一个条件都会进行匹配

select * from www where score > 60 and score < 90;	##查询www表内分数大于60且小于90分

在这里插入图片描述

select * from www where score > 60 or score < 90;	##查询www表内分数大于60或小于90分

在这里插入图片描述

2.2、嵌套/多条件

select * from www where score > 70 or (score > 75 and score < 90);	##筛选出来的是大于70的所有分数

在这里插入图片描述

2.3、添加-distinct

distinct 查询不重复记录
语法

select distinct 字段 from 表名;

实例

select distinct hobbid from www;		##查询数据表www内不重复的数据

在这里插入图片描述
多字段去重没有意义了,所以更多用于单字段的去重

select distinct hobbid,id from www;
</
### MySQL IFNULL 高级用法实例与最佳实践 #### 使用场景一:复杂查询中的条件替换 当构建复杂的 SQL 查询时,`IFNULL()` 可以用来优雅地处理可能出现的 `NULL` 。例如,在多表联结操作中,某些字段可能会因为外键关系而存在缺失数据的情况。 ```sql SELECT u.name, IFNULL(o.total_amount, 0) as total_spent FROM users u LEFT JOIN orders o ON u.id = o.user_id; ``` 这段代码展示了如何在左连接的情况下,对于那些没有订单记录(即 `total_amount` 字段为 `NULL`)的用户,默认显示其消费总额为零[^1]。 #### 场景二:防止除数为零错误 在执行涉及除法运算的操作时,分母有可能是 `NULL` 或者其他不期望的数形式如空字符串。此时可以利用 `IFNULL()` 来设置安全: ```sql SET @numerator := 100; SET @denominator := ''; SELECT IFNULL(@numerator / CAST(IFNULL(@denominator, 1) AS DECIMAL), 'Invalid Division'); ``` 这里不仅解决了潜在的除以零问题,还通过转换类型确保了计算准确性[^2]。 #### 场景三:动态列名生成 有时需要基于特定逻辑创建临时视图或报表,其中部分列的内容取决于是否存在关联的数据项。这时可以用到 `CASE WHEN ... THEN ELSE END` 结合 `IFNULL()` 实现更灵活的结果集构造: ```sql CREATE VIEW sales_report AS SELECT product_name, SUM(CASE WHEN region='North' THEN quantity_sold ELSE 0 END) north_sales, SUM(CASE WHEN region='South' AND IFNULL(discount_percentage, 0)>5 THEN quantity_sold*discounted_price ELSE 0 END) south_discounted_sales FROM transactions t JOIN products p ON t.product_id=p.id GROUP BY product_name; ``` 上述语句说明了在一个销售报告视图里,根据不同地区以及是否有折扣情况分别统计销量的方法[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值