0


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

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

本文来自专栏:MySQL8.0学习笔记
本文参考视频:零基础mysql数据库入门到高级全套教程
欢迎点击支持订阅专栏 ❤️
在这里插入图片描述

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


文章目录


1 DQL基本查询

1.1 概念

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

1.2 语法格式

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

2 数据准备

  • 新建一个数据库以及表格,用于练习,具体代码如下:
-- 创建数据库CREATEDATABASEIFNOTEXISTS mydatabase;USE mydatabase;-- 创建商品表CREATETABLE product(
    pid INTPRIMARYKEYauto_increment,-- 商品编号
    pname VARCHAR(20)NOTNULL,-- 商品名称
    price DOUBLE,-- 商品价格
    category_id VARCHAR(20)-- 商品所属品类)-- 添加数据INSERTINTO 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实现:
SELECTDISTINCT price FROM product;

实现结果:

3.4

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

  • 例子,将所有商品加价100元显示(该操作不会改变原基本表的值):
SELECT pname, price +100FROM 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;-- 方式1SELECT*FROM product WHERE price <>800;-- 方式2SELECT*FROM product WHERENOT(price =800);-- 方式3
  • 查询价格在200到1000之间的所有商品信息
SELECT*FROM product WHERE price >=200and price <=1000;-- 方式1SELECT*FROM product WHERE price BETWEEN200and1000;-- 方式2
  • 查询价格是200或800的所有商品信息
SELECT*FROM product WHERE price =200or price =800;-- 方式1SELECT*FROM product WHERE price in(200,800);-- 方式2SELECT*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 ISNULL;

6 排序查询 – order by

6.1 排序查询说明

🆔 介绍:

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

🍑 语法:

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

🐘 说明:

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

6.2 价格降序查询

SELECT*FROM product ORDERBY price DESC;

在这里插入图片描述

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

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

SELECT*FROM product ORDERBY price DESC, category_id DESC;

在这里插入图片描述

6.4 去重排序

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

SELECTDISTINCT price FROM product ORDERBY price DESC;

在这里插入图片描述


7 聚合查询

7.1 聚合查询及聚合函数

🆔 简介:

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

Null

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

7.2 聚合查询实例

  • 查询价格大于200的商品总条数
SELECTCOUNT(pid)FROM product;
  • 查询分类为"c001"的所有商品的价格总和
SELECTSUM(price)FROM product WHERE category_id ='c001';
  • 查询商品的最大价格
SELECTMAX(price)FROM product;
  • 查询商品的最小价格
SELECTMIN(price)FROM product;
  • 查询分类为 “c002” 的所有商品的平均价格
SELECTAVG(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 表名 GROUPBY 分组字段 HAVING 分组条件;

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

8.2 分组查询实例

🐯 统计各类商品的个数

SELECT category_id,count(pid)FROM product GROUPBY category_id;

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

  首先先根据 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 表名 GROUPBY 分组字段 HAVING 分组条件;

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

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

在该例子中,count(pid) 的结果我们取了个别名 count_pid,其前面省略了关键字 AS,并使用 having 筛选了分组后个数大于4的行,结果如下图:
在这里插入图片描述

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

SELECT
    category_id,count(pid) count_pid
FROM
    product
GROUPBY
    category_id
HAVING
    count_pid >4ORDERBY
    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
LIMIT3;

在这里插入图片描述

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

SELECT*FROM
    product
LIMIT3,5;

在这里插入图片描述


10 INSERT INTO SELECT语句

🆔 简介:

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

🍑 语法:

-- 方式1INSERTINTO 表2(字段1, 字段2...)SELECT 字段1, 字段2...FROM 表1;-- 方式2INSERTINTO 表2SELECT*FROM 表1;

👨 说明:

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

10.1 案例实例

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

-- 创建表CREATETABLE product2 (
    pname VARCHAR(20),
    price DOUBLE);-- 插入数据INSERTINTO product2 (pname, price)SELECT
    pname,
    price
FROM
    product;-- 查询数据SELECT*FROM
    product2;

在这里插入图片描述


11 正则表达式

11.1 简介与格式

🆔 简介:

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

REGEXP

关键字进行正则表达式字符串匹配。

🍑 格式:
模式描述^匹配输入字符串的开始位置$匹配输入字符串的结束位置.匹配除 \n 以外的任何单个字符[…]字符集合。匹配所包含的任意一个字符。例如,[abc] 可以匹配 plan 中的 a[^…]负值字符集合。匹配未包含的任意字符。例如,[^abc]可以匹配 plan 中的 pp1 | 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';-- 1SELECT'abc'REGEXP'^b';-- 0SELECT'abc'REGEXP'a$';-- 0SELECT'abc'REGEXP'c$';-- 1SELECT'abc'REGEXP'.a';-- 0SELECT'abc'REGEXP'.ab';-- 0SELECT'abc'REGEXP'a.c';-- 1SELECT'abc'REGEXP'.ac';-- 0SELECT'Nezuko627'REGEXP'[xyz]';-- 1SELECT'Nezuko627'REGEXP'[abc]';-- 0SELECT'Nezuko627'REGEXP'[^abc]';-- 1SELECT'Nezuko627'REGEXP'[^xyz]';-- 1SELECT'是你的大头呢'REGEXP'大头*';-- 1SELECT'是你的大什么头呢'REGEXP'大头*';-- 1SELECT'几何心凉'REGEXP'几何心凉了吗*';-- 0SELECT'几何心凉'REGEXP'几何心凉吗*';-- 1SELECT'几何心凉'REGEXP'(几何心凉吗)*';-- 1SELECT'是你的大头呢'REGEXP'Nezuko+';-- 0SELECT'小鹏鹏鹏linux'REGEXP'小鹏{3}';-- 1SELECT'小丫么小牛马小牛马'REGEXP'小丫.小牛马{2}';-- 0SELECT'小丫么小牛马小牛马'REGEXP'小丫.(小牛马){2}';-- 1SELECT'小丫么小牛马小牛马'REGEXP'小丫.(小牛马){3,5}';-- 0SELECT'knighthood2001'REGEXP'.(2001)$';-- 1SELECT'knighthood2001'REGEXP'(.2001)$';-- 1SELECT'knighthood2001'REGEXP'(.2001.)$';-- 0SELECT'knighthood2001'REGEXP'(.2001).$';-- 0

写在最后

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

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

标签: 数据库 mysql

本文转载自: https://blog.csdn.net/m0_60353039/article/details/123855163
版权归原作者 Nezuko627 所有, 如有侵权,请联系我们删除。

“【MySQL8.0】DQL数据查询详细学习教程(完整版)”的评论:

还没有评论