【教程】MySQL数据库学习笔记(六)——数据查询语言DQL(持续更新)


写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【MySQL数据库学习】系列文章

第一章 《认识与环境搭建》
第二章 《数据类型》
第三章 《数据定义语言DDL》
第四章 《数据操作语言DML》
第五章 《约束》
第六章 《数据查询语言DQL》


文章目录


一、DQL介绍

DQL(数据查询语言,Data Query Language) 是 SQL(结构化查询语言)的一部分,专注于从数据库中查询和检索数据。DQL 的主要功能是帮助用户获取所需的信息,而不是对数据库中的数据进行修改。最常用的 DQL 语句是 SELECT

DQL通用的语法过于复杂,初学可以先记住SELECTFROMWHERE三个关键词即可,简化后的基本语法如下。

sql 复制代码
SELECT *| 列名 FROM 表 WHERE 条件

二、DQL简单查询

(一)数据准备

在演示DQL的使用前,需要先做好示例的数据准备,以下是一个简单的数据示例。

sql 复制代码
-- 1.创建数据库
CREATE DATABASE IF NOT EXISTS mydb1;
USE mydb1;

-- 2.创建商品表
CREATE TABLE product(
pid INT PRIMARY KEY auto_increment, -- 商品编号(自动增加)
pname VARCHAR(20) not null, -- 商品名字
price DOUBLE, -- 商品价格
category_id VARCHAR(20) -- 商品所属分类
);

-- 3.添加数据
INSERT INTO product VALUES(NULL, '海尔洗衣机', 5000, 'c001');
INSERT INTO product VALUES(NULL, '美的冰箱', 3000, 'c001');
INSERT INTO product VALUES(NULL, '格力空调', 5000, 'c001');
INSERT INTO product VALUES(NULL, '九阳电饭煲', 5000, 'c001');

INSERT INTO product VALUES(NULL, '李宁衬衣', 300, 'c002');
INSERT INTO product VALUES(NULL, '范思哲西裤', 800, 'c002');
INSERT INTO product VALUES(NULL, '北面夹克', 440, 'c002');
INSERT INTO product VALUES(NULL, '杰克琼斯休闲裤', 266, 'c002');
INSERT INTO product VALUES(NULL, '耐克卫衣', 180, 'c002');
INSERT INTO product VALUES(NULL, '安踏运动裤', 430, 'c002');

INSERT INTO product VALUES(NULL, '兰蔻面霜', 300, 'c003');
INSERT INTO product VALUES(NULL, '雅诗兰黛精华水', 200, 'c003');
INSERT INTO product VALUES(NULL, '香奈儿香水', 350, 'c003');
INSERT INTO product VALUES(NULL, 'SK-II神仙水', 350, 'c003');
INSERT INTO product VALUES(NULL, '资生堂粉底液', 180, 'c003');

INSERT INTO product VALUES(NULL, '白象方便面', 56, 'c004');
INSERT INTO product VALUES(NULL, '卫龙辣条', 17, 'c004');
INSERT INTO product VALUES(NULL, '三只松鼠坚果', 88, 'c004');

返回结果如下。

值得一提的是auto_increment在给出后此列自动增加,所以在下面添加数据中对此列数据全部填为NULL依旧能够正确排序。

(二)简单查询

数据准备完成之后,就可以通过不同的需求使用SELECT语句对数据进行查询了,以下是简单的示例。

sql 复制代码
-- 1.查询所有商品
SELECT * FROM product; -- 查询product表的全部列

-- 2.查询商品名和商品价格
SELECT pname, price FROM product; -- 查询product表的pname和price列

-- 3.别名查询
-- 3.1.表别名
SELECT * FROM product AS p; -- 将product表命名为p,查询全部列
-- 3.2.列别名
SELECT pname AS pn FROM product; -- 将product表的pname列命名为pn,查询pn列

-- 4.去掉重复值
SELECT DISTINCT price FROM product; -- 查询product表中的price列,并去除重复值显示

-- 5.查询结果使用表达式,运算查询
SELECT pname, price+10 FROM product; -- 查询product表的pname和price列,并将price列的全部值加10

需要注意的是别名命名关键字为AS,但同时可以省略,如3.1.表别名案例可以写作如下格式。

sql 复制代码
-- 3.1.表别名
SELECT * FROM product p; -- 将product表命名为p,查询全部列

同时,虽然在简单查询中别名的使用并不显著,但通常在处理多表数据时会频繁使用,在5.查询结果使用表达式的内容中,日常操作可能是将修改后的列重新命名别名使用,如下。

sql 复制代码
-- 5.查询结果使用表达式,运算查询
SELECT pname, price+10 new_price FROM product; -- 查询product表的pname和price列,并将price列的全部值加10

此时查询后price列在全部值加10后被命名为new_price

三、DQL运算符

在 SQL 中,运算符用于执行各种操作,主要包括比较、数学计算、逻辑操作和字符串处理等。

MySQL主要支持四种运算符,分别是:

  • 算数运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符

(一)算数运算符

算数运算符用于进行算术计算。

算数运算符 说明
+ 加法运算符
- 减法运算符
* 乘法运算符
/ 除法运算符
% 取模运算符

以下是简单的使用示例。

sql 复制代码
SELECT name,price + 10 AS new_price FROM product; -- 将每件商品价格加10

SELECT pname,price * 1.1 AS new_price FROM product; -- 将每件商品价格上调10%

(二)比较运算符

比较运算符用于比较两个值或表达式,返回布尔值(TRUEFALSE)。

比较运算符 说明
= 用于检查两个值是否相等
!=<> 用于检查两个值是否不相等
> 用于检查一个值是否大于另一个值
< 用于检查一个值是否小于另一个值
>= 用于检查一个值是否大于或等于另一个值
<= 用于检查一个值是否小于或等于另一个值
BETWEEN 用于检查一个值是否在两个指定值之间
IN 用于检查一个值是否在指定的集合中
NOT IN 用于检查一个值是否不在指定的集合中
LIKE 用于进行通配符模式匹配
REGEXP 用于进行正则表达式模式匹配
IS NULL 用于检查值是否为 NULL
IS NOT NULL 用于检查值是否不为 NULL
LEAST 当有两个或多个参数时,返回最小值
GREATEST 当有两个或多个参数时,返回最大值

以下是简单的使用示例。

sql 复制代码
-- 查询商品名称为"海尔洗衣机"的全部信息
SELECT * FROM product WHERE pname = '海尔洗衣机';

-- 查询价格为800的商品
SELECT * FROM product WHERE price = 800;

-- 查询价格不为800的商品
SELECT * FROM product WHERE price != 800;
SELECT * FROM product WHERE price <> 800;

-- 查询价格大于60的商品
SELECT * FROM product WHERE price > 60;

-- 查询价格在200到1000之间的所有商品
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;

-- 查询价格为200或800的商品
SELECT * FROM product WHERE price IN(200,800);

-- 查询含有"裤"的商品
SELECT * FROM product WHERE pname LIKE '%裤%'; -- 通配符"%"表示任意字符

-- 查询以"水"结尾的商品
SELECT * FROM product WHERE pname LIKE '%水';

-- 查询第二个字为"克"的商品
SELECT * FROM product WHERE pname LIKE '_克%'; -- 通配符"_"表示单个字符

-- 查询以category_id为null的商品
SELECT * FROM product WHERE category_id IS NULL;

-- 查询以category_id不为null的商品
SELECT * FROM product WHERE category_id IS NOT NULL;

(三)逻辑运算符

逻辑运算符用于组合多个条件表达式。

逻辑运算符 说明
AND&& 逻辑与,用于连接多个条件,只有所有条件都为 TRUE 时结果才为 TRUE
OR或`
NOT! 逻辑非,用于取反条件的结果。即条件为 TRUE 时返回 FALSE,条件为 FALSE 时返回 TRUE

以下是简单的使用示例。

sql 复制代码
-- 查询价格不为800的商品
SELECT * FROM product WHERE NOT(price = 800);

-- 查询价格在200到1000之间的所有商品
SELECT * FROM product WHERE price >= 200 AND price <= 1000;

-- 查询价格为200或800的商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price = 200 || price = 800;

(四)位运算符

位运算符用于对整数进行位级操作。

位运算符 说明
& 按位与运算符,用于计算两个数的每一位的与
` `
^ 按位异或运算符,用于计算两个数的每一位的异或
~ 按位取反运算符,用于取反数的每一位
<< 按位左移运算符,将一个整数的位向左移动指定的位数
>> 按位右移运算符,将一个整数的位向右移动指定的位数

四、DQL基本查询

(一)排序查询

当在MySQL中需要对读取的数据进行排序,就可以使用ORDER BY子句来设定按某个字段某种方式进行排序后,再返回搜索结果。ORDER BY用于子句中可以支持单个字段,多个字段,表达式,函数,别名。

ORDER BY子句,放在查询语句的最后面(LIMIT子句除外)。

具体查询语法如下所示。

sql 复制代码
SELECT 
字段1,字段2,...
FROM 表名
ORDER BY 字段名1[ASC|DESC],字段名2[ASC|DESC],...

在语法中可以看到,排序查询分为两种模式,而使用ASC是升序查询(英语ascend);使用DESC则为降序查询(英语descend);需要注意,如果不输入则默认为升序。

以下是简单的示例。

sql 复制代码
-- 使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;

-- 在价格排序的基础上,以分类ID排序(升序)
SELECT * FROM product ORDER BY price DESC,category_id ASC;

-- 显示商品的价格(去重复),并排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC; 

(二)聚合查询

在 MySQL 中,聚合查询用于对数据进行汇总和计算,以获得一个结果集的统计信息。具体而言,之前使用的方法都是横向查询 ,即根据条件一行行地判断;而使用聚合函数的聚合查询则是纵向查询,是将一整列的值进行计算,从而返回一个计算后的单一的值。

另外,聚合函数会忽略空值。具体聚合函数如下所示。

聚合函数 作用
COUNT() 统计指定列不为NULL的记录行数
SUM() 计算指定列的数值和(如果指定列类型不是数值类型,那么计算结果为0)
AVG() 计算指定列的平均值(如果指定列类型不是数值类型,那么计算结果为0)
MAX() 计算指定列的最大值(如果指定列是字符串类型, 那么使用字符串排序运算)
MIN() 计算指定列的最小值(如果指定列是字符串类型, 那么使用字符串排序运算)

使用以上的聚合函数可以进行聚合查询,具体示例如下。

sql 复制代码
-- 查询商品的总条数
SELECT COUNT(pid) FROM product;
SELECT COUNT(*) FROM product;

-- 查询价格大于200的商品的总条数
SELECT COUNT(pid) FROM product WHERE price > 200;

-- 查询分类为"c001"所有商品的总和
SELECT SUM(price) FROM product WHERE category_id = 'c001';

-- 查询分类为"c002"所有商品的平均值
SELECT AVG(price) FROM product WHERE category_id = 'c002';

-- 查询商品的最大价格
SELECT MAX(price) FROM product;

-- 查询商品的最小价格
SELECT MIN(price) FROM product;

(三)分组查询

在 MySQL 中,分组查询用于将结果集分成若干组,并对每组数据进行聚合操作。分组查询通常与 GROUP BY 子句和HAVING子句结合使用,还可以配合聚合函数来统计和分析数据。

其语法格式为如下所示。

sql 复制代码
SELECT 字段1,字段2,... FROM 表名 GROUP BY 分组字段 HAVING 分组条件;

下面是简单的示例。

sql 复制代码
-- 统计各个分类的商品的个数
SELECT category_id,COUNT(*) FROM product GROUP BY category_id;

返回结果如下。

如果要进行分组的话,则SELECT子句之后只能出现分组的字段和统计函数,其他的字段不能出现。另外,GROUP BY字段后可以使用多个字段,只有多个字段都相同的值才会归于同一类。

同时,如果希望对分类结果进行筛选,不能使用WHERE,而是需要使用HAVING子句,具体示例如下。

sql 复制代码
-- 统计各个分类商品的个数,且只显示个数大于4的商品信息
SELECT category_id,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 4;

返回结果如下。

(四)分页查询

在 MySQL 中,分页查询用于从查询结果集中获取特定范围的数据。这在处理大量数据时非常有用,尤其是在显示分页结果时,如在网站上显示搜索结果或列表,例如一共30条信息,可以选择一页显示5条信息,即第一页显示1-5条,第二页显示6-10条等。

具体语法格式如下。

sql 复制代码
SELECT 字段1,字段2,... FROM 表名 LIMIT 偏移量,记录数;

以下是简单的示例。

sql 复制代码
-- 查询product表前5条数据记录
SELECT * FROM product LIMIT 5;

-- 查询product表的记录,从第4条开始,显示5条
SELECT * FROM product LIMIT 3,5;

我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!同时,欢迎你参观我的个人网站EliasChang.xyz,我的博客将首发在上面~

相关推荐
乖乖是干饭王24 分钟前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
敖云岚27 分钟前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
我在北京coding1 小时前
300道GaussDB(WMS)题目及答案。
数据库·gaussdb
待什么青丝1 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小Tomkk1 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
行云流水剑2 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
明月醉窗台2 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
虾球xz2 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
沉到海底去吧Go3 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名