一、什么是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;
-
offset:每页的起始下标,可以理解为跳过了多少条数据,第一页的下标为0,当第一页从第一条数据开始显示时,0是可以省略的。
-
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语句必须使用表别名,不然可能会报错。