MySQL学习日志--DQL和它的七大字句

一、什么是DQL

DQL:Data Query Language)数据查询语言,DQL是SQL中专门用于从数据库检索数据的语言,核心就是查询。

DQL语句的操作仅用于查询和检索,不会对数据库中的内容进行改变。

二、七大子句

七大字句是DQL的核心组成部分。它们是专门为数据查询而设计的语法结构,在使用的过程中,七大子句各司其职,并且在书写时有着固定的先后顺序。

具体内容如下

|----------|------------------|------|------|
| 子句 | 作用 | 书写顺序 | 执行顺序 |
| SELECT | 显示需要查询的的字段的值 | ① | ⑤ |
| FROM | 确定数据的来源,比如来源于某张表 | ② | ① |
| WHERE | 对未分组的数据进行过滤 | ③ | ② |
| GROUP BY | 对过滤后的数据进行分组 | ④ | ③ |
| HAVING | 对分组后的数据再次过滤 | ⑤ | ④ |
| ORDER BY | 对得到的结果进行排序 | ⑥ | ⑥ |
| LIMIT | 分页显示表中的内容 | ⑦ | ⑦ |

完整的代码顺序示例如下:

sql 复制代码
SELECT 字段
FROM 来源表
WHERE 条件
GROUP BY 分组依据的字段
HAVING 条件
ORDER BY 升序/降序
LIMIT(n,m);

在这里先简单介绍一下七大子句的作用和顺序,下面我们会细说他们的使用。

三、查询语句

3.1 基本的简单查询(SELECT / FROM)

  • 查询表中有哪些字段
sql 复制代码
DESC 表名;
  • 全表查询

" * " 代表全部内容。

sql 复制代码
SELECT * FROM 表名;

需要注意的是,我们一般不会允许使用* 去查询所有,因为即使写了*,在查询的过程中也会被转换成字段名的方式,另一个原因是*的可读性差,不便于理解。

  • 部分查询
sql 复制代码
SELECT 字段名1,字段名2,...字段名n 
FROM 表名;
  • 为查询的内容取别名

可以为字段取别名,也可以给表取别名,如:

sql 复制代码
字段名 AS 别名;

表名 AS 别名;
  • 去重查询
sql 复制代码
SELECT DISTINCT 字段名 FROM 表名

3.2 条件查询(WHERE)

条件查询一般使用WHERE,在FROM后进行where进行条件筛选,关于条件查询我们需要了解到多种情况,如下:

  • 单条件查询
sql 复制代码
WHERE 字段 运算符 值;
-- 判断运算符有=  >  <  >=  <=  !=
  • 多条件查询
sql 复制代码
WHERE 条件1 AND/OR 条件2
  • 区间查询
sql 复制代码
WHERE 字段 BETWEEN 小值 AND 大值;
  • 空值查询
sql 复制代码
WHERE 字段 IS NULL;
  • 枚举查询

在这里,in可以理解成字段等于里面值的时候。

sql 复制代码
WHERE 字段 IN (值1,值2.....值n);
  • 模糊查询

有关模糊查询,我们需要先知道占位符有什么。

占位符:

%:可以代表0 - n 个字符(不确定数量的)

_:代表是一个字符(确定数量的)

sql 复制代码
WHERE 字段 LIKE '匹配规则';
-- 比如查询姓张的人:
WHERE 字段 LIKE '张%';

四、函数

4.1 单行函数

特点:表中存在多少行数据,经过单行函数的处理,就会有多少个结果。

|--------------------------------|---------------|
| 函数名 | 函数作用 |
| length(字段 / 值) | 获取某个字段 / 值的长度 |
| concat(字段 / 值1,字段2... 字段 / 值n) | 将不同字段或值拼接展示 |

4.2 聚合函数/组函数

特点:以组为单位处理数据,表中存在多少个组,通过组函数的处理就会有多少个结果。

注意:在没有分组的情况下,默认将整张表当作一个组来看待。

|-----------|------------------------|
| 函数名 | 函数作用 |
| max(字段) | 求一组数据的最大值 |
| min(字段) | 求一组数据的最小值 |
| sum(字段) | 求一组数据的总和 |
| avg(字段) | 求一组数据的平均值 |
| count(*) | 统计行数 |
| count(字段) | 统计某一个字段的数量(统计的是非空值的数量) |

五、分组(GROUP BY)

对分组的理解:分组顾名思义,将元素分成一个一个小组,也就是按照一定的特性条件去将数据元素进行分类,分类后的数据根据这些特性变成了一组一组的,我们通过对每一组的数据进行操作。

比如现在有一个员工表employees,我们要找到不同部门中的工资最高的人,那么就需要我们去根据部门id对员工进行分组,然后对分组后的每一组,也就是每个部门里挑出来工资最高的那个人,这就是分组的应用。

5.1 单值分组

现在有一个员工表employees,以部门id进行分组,查询每个部门的平均工资,示例如下:

sql 复制代码
SELECT department_id,AvG(salary)
FROM employees 
GROUP BY department_id;

5.2 多值分组

多值分组允许有多个分组字段,通过多个条件进行分组。

相比于单值分组来说,多值分组的通过多字段交叉分类,结果是唯一组合。

比如在分组字段上加一条工作id:

sql 复制代码
SELECT department_id,AvG(salary)
FROM employees 
GROUP BY department_id , job_id;

5.3 分组的使用原则

分组使用原则,即select后可以查询出现的字段:

1)只有出现在group by后的字段,才可以出现在select后

2)没有出现在group by后的字段,可以配合组函数出现在select后

5.4 where和having的区别(HAVING)

where后不能跟组函数,需要使用having对分组后的数据再次过滤,having写在分组(group by)之后。

where和having的区别:

1)where是对分组前的数据进行过滤,having是对分组后的数据进行过滤

2)如果where和having同时适用,优先选择where

六、排序(ORDER BY)

排序语句:

sql 复制代码
order by 排序规则;

排序规则:asc(升序)/ desc(降序)

asc(升序)是默认的,可以省略。

七、分页显示数据(limit )

limit:分页显示数据;可以理解是将你查询出来的结果的那个张表,分成多页,limit展示的就是你要查询的那一页。分页语法如下:

sql 复制代码
limit offset,rows;
  1. offset:每页的起始下标,可以理解为跳过了多少条数据,第一页的下标为0,当第一页从第一条数据开始显示时,0是可以省略的。

  2. rows:每页显示的条数。

需要注意的是,limit需要写在查询语句的最后面。

八、子查询

所谓子查询,其实就是查询的嵌套,当我们掌握了前面的查询语法,可以理清每个查询语句后面跟的内容是什么后,再来看子查询,就会更得心应手一些。

我们大致可以将其分为两类:

1)WHERE子查询:将一个sql语句的查询结果,作为了另一个sql语句的查询条件。

  • 单值子查询:

被嵌套的sql语句的查询结果是一个值(一行一列),例如:

sql 复制代码
SELECT * 
FROM departments
WHERE department id = (
    SELECT department id 
    FROM employees 
    WHERE employee_ id = 170
);
  • 多值子查询:

被嵌套的sql语句的查询结果是多个值(多行一列),例如:

sql 复制代码
SELECT * 
FROM departments
WHERE department_id IN (
    SELECT department_id 
    FROM employees 
    WHERE first_name ='Steven'
);

2)FROM子查询:
被嵌套的语句的查询结果是多行多列,可以理解是将查询结果看作是一张表进行使用了。

一般用于数据的筛选,被嵌套的sql语句必须使用表别名,不然可能会报错。

相关推荐
于眠牧北10 小时前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤1 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip