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语句必须使用表别名,不然可能会报错。

相关推荐
悠哉悠哉愿意2 小时前
【EDA学习笔记】电子技术基础知识:读懂与画好原理图
笔记·单片机·嵌入式硬件·学习·eda
YJlio2 小时前
文件工具学习笔记(12.7):Sysinternals 文件工具实战总览与排障闭环
笔记·学习·计算机外设
L.fountain2 小时前
图像自回归生成(Auto-regressive image generation)实战学习(三)
人工智能·深度学习·学习·回归
有谁看见我的剑了?2 小时前
ESXI 虚拟机文件组成学习
运维·学习·云计算
代码游侠2 小时前
应用——UDP 网络编程
linux·运维·开发语言·学习·算法
张人玉2 小时前
WPF HTTPS 通信示例使用说明
数据库·网络协议·http·c#·wpf
长春小霸王2 小时前
labview sqlite增删改查
数据库·sqlite·labview
leaf9z2 小时前
麒麟系统V10部署MySQL8及主从复制
mysql
猿小喵2 小时前
记录一次TDSQL-MySQL数据库主从延迟导致批量报错
数据库·mysql