DQL(数据库查询语言)

查询语句

基础查询

  1. 多字段查询 ​​select 字段名1, 字段名2... from 表名;​​(查询所有用*代替所有字段)
  2. 去除重复 ​​select distinct 字段名 from 表名;​​(如果两个字段名要都相同才能去重)

​MySQL DISTINCT语句​

  1. 计算列 ​​select 字段名1+字段名2 from 表名;​​(可以使用四则运算来简单计算数据)

​select '123'+90;​​​ 则为 213
​​​select 'a'+90;​​​ 则为90, 转换失败,则字符型数值转换为0

若数据中有null, null参与运算,计算结果为null, 则将有null的字段用​​​IFNULL(字段名, 0)​​​ eg : ​​select NAME, math, english, math + IFNULL(english, 0) from stu;​
​[ifnull函数]​​: 判断某字段或表达式是否为null, 如果为null, 返回指定的值, 否则返回原本的值
​[isnull函数]​​: 判断某字段或表达式是否为null, 如果是, 则返回1, 否则返回0

  1. 起别名 : ​​select 字段名 AS 别名 from 表名;​​(可以用AS, 也可以用一个或多个空格)
  2. 查询数据是否存在: ​​select exists(select * from 表名 where 条件)​
  3. 字符串拼接: ​​select concat(字段名1, 字段名2) from 表名;​

字符型和日期型常量值必须用单引号引起来, 数值型不需要

条件查询

  1. where子句后跟条件
  2. 运算符
    > < <= >= = <>(!=)
    and(&&) or(||)
    not/!
    BETWEEN…AND… (包含边界值) ​​select * from stu where age BETWEEN 20 AND 30;​​(查询年龄在20到30岁的学生的所有信息)

NOT BETWEEN … AND … : 不在…和…之间的值

  1. IN(集合) ​​select * from stu where age IN (19, 20, 23);​​(查询年龄为19,20或23岁的学生的所有信息)
    IS NULL ​​select * from stu where english IS NOT NULL;​​(查询英语成绩不为null的学生的所有信息)
    LIKE : 模糊查询
    占位符 :
    _ : 单个任意字符
    % : 多个任意字符
    eg : ​​select * from stu where name LIKE '%晓%';​​(查询名字中包含晓的学生的所有信息)

排序查询

  • order by 排序字段1 排序方式, 排序字段2 排序方式2…
    ​​​select * from stu ORDER BY math;​​(默认升序排列)
  • 排序方式 ASC : 升序(默认) DESC : 降序
    ​​​select * from stu ORDER BY math ASC;​​​​select * from stu ORDER BY math DESC;​

字符函数

日期函数
​​​MySQL 日期与时间方面的函数 - 极客学院​​​​MySQL日期和时间函数 - 易百教程​

聚合函数

将一列数据作为一个整体, 进行纵向的计算.
Tips : 聚合函数的计算, 排除null的值.
解决方案 : 1. 选择不包含非空的列进行计算 2. IFNULL函数(eg: ​​​IFNULL(math, 0)​​ : 意思是如果math中有null, 则为0)

  1. count : 计算个数
  2. max : 计算最大值
  3. min : 计算最小值
  4. sum : 计算和
  5. avg : 计算平均值
    eg :​​​select AVG(IFNULL(math, 0) from stu;​​ : 查询stu表中math的平均成绩,如果列中有null, 则为0

分组查询

GROUP BY 分组字段;

注意事项 :

  1. 使用分组后, 查询的字段 : 分组字段, 聚合函数(其他字段的话没有意义)
  2. where 和 having 的区别
  1. where 在分组之前进行限定, 如果不满足条件, 则不参与分组. having 在分组之后进行限定, 如果不满足结果, 则不会被查询出来.
  2. where 后不可以跟聚合函数, having 可以进行聚合函数的判断

​select sex , AVG(math), COUNT(id) peo_sum from stu where math > 70 GROUP BY sex HAVING peo_sum > 2;​​ : 按照性别分组, 查询stu表, 分数大于70分, 分为男 女两组, 分别显示数学平均成绩和男女所占人数

分析上面的查询语句 : 首先, 分组之前 先进行where进行筛选, 查询数学分数大于70, 之后开始GROUP BY对性别进行分组. 分组完成后, 上面将COUNT(id)计算人数的聚合函数起了别名peo_num, 然后根据分组后的数据继续通过HAVING进行筛选, 查询人数大于2. 完成了查询分组在查询的操作后, 开始显示数据.(其中显示的数据, 可以是 分组的字段, 对元数据进行聚合函数的显示, 否则其他列字段没有意义)

分页查询

  1. 语法 : ​​LIMIT 开始的索引, 每页显示的条数;​
  2. 公式 : 开始的索引 : (当前的页码 - 1) * 每页显示的条数
    eg :
select * from stu LIMIT 0, 3; -- 第一页
select * from stu LIMIT 3, 3; -- 第二页
select * from stu LIMIT 6, 3; -- 第三页

sql语句根据条件查询指定数量的数据


SELECT * from 表名 WHERE 条件 limit 5,10; //检索6-15条数据

SELECT * from 表名 WHERE 条件 limit 5,-1; //检索6到最后一条数据

SELECT * from 表名 WHERE 条件 limit 5; //检索前5条数据

查询涉及到的所有的关键字

SELECT 查询列表
FROM 表
连接类型 JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后的筛选
ORDER BY 排序列表
LIMIT 偏移, 条目数;

联合查询

语法:
查询语句1
union
查询语句2
union


应用场景:
要查询的结果来自于多个表, 且多个表没有直接的连接关系, 但查询的信息一致时

特点:

  1. 要求多条查询语句的查询列数是一致的
  2. 要求多条查询语句的查询的每一列的类型和顺序最好一致
  3. union关键字默认去重, 如果使用union all 可以包含重复项