写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!
【MySQL数据库学习】系列文章
第一章 《认识与环境搭建》
第二章 《数据类型》
第三章 《数据定义语言DDL》
第四章 《数据操作语言DML》
第五章 《约束》
第六章 《数据查询语言DQL》
文章目录
一、DQL介绍
DQL(数据查询语言,Data Query Language) 是 SQL(结构化查询语言)的一部分,专注于从数据库中查询和检索数据。DQL 的主要功能是帮助用户获取所需的信息,而不是对数据库中的数据进行修改。最常用的 DQL 语句是 SELECT
。
DQL通用的语法过于复杂,初学可以先记住SELECT
、FROM
和WHERE
三个关键词即可,简化后的基本语法如下。
SELECT *| 列名 FROM 表 WHERE 条件
二、DQL简单查询
(一)数据准备
在演示DQL的使用前,需要先做好示例的数据准备,以下是一个简单的数据示例。
-- 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
语句对数据进行查询了,以下是简单的示例。
-- 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.表别名案例可以写作如下格式。
-- 3.1.表别名
SELECT * FROM product p; -- 将product表命名为p,查询全部列
同时,虽然在简单查询中别名的使用并不显著,但通常在处理多表数据时会频繁使用,在5.查询结果使用表达式的内容中,日常操作可能是将修改后的列重新命名别名使用,如下。
-- 5.查询结果使用表达式,运算查询
SELECT pname, price+10 new_price FROM product; -- 查询product表的pname和price列,并将price列的全部值加10
此时查询后price
列在全部值加10后被命名为new_price
。
三、DQL运算符
在 SQL 中,运算符用于执行各种操作,主要包括比较、数学计算、逻辑操作和字符串处理等。
MySQL主要支持四种运算符,分别是:
- 算数运算符
- 比较运算符
- 逻辑运算符
- 位运算符
(一)算数运算符
算数运算符用于进行算术计算。
算数运算符 | 说明 |
---|---|
+ |
加法运算符 |
- |
减法运算符 |
* |
乘法运算符 |
/ |
除法运算符 |
% |
取模运算符 |
以下是简单的使用示例。
SELECT name,price + 10 AS new_price FROM product; -- 将每件商品价格加10
SELECT pname,price * 1.1 AS new_price FROM product; -- 将每件商品价格上调10%
(二)比较运算符
比较运算符用于比较两个值或表达式,返回布尔值(TRUE
或 FALSE
)。
比较运算符 | 说明 |
---|---|
= |
用于检查两个值是否相等 |
!= 或
|
用于检查两个值是否不相等 |
> |
用于检查一个值是否大于另一个值 |
|
用于检查一个值是否小于另一个值 |
>= |
用于检查一个值是否大于或等于另一个值 |
|
用于检查一个值是否小于或等于另一个值 |
BETWEEN |
用于检查一个值是否在两个指定值之间 |
IN |
用于检查一个值是否在指定的集合中 |
NOT IN |
用于检查一个值是否不在指定的集合中 |
LIKE |
用于进行通配符模式匹配 |
REGEXP |
用于进行正则表达式模式匹配 |
IS NULL |
用于检查值是否为 NULL |
IS NOT NULL |
用于检查值是否不为 NULL |
LEAST |
当有两个或多个参数时,返回最小值 |
GREATEST |
当有两个或多个参数时,返回最大值 |
以下是简单的使用示例。
-- 查询商品名称为“海尔洗衣机”的全部信息
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 或|| |
逻辑或,用于连接多个条件,只要其中一个条件为 TRUE ,结果就为 TRUE |
NOT 或! |
逻辑非,用于取反条件的结果。即条件为 TRUE 时返回 FALSE ,条件为 FALSE 时返回 TRUE |
以下是简单的使用示例。
-- 查询价格不为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
子句除外)。
具体查询语法如下所示。
SELECT
字段1,字段2,...
FROM 表名
ORDER BY 字段名1[ASC|DESC],字段名2[ASC|DESC],...
在语法中可以看到,排序查询分为两种模式,而使用ASC
是升序查询(英语ascend);使用DESC
则为降序查询(英语descend);需要注意,如果不输入则默认为升序。
以下是简单的示例。
-- 使用价格排序(降序)
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() |
计算指定列的最小值(如果指定列是字符串类型, 那么使用字符串排序运算) |
使用以上的聚合函数可以进行聚合查询,具体示例如下。
-- 查询商品的总条数
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
子句结合使用,还可以配合聚合函数来统计和分析数据。
其语法格式为如下所示。
SELECT 字段1,字段2,... FROM 表名 GROUP BY 分组字段 HAVING 分组条件;
下面是简单的示例。
-- 统计各个分类的商品的个数
SELECT category_id,COUNT(*) FROM product GROUP BY category_id;
返回结果如下。
如果要进行分组的话,则SELECT
子句之后只能出现分组的字段和统计函数,其他的字段不能出现。另外,GROUP BY
字段后可以使用多个字段,只有多个字段都相同的值才会归于同一类。
同时,如果希望对分类结果进行筛选,不能使用WHERE
,而是需要使用HAVING
子句,具体示例如下。
-- 统计各个分类商品的个数,且只显示个数大于4的商品信息
SELECT category_id,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 4;
返回结果如下。
(四)分页查询
在 MySQL 中,分页查询用于从查询结果集中获取特定范围的数据。这在处理大量数据时非常有用,尤其是在显示分页结果时,如在网站上显示搜索结果或列表,例如一共30条信息,可以选择一页显示5条信息,即第一页显示1-5条,第二页显示6-10条等。
具体语法格式如下。
SELECT 字段1,字段2,... FROM 表名 LIMIT 偏移量,记录数;
以下是简单的示例。
-- 查询product表前5条数据记录
SELECT * FROM product LIMIT 5;
-- 查询product表的记录,从第4条开始,显示5条
SELECT * FROM product LIMIT 3,5;
我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!同时,欢迎你参观我的个人网站EliasChang.xyz,我的博客将首发在上面~
评论(0)