个人主页:Nezuko627的博客主页
❤️ 支持我: 点赞 收藏 关注
格言:立志做一个有思想的程序员
作者介绍:本人本科软件工程在读,博客主要涉及JavaSE、JavaEE、MySQL、SpringBoot、算法等知识。专栏内容长期更新,如有错误,欢迎评论区或者私信指正!感谢大家的支持~~~本文来自专栏:MySQL8.0学习笔记
本文参考视频:零基础mysql数据库入门到高级全套教程
欢迎点击支持订阅专栏 ❤️
Tips: 文章有点儿长,可以通过目录快速阅读哦~~~
select
语句来查询数据。SELECT
[ALL|DISTINCT]
<目标列的表达式1> [别名],
<目标列的表达式2> [别名]...
FROM <表名或视图名> [别名], <表名或视图名> [别名]...
[WHERE <条件表达式>]
[GROUP BY <列名>]
[HAVING <条件表达式>]
[ORDER BY <列名> [ASC|DESC]]
[LIMIT <数字或列表>];
SELECT
*| 列名 FROM
表 WHERE
条件;-- 创建数据库
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);
SELECT * FROM product;
SELECT pname, price FROM product;
实现结果:
在单表查询中意义不大,主要在多表查询中使用。
SELECT * FROM product AS P; -- AS其实可以省略,但是这样写可读性强
SELECT pname AS '商品名称', price '商品价格' FROM product;
实现结果:
DISTINCT
实现:SELECT DISTINCT price FROM product;
实现结果:
SELECT pname, price + 100 FROM product; -- 注意,该操作不会改变原表的值
实现结果:
数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或者 DIV |
除法运算 |
% 或者 MOD |
求余运算 |
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的操作,两个操作码均为NULL 时,其所得值为1;而当一个操作码为NULL 时,其所得值为0 |
<> 或 != | 不等于 |
IS NULL |
判断一个值是否为NULL |
IS NOT NULL |
判断一个值是否不为NULL |
LEAST |
当有两个或者多个参数时,返回最小值 |
GREATEST |
当有两个或者多个参数时,返回最大值 |
BETWEEN AND |
判断一个值是否落在两个值之间 |
IN |
判断一个值是IN 列表中的任意一个值 |
NOT IN |
判断一个值不是IN 列表中的任意一个值 |
LIKE |
通配符匹配 |
REGEXP |
正则表达式匹配 |
逻辑运算符 | 说明 |
---|---|
NOT 或者 ! |
逻辑非 |
AND 或者 && |
逻辑与 |
OR 或者 \ \ (竖线) |
逻辑或 |
XOR |
逻辑异或 |
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
位运算符 | 说明 |
---|---|
\ (竖线) | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
Tips: 位运算符了解即可,如果感兴趣可以看看博主的这篇文章:【JavaSE】【计算机系统基础】原码、反码、补码及位运算详解(重点)
SELECT * FROM product WHERE pname = '海尔洗衣机';
SELECT * FROM product WHERE price != 800; -- 方式1
SELECT * FROM product WHERE price <> 800; -- 方式2
SELECT * FROM product WHERE NOT(price = 800); -- 方式3
SELECT * FROM product WHERE price >= 200 and price <= 1000; -- 方式1
SELECT * FROM product WHERE price BETWEEN 200 and 1000; -- 方式2
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 '_蔻%';
在 SQL 里,null 不能使用 = 来判断,在 SQL 里甚至 null 都不 = null,在这里我们需要使用 is null 来判断是否为 null。
SELECT * FROM product WHERE category_id IS NULL;
介绍:
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 中的 order by 子句来设定你想按哪个字段哪种方式进行排序,然后返回结果。
语法:
SELECT
字段名1, 字段名2, ......
FROM 表名
ORDER BY 字段名1 [asc|desc], 字段名2 [asc|desc]......
说明:
- asc 代表升序,desc 代表降序,不声明默认为升序;
- order by 用于子句可以支持单个字段,多个字段,表达式,函数,别名;
- order by 子句放在查询语句最后面,LIMIT 子句除外。
SELECT * FROM product ORDER BY price DESC;
即价格按照从大到小的形式展示,但是,当价格相同时,则按照分类id从大到小的顺序展示。
SELECT * FROM product ORDER BY price DESC, category_id DESC;
显示商品的价格(去重复),并降序排序
SELECT DISTINCT price FROM product ORDER BY price DESC;
简介:
之前我们所做的查询都是横向查询,即都是根据条件一行一行的进行判断。而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值,需要注意的是,聚合函数会忽略 Null
。
聚合函数:
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为Null的记录行数 |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,则使用字符串排序运算 |
min() | 计算指定列的最小值,如果指定列是字符串类型,则使用字符串排序运算 |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
SELECT COUNT(pid) FROM product;
SELECT SUM(price) FROM product WHERE category_id = 'c001';
SELECT MAX(price) FROM product;
SELECT MIN(price) FROM product;
SELECT AVG(price) FROM product WHERE category_id = 'c002';
1️⃣ count()函数对 null 值的处理
如果 count 函数的参数为星号(*),则统计所有记录的个数。如果参数为某字段,不统计含 null 值的记录个数。
2️⃣ sum() 与 avg() 函数对 null 值的处理
忽略 null 值的存在,等价于 null 不存在。
3️⃣ max() 与 min() 函数对 null 值的处理
同样忽略 null 值,相当于不存在。
简介:
分组查询是指使用 group by 子句对查询信息进行分组。相当于根据 group by 子句后的分组字段对表进行切分,相同字段的为一张表。
语法:
SELECT 字段1, 字段2... FROM 表名 GROUP BY 分组字段 HAVING 分组条件;
如果进行分组的话,则 SELECT 子句后,只能出现分组的字段和统计函数,其他字段不能出现。
统计各类商品的个数
SELECT category_id, count(pid) FROM product GROUP BY category_id;
首先先根据 group by 后的分组字段对表进行拆分,而后聚合 count 统计 pid 个数,最后通过 select 将信息展示出来,经过了去重处理。
分组之后的条件筛选使用 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的行,结果如下图:
如果需要升序显示结果,则只需要添加 order by:
SELECT
category_id,
count(pid) count_pid
FROM
product
GROUP BY
category_id
HAVING
count_pid > 4
ORDER BY
count_pid ASC;
简介:
分页查询在项目开发中常见,由于数据量巨大,显示屏长度有限,因此需要对数据采取分页显示方式。
语法:
-- 方式1 显示前n条
SELECT 字段1, 字段2... FROM 表名 LIMIT n;
-- 方式2 分页显示
SELECT 字段1, 字段2... FROM 表名 LIMIT m, n;
-- m: 整数,表示从第几条索引开始,计算方式(当前页-1)*每页条数
-- n: 整数, 表示查询多少条数据
1. 查询 product 表的前3条数据
SELECT
*
FROM
product
LIMIT 3;
2.从第4条开始显示,显示5条
SELECT
*
FROM
product
LIMIT 3, 5;
简介:
将一张表的查询结果导入另一张表中。
语法:
-- 方式1
INSERT INTO 表2(字段1, 字段2...) SELECT 字段1, 字段2... FROM 表1;
-- 方式2
INSERT INTO 表2 SELECT * FROM 表1;
说明:
将表1的查询结果插入到表2中,表2为目标表。要求字段一 一对应,且目标表2必须存在!
先创建一个 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;
简介:
正则表达式描述了一种字符串匹配的规则, 正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在 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作为一个序列匹配 |
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
以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”