0
点赞
收藏
分享

微信扫一扫

【MySQL8.0】DQL数据查询详细学习教程(完整版)

兮城 2022-05-24 阅读 72

Tips: 文章有点儿长,可以通过目录快速阅读哦~~~


文章目录


1 DQL基本查询

1.1 概念

  • 数据库管理系统一个重要的功能就是查询数据,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示
  • MySQL数据库使用select语句来查询数据。

1.2 语法格式

  • 一般格式(加中括号的部分可以省略):
SELECT
	[ALL|DISTINCT]
	<目标列的表达式1> [别名],
	<目标列的表达式2> [别名]...
FROM <表名或视图名> [别名], <表名或视图名> [别名]...
[WHERE <条件表达式>]
[GROUP BY <列名>]
[HAVING <条件表达式>]
[ORDER BY <列名> [ASC|DESC]]
[LIMIT <数字或列表>];
  • 精简版格式:
    SELECT *| 列名 FROMWHERE 条件;

2 数据准备

  • 新建一个数据库以及表格,用于练习,具体代码如下:
-- 创建数据库
CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;

-- 创建商品表
CREATE TABLE product(
	pid INT PRIMARY KEY auto_increment, -- 商品编号
	pname VARCHAR(20) NOT NULL, -- 商品名称
	price DOUBLE, -- 商品价格
	category_id VARCHAR(20) -- 商品所属品类
)

-- 添加数据
INSERT INTO product 
VALUES(NULL, '海尔洗衣机', 5000, 'c001'),
			(NULL, '美的空调', 3000, 'c001'),
			(NULL, '格力空调', 5000, 'c001'),
			(NULL, '九阳电饭煲', 5000, 'c001'),
			(NULL, '啄木鸟衬衣', 300, 'c002'),
			(NULL, '恒源祥西裤', 800, 'c002'),
			(NULL, '花花公子夹克', 440, 'c002'),
			(NULL, '劲霸休闲裤', 266, 'c002'),
			(NULL, '海澜之家卫衣', 180, 'c002'),
			(NULL, '杰克琼斯运动裤', 430, 'c002'),
			(NULL, '兰蔻面霜', 300, 'c003'),
			(NULL, '雅诗兰黛精华水', 200, 'c003'),
			(NULL, '香奈儿香水', 350, 'c003'),
			(NULL, 'SK-II神仙水', 350, 'c003'),
			(NULL, '资生堂粉底液', 180, 'c003'),
			(NULL, '老北京方便面', 56, 'c004'),
			(NULL, '良品铺子海带丝', 17, 'c004'),
			(NULL, '三只松鼠坚果', 88, NULL);
  • 建好的表格信息如下:

product


3 简单查询

3.1 查询所有商品

SELECT * FROM product;

3.2 查询商品名和商品价格

SELECT pname, price FROM product;

实现结果:

查询2

3.3 别名查询(使用AS)

3.3.1 表别名

在单表查询中意义不大,主要在多表查询中使用。

SELECT * FROM product AS P; -- AS其实可以省略,但是这样写可读性强

3.3.2 列别名

SELECT pname AS '商品名称', price '商品价格' FROM product;

实现结果:

3.3.2

3.4 去掉重复值

  • 通过添加关键字DISTINCT实现:
SELECT DISTINCT price FROM product;

实现结果:

3.4

3.5 运算查询(查询结果为表达式)

  • 例子,将所有商品加价100元显示(该操作不会改变原基本表的值):
SELECT pname, price + 100 FROM product; -- 注意,该操作不会改变原表的值

实现结果:

3.5


4 运算符

数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。

4.1 算术运算符

算术运算符说明
+加法运算
-减法运算
*乘法运算
/ 或者 DIV 除法运算
% 或者 MOD求余运算

4.2 比较运算符

比较运算符说明
=等于
< 和 <=小于和小于等于
> 和 >=大于和大于等于
<=>安全的操作,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
<> 或 !=不等于
IS NULL判断一个值是否为NULL
IS NOT NULL判断一个值是否不为NULL
LEAST当有两个或者多个参数时,返回最小值
GREATEST当有两个或者多个参数时,返回最大值
BETWEEN AND判断一个值是否落在两个值之间
IN判断一个值是IN列表中的任意一个值
NOT IN判断一个值不是IN列表中的任意一个值
LIKE通配符匹配
REGEXP正则表达式匹配

4.3 逻辑运算符

逻辑运算符说明
NOT 或者 !逻辑非
AND 或者 &&逻辑与
OR 或者 \ \ (竖线)逻辑或
XOR逻辑异或

4.4 位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

位运算符说明
\ (竖线)按位或
&按位与
^按位异或
<<按位左移
>>按位右移
~按位取反,反转所有比特

Tips: 位运算符了解即可,如果感兴趣可以看看博主的这篇文章:【JavaSE】【计算机系统基础】原码、反码、补码及位运算详解(重点)


5 条件查询

  • 查询商品名称为“海尔洗衣机”的商品所有信息
SELECT * FROM product WHERE pname = '海尔洗衣机';
  • 查询价格不是800的所有商品
SELECT * FROM product WHERE price != 800; -- 方式1
SELECT * FROM product WHERE price <> 800; -- 方式2
SELECT * FROM product WHERE NOT(price = 800); -- 方式3
  • 查询价格在200到1000之间的所有商品信息
SELECT * FROM product WHERE price >= 200 and price <= 1000;  -- 方式1
SELECT * FROM product WHERE price BETWEEN 200 and 1000;  -- 方式2
  • 查询价格是200或800的所有商品信息
SELECT * FROM product WHERE price = 200 or price = 800;  -- 方式1
SELECT * FROM product WHERE price in(200, 800);  -- 方式2
SELECT * FROM product WHERE price = 200 || price = 800;  -- 方式3
  • 查询含有"裤"字的商品信息
格式说明
like '裤'包含裤
like '%裤'以何开头不重要,以裤结尾即可
like '%裤%'开头结尾不关心,只要中间包含裤即可
SELECT * FROM product WHERE pname like '%裤';
  • 查询第二个字为’蔻’的所有商品
SELECT * FROM product WHERE pname like '_蔻%';

在这里插入图片描述

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

6 排序查询 – order by

6.1 排序查询说明

🆔 介绍:

 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 中的 order by 子句来设定你想按哪个字段哪种方式进行排序,然后返回结果。

🍑 语法:

SELECT 
	字段名1, 字段名2, ......
FROM 表名
ORDER BY 字段名1 [asc|desc], 字段名2 [asc|desc]......

🐘 说明:

6.2 价格降序查询

SELECT * FROM product ORDER BY price DESC;

在这里插入图片描述

6.3 价格降序的基础上,分类降序

 即价格按照从大到小的形式展示,但是,当价格相同时,则按照分类id从大到小的顺序展示。

SELECT * FROM product ORDER BY price DESC, category_id DESC;

在这里插入图片描述

6.4 去重排序

  显示商品的价格(去重复),并降序排序

SELECT DISTINCT price FROM product ORDER BY price DESC;

在这里插入图片描述


7 聚合查询

7.1 聚合查询及聚合函数

🆔 简介:

  之前我们所做的查询都是横向查询,即都是根据条件一行一行的进行判断。而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值,需要注意的是,聚合函数会忽略 Null

🍑 聚合函数:

聚合函数作用
count()统计指定列不为Null的记录行数
sum()计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0
max()计算指定列的最大值,如果指定列是字符串类型,则使用字符串排序运算
min()计算指定列的最小值,如果指定列是字符串类型,则使用字符串排序运算
avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0

7.2 聚合查询实例

  • 查询价格大于200的商品总条数
SELECT COUNT(pid) FROM product;
  • 查询分类为"c001"的所有商品的价格总和
SELECT SUM(price) FROM product WHERE category_id = 'c001';
  • 查询商品的最大价格
SELECT MAX(price) FROM product;
  • 查询商品的最小价格
SELECT MIN(price) FROM product;
  • 查询分类为 “c002” 的所有商品的平均价格
SELECT AVG(price) FROM product WHERE category_id = 'c002';

7.3 NULL值处理

1️⃣ count()函数对 null 值的处理

2️⃣ sum() 与 avg() 函数对 null 值的处理

3️⃣ max() 与 min() 函数对 null 值的处理


8 分组查询 – group by

8.1 分组查询说明

🆔 简介:

  分组查询是指使用 group by 子句对查询信息进行分组。相当于根据 group by 子句后的分组字段对表进行切分,相同字段的为一张表。

🍑 语法:

SELECT 字段1, 字段2... FROM 表名 GROUP BY 分组字段 HAVING 分组条件;

如果进行分组的话,则 SELECT 子句后,只能出现分组的字段和统计函数,其他字段不能出现。

8.2 分组查询实例

🐯 统计各类商品的个数

SELECT category_id, count(pid) FROM product GROUP BY category_id;

示意图:
在这里插入图片描述
解释:

8.3 分组查询的条件筛选 – having

🍓 分组之后的条件筛选使用 having 实现:

🍑 语法:

SELECT 字段1, 字段2... FROM 表名 GROUP BY 分组字段 HAVING 分组条件;

🖊 操作实例:统计各类商品的个数,且只显示个数大于4的信息

SELECT
	category_id,
	count(pid) count_pid
FROM
	product
GROUP BY
	category_id
HAVING
	count_pid > 4;

如果需要升序显示结果,则只需要添加 order by:

SELECT
	category_id,
	count(pid) count_pid
FROM
	product
GROUP BY
	category_id
HAVING
	count_pid > 4
ORDER BY
	count_pid ASC;

9 分页查询 – limit

9.1 分页查询说明

🆔 简介:

 分页查询在项目开发中常见,由于数据量巨大,显示屏长度有限,因此需要对数据采取分页显示方式。

🍑 语法:

-- 方式1 显示前n条
SELECT 字段1, 字段2... FROM 表名 LIMIT n;

-- 方式2 分页显示
SELECT 字段1, 字段2... FROM 表名 LIMIT m, n;
-- m: 整数,表示从第几条索引开始,计算方式(当前页-1)*每页条数
-- n: 整数, 表示查询多少条数据

9.2 分页查询实例

🐯 1. 查询 product 表的前3条数据

SELECT
	*
FROM
	product
LIMIT 3;

在这里插入图片描述

🐯 2.从第4条开始显示,显示5条

SELECT
	*
FROM
	product
LIMIT 3, 5;

在这里插入图片描述


10 INSERT INTO SELECT语句

🆔 简介:

  将一张表的查询结果导入另一张表中。

🍑 语法:

-- 方式1
INSERT INTO2(字段1, 字段2...) SELECT 字段1, 字段2... FROM1;
-- 方式2
INSERT INTO2 SELECT * FROM1;

👨 说明:

10.1 案例实例

🐑 先创建一个 product2 表,并将 product 的所有 pname 和 pid 插入到 product2表

-- 创建表
CREATE TABLE product2 (
	pname VARCHAR (20),
	price DOUBLE
);

-- 插入数据
INSERT INTO product2 (pname, price) SELECT
	pname,
	price
FROM
	product;
-- 查询数据
SELECT
	*
FROM
	product2;

在这里插入图片描述


11 正则表达式

11.1 简介与格式

🆔 简介:

正则表达式描述了一种字符串匹配的规则, 正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在 MySQL 中通过 REGEXP 关键字进行正则表达式字符串匹配。

🍑 格式:

模式描述
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
.匹配除 \n 以外的任何单个字符
[…]字符集合。匹配所包含的任意一个字符。例如,[abc] 可以匹配 plan 中的 a
[^…]负值字符集合。匹配未包含的任意字符。例如,[^abc]可以匹配 plan 中的 p
p1 | p2 | p3匹配 p1 或 p2 或 p3。例如,z| food 匹配 z 或 food, (z|f)ood 匹配 zood或 food
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 z 以及 zoo,* 等价于 {0, }
+匹配前面的子表达式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,* 等价于 {1,}
{n}n为非负整数。匹配确定的 n 次。
{n,m}m 与 n均为非负整数,n <= m,表示最少匹配 n 次,最多匹配 m 次
(xyz)xyz作为一个序列匹配

11.2 正则表达式匹配查询实例

SELECT 'abc' REGEXP '^a';  -- 1
SELECT 'abc' REGEXP '^b';  -- 0
SELECT 'abc' REGEXP 'a$';  -- 0
SELECT 'abc' REGEXP 'c$';  -- 1
SELECT 'abc' REGEXP '.a';  -- 0
SELECT 'abc' REGEXP '.ab';  -- 0
SELECT 'abc' REGEXP 'a.c';  -- 1
SELECT 'abc' REGEXP '.ac';  -- 0
SELECT 'Nezuko627' REGEXP '[xyz]';  -- 1
SELECT 'Nezuko627' REGEXP '[abc]';  -- 0
SELECT 'Nezuko627' REGEXP '[^abc]';  -- 1
SELECT 'Nezuko627' REGEXP '[^xyz]';  -- 1
SELECT '是你的大头呢' REGEXP '大头*';  -- 1
SELECT '是你的大什么头呢' REGEXP '大头*';  -- 1
SELECT '几何心凉' REGEXP '几何心凉了吗*';  -- 0
SELECT '几何心凉' REGEXP '几何心凉吗*';  -- 1
SELECT '几何心凉' REGEXP '(几何心凉吗)*';  -- 1
SELECT '是你的大头呢' REGEXP 'Nezuko+';  -- 0
SELECT '小鹏鹏鹏linux' REGEXP '小鹏{3}';  -- 1
SELECT '小丫么小牛马小牛马' REGEXP '小丫.小牛马{2}';  -- 0
SELECT '小丫么小牛马小牛马' REGEXP '小丫.(小牛马){2}';  -- 1
SELECT '小丫么小牛马小牛马' REGEXP '小丫.(小牛马){3,5}';  -- 0
SELECT 'knighthood2001' REGEXP '.(2001)$';  -- 1
SELECT 'knighthood2001' REGEXP '(.2001)$';  -- 1
SELECT 'knighthood2001' REGEXP '(.2001.)$';  -- 0
SELECT 'knighthood2001' REGEXP '(.2001).$';  -- 0

写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
在这里插入图片描述

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
在这里插入图片描述

举报

相关推荐

0 条评论