MySQL DQL 数据查询(完整版)
---
课程目标
- [ ] 掌握条件查询
- [ ] 掌握聚合函数
- [ ] 掌握分组查询
- [ ] 掌握分页查询
- [ ] 了解 having 子句的作用
- [ ] 掌握连接查询
---
数据准备
-- 创建数据库
create database test1;
-- 切换到test1数据库
use test1;
-- 创建产品表
CREATE TABLE tb_product
(
pid INT PRIMARY KEY auto_increment comment '产品id编号',
pname VARCHAR(20) comment '产品名称',
price int comment '产品价格',
category_id VARCHAR(32) comment '产品所属分类编号(c001电子产品,c002服装)'
);
-- 插入数据
INSERT INTO tb_product VALUES (1,'联想',5000,'c001');
INSERT INTO tb_product VALUES (2,'海尔',3000,'c001');
INSERT INTO tb_product VALUES (3,'雷神',5000,'c001');
INSERT INTO tb_product VALUES (4,'杰克琼斯',800,'c002');
INSERT INTO tb_product VALUES (5,'真维斯',200,'c002');
INSERT INTO tb_product VALUES (6,'花花公子',440,'c002');
INSERT INTO tb_product VALUES (7,'劲霸',2000,'c002');
INSERT INTO tb_product VALUES (8,'香奈儿',800,'c003');
INSERT INTO tb_product VALUES (9,'相宜本草',200,'c003');
INSERT INTO tb_product VALUES (10,'面霸',10,'c003');
INSERT INTO tb_product VALUES (11,'好想你枣',5,'c004');
INSERT INTO tb_product VALUES (12,'香飘飘奶茶',10,'c005');
INSERT INTO tb_product VALUES (13,'海澜之家',200,'c002');
INSERT INTO tb_product VALUES (14,'男人之家',200,'c003');
INSERT INTO tb_product VALUES (15,'男人之家',200);Linux中导入数据的方式
# 1. 进入到数据库中,创建对应的数据库
root@localhost [(none)]> create database test2;
Query OK, 1 row affected (0.01 sec)
# 2. 在服务器中有创建表和插入表中的数据文件 db.sql
[root@node3 /data]# vi db.sql
-- 内容就是上面所提供的
# 3. 通过mysql命令导入
[root@node3 /data]# mysql -uroot -pAa123456. test2 </data/db.sql 2>/dev/null
# 4. 创建用户和授权
root@localhost [(none)]> create user 'test2'@'%' identified by 'test2';
Query OK, 0 rows affected (0.01 sec)
root@localhost [(none)]> grant select on test2.* to 'test2'@'%';
Query OK, 0 rows affected (0.00 sec)
root@localhost [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
- 使用
mysql客户端连接数据库并执行 SQL 或客户端命令。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
- 成功后客户端会连接目标服务并执行指定操作;失败时检查地址、端口、用户、密码和数据库名称。
关键参数:
注意事项:
**执行结果:**
| 商品名称 | 价格 |
|---|---|
| 联想 | 5000 |
| 海尔 | 3000 |
| 雷神 | 5000 |
| 杰克琼斯 | 800 |
| 真维斯 | 200 |
| 花花公子 | 440 |
| 劲霸 | 2000 |
| 香奈儿 | 800 |
| 相宜本草 | 200 |
| 面霸 | 10 |
| 好想你枣 | 5 |
| 香飘飘奶茶 | 10 |
| 海澜之家 | 200 |
| 男人之家 | 200 |
执行结果:
---
| 分类 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 比较运算 | = | 等于 | age = 18 |
!= 或 <> | 不等于 | age != 20 | |
>、<、>=、<= | 大于、小于、大于等于、小于等于 | score >= 90 | |
| 范围 | BETWEEN ... AND ... | 在区间范围内(包含两端) | score BETWEEN 60 AND 100 |
| 集合 | IN (...) | 在集合中 | age IN (18, 20, 22) |
NOT IN (...) | 不在集合中 | age NOT IN (18, 20) | |
| 模糊匹配 | LIKE | 模糊匹配字符串 | name LIKE '张%' |
% 代表零个或多个任意字符 | name like '_为' | ||
_ 代表一个字符 | |||
| 空值 | IS NULL | 值为空 | address IS NULL |
IS NOT NULL | 值不为空 | address IS NOT NULL | |
| 逻辑运算 | AND | 并且(与) | age > 18 AND gender='F' |
OR | 或者(或) | age < 18 OR gender='F' | |
NOT | 取反(非) | NOT age > 18 |
**匹配条件符号:**注意:
执行结果:
---
语法:
**应用场景:**
);
完整语法:
**执行结果:**
| left('你好世界',2) |
|---|
| 你好 |
应用场景:
**执行结果:**
| substr('aabbcc',3,2) |
|---|
---
| 聚合函数 | 作用 |
|---|---|
| `count()` | 统计指定列不为NULL的记录行数;`count(*)` |
| `sum()` | 计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0 |
| `max()` | 计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算 |
| `min()` | 计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算 |
| `avg()` | 计算指定列的平均值,如果指定列类型不是数值类型,则计算结果为0 |
);执行结果:
---
假设你是一家公司的HR,手里有一张员工工资表。你想知道每个部门的平均工资。
结果可能是:
分组字段, 聚合函数(统计字段)
);
---
| 对比项 | WHERE | HAVING |
|---|---|---|
| 作用时机 | 分组前过滤原始数据 | 分组后过滤聚合结果 |
| 能否用聚合函数 | 不能(如 COUNT(), AVG()) | 能 |
| 适用对象 | 单行数据(每一条记录) | 分组后的"组"(每组一条汇总记录) |
| 执行顺序 | 在 GROUP BY 之前执行 | 在 GROUP BY 之后执行 |
执行结果:
---
| 关键字 | 说明 |
|---|---|
| ASC(Ascend) | 升序(默认),默认情况下,ASC关键词可以省略不写,从小到大 |
| DESC(Descend) | 降序,从大到小 |
执行结果:
---
应用场景:
限制查询主要限制数据查询的数量。
语法格式:
假设1次取10条记录
**执行结果:**
---