MySQL DQL 数据查询(完整版)

---

课程目标

---

数据准备

-- 创建数据库
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)

命令作用:

执行结果:

关键参数:

注意事项:


**执行结果:**

| 商品名称 | 价格 |
|---|---|
| 联想 | 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,手里有一张员工工资表。你想知道每个部门的平均工资。

结果可能是:

分组字段, 聚合函数(统计字段)




);

---

对比项WHEREHAVING
作用时机分组前过滤原始数据分组后过滤聚合结果
能否用聚合函数不能(如 COUNT(), AVG())
适用对象单行数据(每一条记录)分组后的"组"(每组一条汇总记录)
执行顺序在 GROUP BY 之前执行在 GROUP BY 之后执行

执行结果:

---

关键字说明
ASC(Ascend)升序(默认),默认情况下,ASC关键词可以省略不写,从小到大
DESC(Descend)降序,从大到小

执行结果:

---

应用场景:

限制查询主要限制数据查询的数量。

语法格式:

假设1次取10条记录

**执行结果:**



---