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

个人主页:Nezuko627的博客主页
❤️ 支持我: 点赞 收藏 关注
格言:立志做一个有思想的程序员
作者介绍:本人本科软件工程在读,博客主要涉及JavaSE、JavaEE、MySQL、SpringBoot、算法等知识。专栏内容长期更新,如有错误,欢迎评论区或者私信指正!感谢大家的支持~~~

本文来自专栏:MySQL8.0学习笔记
本文参考视频:零基础mysql数据库入门到高级全套教程
欢迎点击支持订阅专栏 ❤️
【MySQL8.0】DQL数据查询详细学习教程(完整版)_第1张图片

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


文章目录

  • 1 DQL基本查询
    • 1.1 概念
    • 1.2 语法格式
  • 2 数据准备
  • 3 简单查询
    • 3.1 查询所有商品
    • 3.2 查询商品名和商品价格
    • 3.3 别名查询(使用AS)
      • 3.3.1 表别名
      • 3.3.2 列别名
    • 3.4 去掉重复值
    • 3.5 运算查询(查询结果为表达式)
  • 4 运算符
    • 4.1 算术运算符
    • 4.2 比较运算符
    • 4.3 逻辑运算符
    • 4.4 位运算符
  • 5 条件查询
  • 6 排序查询 -- order by
    • 6.1 排序查询说明
    • 6.2 价格降序查询
    • 6.3 价格降序的基础上,分类降序
    • 6.4 去重排序
  • 7 聚合查询
    • 7.1 聚合查询及聚合函数
    • 7.2 聚合查询实例
    • 7.3 NULL值处理
  • 8 分组查询 -- group by
    • 8.1 分组查询说明
    • 8.2 分组查询实例
    • 8.3 分组查询的条件筛选 -- having
  • 9 分页查询 -- limit
    • 9.1 分页查询说明
    • 9.2 分页查询实例
  • 10 INSERT INTO SELECT语句
    • 10.1 案例实例
  • 11 正则表达式
    • 11.1 简介与格式
    • 11.2 正则表达式匹配查询实例
  • 写在最后


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);
  • 建好的表格信息如下:

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第2张图片


3 简单查询

3.1 查询所有商品

SELECT * FROM product;

3.2 查询商品名和商品价格

SELECT pname, price FROM product;

实现结果:

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第3张图片

3.3 别名查询(使用AS)

3.3.1 表别名

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

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

3.3.2 列别名

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

实现结果:

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第4张图片

3.4 去掉重复值

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

实现结果:

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第5张图片

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

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

实现结果:

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第6张图片


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 的商品

在 SQL 里,null 不能使用 = 来判断,在 SQL 里甚至 null 都不 = null,在这里我们需要使用 is null 来判断是否为 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]......

说明:

  1. asc 代表升序,desc 代表降序,不声明默认为升序;
  2. order by 用于子句可以支持单个字段,多个字段,表达式,函数,别名;
  3. order by 子句放在查询语句最后面,LIMIT 子句除外。

6.2 价格降序查询

SELECT * FROM product ORDER BY price DESC;

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第7张图片

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

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

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

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第8张图片

6.4 去重排序

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

SELECT DISTINCT price FROM product ORDER BY price DESC;

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第9张图片


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 值的处理

如果 count 函数的参数为星号(*),则统计所有记录的个数。如果参数为某字段,不统计含 null 值的记录个数。

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

忽略 null 值的存在,等价于 null 不存在。

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

同样忽略 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;

示意图:
【MySQL8.0】DQL数据查询详细学习教程(完整版)_第10张图片
解释:

  首先先根据 group by 后的分组字段对表进行拆分,而后聚合 count 统计 pid 个数,最后通过 select 将信息展示出来,经过了去重处理。

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

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

1.分组之后对统计结果进行筛选必须使用 having 不能使用 where;
2.where 子句用来筛选 from 子句中指定的操作所产生的行;
3.group by 子句用来分组 where 子句的输出;
4.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;

在该例子中,count(pid) 的结果我们取了个别名 count_pid,其前面省略了关键字 AS,并使用 having 筛选了分组后个数大于4的行,结果如下图:
【MySQL8.0】DQL数据查询详细学习教程(完整版)_第11张图片

如果需要升序显示结果,则只需要添加 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;

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第12张图片

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

SELECT
	*
FROM
	product
LIMIT 3, 5;

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第13张图片


10 INSERT INTO SELECT语句

简介:

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

语法:

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

说明:

将表1的查询结果插入到表2中,表2为目标表。要求字段一 一对应,且目标表2必须存在!

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;

【MySQL8.0】DQL数据查询详细学习教程(完整版)_第14张图片


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 正则表达式匹配查询实例

1为匹配成功,0为匹配不成功。注意区分有无()的区别,博主就踩了坑~

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

写在最后

以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
【MySQL8.0】DQL数据查询详细学习教程(完整版)_第15张图片

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

你可能感兴趣的:(MySQL8.0学习笔记,数据库,mysql)