• 【MySQL】(六)DQL表查询操作



    前言
    本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘

    所有SQL语法中符号含义:

    1. { }:必选项;
    2. [ ]:可选项;
    3. |:或,多选一

    1. 单表查询

    1.1 单表查询语法

    - 查询部门表中的信息
    SELECT * FROM departments;
    
    • 1
    • 2
    • 单表查询:从一张表中查询所需要的数据,所有查询操作都比较简单
    • * 代表所有的列
    • 语法:SELECT * FROM 表名;

    1.2 字段查询

    -- 查询部门的名称
    SELECT dept_name FROM departments;
    
    • 1
    • 2
    • 查询多个字段(列),可以使用 , 对字段进行分隔
    • 语法:SELECT 列名 FROM 表名;

    1.3 起别名

    • 为表起别名:
      • SELECT 列名 FROM 表名 表别名;
    • 为字段起别名:
      • SELECT 列名 AS 别名 FROM 表名;
    -- 查询员工信息,并将列名改为中文
    SELECT 
        emp_no AS '编号',
        first_name AS '名',
        last_name AS '姓',
        gender AS '性别',
        hire_date AS '入职时间'
    FROM
        employees emp;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.4 去重

    -- 去掉重复职级信息 
    SELECT DISTINCT title FROM titles;
    
    • 1
    • 2
    • DISTINCT 关键字:去掉重复信息
    • 语法:SELECT DISTINCT 列名 FROM 表名;

    2. 条件查询

    2.1 条件查询语法

    -- 条件查询
    SELECT 列名 FROM 表名 WHERE 条件表达式
    
    • 1
    • 2

    2.2 比较运算符

    运算符说明
    > < <= >= = <> !=大于、小于、小于等于、大于等于、等于、不等于
    BETWEEN...AND...范围限定
    IN子集限定
    LIKE '%or%'模糊查询
    IS NULL为空

    2.2.1 比较大小

     - 查询出生日期晚于 1965-01-01 的员工编号、姓名和生日
    SELECT 
        emp_no, first_name, last_name, birth_date
    FROM
        employees
    WHERE
        birth_date > '1965-01-01';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 语法:WHERE <列名> [> < <= >= = <> !=] <值>

    2.2.2 使用 BETWEEN 进行模糊查询

    -- 查询年薪介于 70000 到 70003 之间的员工编号和年薪
    SELECT 
        emp_no, salary
    FROM
        salaries
    WHERE
        salary BETWEEN 70000 AND 70003;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 语法:WHERE <列名> [NOT] BETWEEN <起始表达式> AND <结束表达式>
    • <起始表达式><结束表达式> 的顺序不能颠倒

    2.2.3 使用 IN 进行模糊查询

    -- 查询入职日期为 1995-01-27 和 1995-03-20 日的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
        hire_date IN ('1995-01-27', '1995-03-20');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2.4 判断是否为空

    -- 选择 hog_demo 为当前数据库
    USE hog_demo;
    
    -- 更新 student 表中 id 为 2 的 age 值为 NULL
    UPDATE student SET age = NULL WHERE id = 2;
    
    -- 查询学生表中年龄为 NULL 的学生信息
    SELECT 
        *
    FROM
        student
    WHERE
        age IS NULL;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 语法:WHERE <列名> IS [NOT] NULL

    2.3 逻辑运算符

    运算符说明
    AND &&多个条件同时成立
    OR ||多个条件任一成立
    NOT不成立
    -- 1.查询名字为 Lillian 并且姓氏为 Haddadi 的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
        first_name = 'Lillian'
            AND last_name = 'Haddadi';
    
    
    -- 2.查询名字为 Lillian 或者姓氏为 Terkki 的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
        first_name = 'Lillian'
            OR last_name = 'Terkki';
    
    
    -- 3.查询名字为 Lillian 并且性别不是女的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
       first_name = 'Lillian'
       and not gender='F';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.4 通配符

    运算符说明
    %匹配任意多个字符
    -匹配一个字符
    -- 1. 查询名字中包含 fai 的员工的信息
    SELECT 
        *
    FROM
        employees
    WHERE
        first_name LIKE '%fai%';
    
    
    -- 2. 查询名字中 fa 开头的名字长度为 3 位的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
        first_name LIKE 'fa_';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3. 排序

    3.1 排序语法

    -- 对查询结果进行排序
    SELECT 列名 FROM 表名 
    [WHERE 条件表达式] 
    ORDER BY 列名1 [ASC / DESC],
    列名2 [ASC / DESC]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • ASC 表示升序排序(默认)
    • DESC 表示降序排序

    3.2 单列排序

    只按照某一个列进行排序, 就是单列排序

    -- 使用 salary 字段,对 salaries 表数据进行升序排序
    SELECT * FROM salaries ORDER BY salary;
    
    -- 使用 salary 字段,对 salaries 表数据进行降序排序
    SELECT * FROM salaries ORDER BY salary DESC;
    
    -- 查询员工的编号和入职日期,按照员工入职日期从晚到早排序
    SELECT 
        emp_no, hire_date
    FROM
        employees
    ORDER BY hire_date DESC;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.3 组合排序

    -- 在入职时间排序的基础上,再使用 emp_no 进行排序
    -- 组合排序 
    SELECT 
        emp_no, hire_date
    FROM
        employees
    ORDER BY hire_date DESC, emp_no DESC;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 同时对多个字段进行排序
    • 如果第一个字段相同,就按照第二个字段进行排序

    4. 聚合函数

    4.1 聚合函数

    • COUNT():统计指定列不为 NULL 的记录行数
    • MAX():计算指定列的最大值
    • MIN():计算指定列的最小值
    • SUM():计算指定列的数值和
    • AVG():计算指定列的平均值

    4.2 聚合查询

    -- 查询职级名称为 Senior Engineer 的员工数量
    SELECT 
        COUNT(*)
    FROM
        titles
    WHERE
        title = 'Senior Engineer';
    
    
    -- 查询员工编号为 10002 的员工的最高年薪
    SELECT 
        MAX(salary)
    FROM
        salaries
    WHERE
        emp_no = 10002;
    
    
    -- 查询员工编号为 10002 的员工的最低年薪
    SELECT 
        MIN(salary)
    FROM
        salaries
    WHERE
        emp_no = 10002;
    
    
    -- 查询员工编号为 10002 的员工的薪水总和
    SELECT 
        SUM(salary)
    FROM
        salaries
    WHERE
        emp_no = 10002;
    
    
    -- 查询员工编号为 10002 的员工的平均年薪
    SELECT 
        AVG(salary)
    FROM
        salaries
    WHERE
        emp_no = 10002;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 语法:SELECT 聚合函数(列名) FROM 表名;

    5. 分组

    5.1 分组查询语法

    -- 分组查询
    SELECT 分组列/聚合函数 FROM 表名 
    GROUP BY 分组列 
    [HAVING 条件];
    
    • 1
    • 2
    • 3
    • 4
    • 分组列:按哪些列进行分组
    • HAVING:对分组结果再次过滤

    5.2 示例

    -- 查询每个员工的薪资和
    SELECT 
        emp_no, SUM(salary)
    FROM
        salaries
    GROUP BY emp_no;
    
    -- 查询员工编号小于 10010 的,薪资和小于 400000 的员工的薪资和
    SELECT 
        emp_no, SUM(salary)
    FROM
        salaries
    WHERE
        emp_no < 10010
    GROUP BY emp_no
    HAVING SUM(salary) < 400000;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.3 子句区别

    • WHERE 子句:从数据源中去掉不符合其搜索条件的数据
    • GROUP BY 子句:搜集数据行到各个组中,统计函数为各个组计算统计值
    • HAVING 子句:去掉不符合其组搜索条件的各行数据行

    6. limit关键字

    6.1 LIMIT 关键字

    -- 限制查询结果行数
    SELECT 列名1, 列名2... 
    FROM 表名 
    LIMIT [开始的行数], <查询记录的条数>
    
    -- 使用 OFFSET 关键字指定开始的行数
    SELECT 列名1, 列名2... 
    FROM 表名 
    LIMIT <查询记录的条数> OFFSET <开始的行数>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    限制查询结果的数量

    • 开始的行数:从 0 开始记数, 如果省略则默认为 0
    • 查询记录的条数:返回的行数

    6.2 示例

    -- 展示前 10 条员工信息
    SELECT * FROM employees LIMIT 10;
    SELECT * FROM employees LIMIT 0, 10;
    SELECT * FROM employees LIMIT 10 OFFSET 0;
    
    -- 显示年薪从高到低排序,第 15 位到第 20 位员工的编号和年薪
    --方式一
    SELECT 
        emp_no, salary
    FROM
        salaries
    ORDER BY salary DESC
    LIMIT 14, 6;
    
    --方式二
    SELECT 
        emp_no, salary
    FROM
        salaries
    ORDER BY salary DESC
    LIMIT 6 OFFSET 14;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    7. SQL 语句执行顺序

    在这里插入图片描述

    -- 基础查询语法
    SELECT DISTINCT <列名>
    FROM <表名>
    WHERE <查询条件表达式>
    GROUP BY <分组的列名>
    HAVING <分组后的查询条件表达式>
    ORDER BY <排序的列名> [ASC / DESC]
    LIMIT [开始的行数], <查询记录的条数>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    单表查询也是有自己的执行顺序的,通过图示的,我们可以知道,当进行单表查询的时候,查询会先执行where条件,然后是group by ,然后是having条件,接着是order by 最后才会执行limit

    这个顺序我们必须了解,尤其当后面学习到多表查询或者复杂的查询语句时,熟知查询执行的顺序在一定程序上会帮助我们减少sql的错误。


    文末说明:
    接口测试中我们很容易混淆Session、cookie和token,你知道他们有什么区别吗?

    快来跟我一起看,一篇文章让你了解三者的区别。😎
    ⬇⬇⬇⬇⬇⬇⬇
    👍👍👍:接口测试经典面试题:Session、cookie、token有什么区别?

  • 相关阅读:
    电商评论文本情感分类(中文文本分类)(第二部分-Bert)
    PerfView专题 (第八篇):洞察 C# 内存泄漏之寻找静态变量名和GC模式
    哪些因素取决于产品设计中的质量?
    手机怎么修改照片大小尺寸?这两种方法轻松解决
    java 写excel文件
    Java并发编程学习十二:死锁问题
    终于有人把面试必考的动态规划、链表、二叉树、字符串全部撸完了
    .NET 分页帮助类
    kafka 动态扩容现有 topic 的分区数和副本数
    Nginx网站服务
  • 原文地址:https://blog.csdn.net/gjj920318/article/details/126419842