• 【DataBase】MySQL 06 条件查询 & 排序查询


    视频参考自:P28 - P42

    https://www.bilibili.com/video/BV1xW411u7ax

     

    条件查询概述

    # 进阶2 条件查询
    -- 语法:SELECT 查询列表 FROM 表名 WHERE 筛选条件;
    -- WHERE 关键字:当...筛选条件成立时,返回条件结果
    
    -- 分类1:按条件表达式筛选,条件运算符:大于>、小于<、等于=、不等于<>(!=)、大于等于>=、小于等于<=
    -- 分类2:按逻辑表达式筛选,逻辑运算符:且&&、或||、非!、MySQL推荐关键字[AND OR NOT]来表达
    -- 分类3:模糊查询:LIKE,BETWEEN AND,IN,IS NULL

    条件表达式

    # 按条件表达式筛选
    
    -- 案例1:查询工资大于12000的员工信息【如果单纯的说信息,那可以默认视为表的所有数据】
    SELECT * FROM `employees` WHERE `salary` > 12000;
    
    -- 案例2:查询部门编号不等于90的【员工名】和【部门编号】
    SELECT 
      `first_name`,`last_name`,`department_id` 
    FROM 
      `employees` 
    WHERE 
      `department_id` <> 90;

    逻辑表达式

    # 按逻辑表达式筛选  
    
    -- 案例1:查询工资在10000~20000之间的员工名,工资&奖金
    SELECT    
      `first_name`,`last_name`,`salary`,`commission_pct`
    FROM
      `employees`
    WHERE
      10000 <= `salary` AND `salary` <= 20000;  
    
    -- 案例2:查询部门编号不是在90~110之间,或者工资高于15000的员工信息
    SELECT 
      *
    FROM
      `employees`
    WHERE
      NOT(90 <= `department_id` AND `department_id` <= 110) OR (`salary` > 15000);
      -- `department_id` < 90 OR `department_id` > 110 OR `salary` > 15000;

    模糊条件查询

    # 按模糊条件查询
    -- LIKE        和通配符一起使用
    -- BETWEEN ... AND ...
    -- IN
    -- IS NULL | IS NOT NULL
    -- 通配符: %任意无或单或多字符 _任意1个字符
    
    
    -- LIKE 像...
    -- 案例1:查询员工名中包含字符a的员工信息
    SELECT * 
    FROM `employees` 
    WHERE `last_name` LIKE '%a%'; --  %通配符,表示无字符或者任意字符
    
    -- 案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
    SELECT `last_name`,`salary`
    FROM `employees`
    WHERE `last_name` LIKE '__n_l%'; -- '__e_a%' [无结果]

    转义处理

    -- 案例3:查询员工名中第二个字符为下划线的员工名[转义处理]
    SELECT `last_name`
    from `employees`
    WHERE `last_name` LIKE '_\_%';
    
    -- 或者我们自定义转义符 ESCAPE关键字
    SELECT `last_name`
    FROM `employees`
    WHERE `last_name` LIKE '_@_%' ESCAPE '@';
    --  LIKE '_a_%' ESCAPE 'a';
    --  LIKE '_$_%' ESCAPE '$'; 都可以

    BETWEEN ... AND ...

    -- BETWEEN .. AND .. 在...和...之间 
    -- 1、简化SQL,语义化SQL
    -- 2、这个取值包含值本身
    -- 3、值的位置不允许颠倒
    
    -- 案例1:查询员工编号100~120之间的员工信息
    SELECT * FROM `employees` WHERE `employee_id` BETWEEN 100 AND 120;

    IN(...)

    -- IN 关键字
    -- 1、IN 等同Java的枚举
    -- 2、提高SQL简洁和性能,语义化SQL
    -- 3、IN列表的值类型必须一致,或者兼容
    -- 4、IN的列表内容,不支持通配符【谁TM会往这里面写通配符啊!?】
    
    -- 案例:查询员工的工种是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    SELECT `last_name`,`job_id`
    FROM `employees` 
    WHERE `job_id` IN('IT_PROG','AD_VP','AD_PRES');
    -- 非IN的WHERE条件  job_id = 'IT_PROG' or job_id = 'AD_VP' or job_id = 'AD_PRES';

    空值判断与安全判断

    -- ISNULL
    -- = or <> 不能判断Null值
    -- is null 或者 is not null 只用于判断null值
     
    -- 案例:查询没有奖金的员工名和奖金串
    
    -- 有奖金 IS NOT NULL
    -- 没奖金 IS NULL
    -- 那怎么没有0的情况?
    
    SELECT `last_name`,`commission_pct`
    FROM `employees`
    WHERE `commission_pct` IS NOT NULL;
    
    # 什么是安全等于? <=>
    SELECT `last_name`,`commission_pct`
    FROM `employees`
    WHERE `commission_pct` <=> NULL; -- 判断是否为null值?
    
    -- 查询奖金为12000的信息
    SELECT `last_name`,`salary`
    FROM `employees`
    WHERE `salary` <=> 12000;
    
    -- IS NULL 仅判断NULL值
    -- <=> 既可以判断NULL值,也可以判断普通的数值
    -- 但是可读性很差,不建议使用

    练习案例:

    -- 1. 查询工资大于 12000 的员工姓名和工资
    SELECT `first_name`,`last_name` ,`salary`
    FROM `employees`
    WHERE `salary` > 12000;
    
    -- 2. 查询员工号为 176 的员工的姓名和部门号和年薪
    SELECT `first_name`,`last_name`,`department_id`,`salary` * 12
    FROM`employees`
    WHERE `employee_id` = 176;
    
    -- 3. 选择工资不在 5000 到 12000 的员工的姓名和工资
    SELECT `first_name`,`last_name`,`salary`
    FROM `employees`
    WHERE `salary` < 5000 OR `salary` > 12000;
    
    -- 4. 选择在 20 或 50 号部门工作的员工姓名和部门号
    SELECT `first_name`,`last_name`,`department_id`
    FROM `employees`
    WHERE `department_id` IN (20,50);
    
    -- 5. 选择公司中没有管理者的员工姓名及 job_id
    SELECT    `first_name`,`last_name`,`job_id`
    FROM `employees`
    WHERE `manager_id` IS NULL;
    
    -- 6. 选择公司中有奖金的员工姓名,工资和奖金级别
    SELECT `first_name`,`last_name`,`salary`,`commission_pct`
    FROM `employees`
    WHERE `commission_pct` IS NOT NULL;
    
    -- 7. 选择员工姓名的第三个字母是 a 的员工姓名
    SELECT `first_name`,`last_name`
    FROM `employees`
    WHERE `last_name` LIKE '__a%';
    
    -- 8. 选择姓名中有字母 a 和 e 的员工姓名
    SELECT `first_name`,`last_name`
    FROM `employees`
    WHERE `last_name` LIKE '%a%' OR `last_name` LIKE '%e%';
    
    -- 9. 显示出表 employees 表中 first_name 以 'e'结尾的员工信息
    SELECT *
    FROM `employees`
    WHERE `first_name` LIKE "%e";
    
    -- 10. 显示出表 employees 部门编号在 80-100 之间 的姓名、职位
    SELECT `last_name`,`job_id`
    FROM `employees`
    WHERE `department_id` BETWEEN 80 AND 100;
    
    -- 11. 显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、职位
    SELECT `last_name`,`job_id`
    FROM `employees`
    WHERE `manager_id` IN(100,101,110);

    排序查询

    -- 排序查询
    /*
    SELECT 查询列表
    FROM 表名
    [WHERE 筛选条件]
    ORDER BY 排序列表
    
    1、ORDER BY 子句 支持单个字段,多个字段,表达式,函数,别名
    2、ASC 默认升序排序,DESC 默认降序排序
    3、ORDER BY 子句总是放在SQL语句的最后面[LIMIT 是例外] 
    4、执行顺序就按照默认SQL填写的字段先后来执行
    */
    SELECT * FROM `employees` ORDER BY `first_name`;
    
    -- 案例:查询员工信息,要求工资从高到底排序[顺序是低到高,逆序高到低]
    SELECT * FROM `employees` ORDER BY `salary` DESC;
    SELECT * FROM `employees` ORDER BY `salary` aSC; -- [默认不写就是ASC]
    
    -- 案例:查询员工编号大于等于90的员工信息,按入职时间的先后顺序排序
    SELECT * 
    FROM `employees`
    where `employee_id` >= 90 ORDER BY `hiredate`;
    
    -- 案例:按年薪的高低显示员工信息和年薪【表达式排序】 [升序降序不限]
    SELECT *,`salary` * 12 *(1 + IFNULL(`commission_pct`,0)) AS YS
    from `employees`
    ORDER BY `salary` * 12 *(1 + IFNULL(`commission_pct`,0))  DESC; -- [asc or desc]
     
    -- 案例:按年薪的高低显示员工信息和年薪【别名排序】 [升序降序不限]
    SELECT *,`salary` * 12 *(1 + IFNULL(`commission_pct`,0)) AS YS
    from `employees`
    ORDER BY YS DESC;
    
    -- 案例:按姓名的长度[LENGTH()]显示员工姓名和工资 [升序降序不限]
    select LENGTH(`last_name`) AS `name_length`,`last_name`,`salary`
    from `employees`
    order by `name length`;
    
    -- 案例:查询员工信息,要求先按工资排序,再按员工编号排序[升序降序不限]
    SELECT *
    FROM `employees`
    ORDER BY `salary` desc,`employee_id` asc; -- 多个字段排序可以允许独立的升序降序
    
    
    -- 练习案例:
    -- 查询员工的姓名和部门号和年薪,按年薪降序、按姓名升序
    SELECT `last_name`,`department_id`,`salary` * 12 as ys
    from `employees`
    order by ys DESC,`last_name` asc;
    
    -- 选择工资不再8000到17000的员工的姓名和工资,按工资降序
    SELECT `last_name`,`salary`
    from `employees`
    where `salary` not between 8000 and 17000
    order by `salary` desc;
    
    -- 查询邮箱中包含e的员工信息,按邮箱的字节降序,再按部门号升序
    SELECT *,LENGTH(`email`) AS elength
    FROM `employees`
    WHERE `email` LIKE '%e%'
    order by length(`email`) desc,`department_id` asc;
  • 相关阅读:
    第一次工作 第一星期问题总结。
    IOS 中使用token机制来验证用户的安全性
    地址栏连接参数修改
    JavaScript反调试技巧
    简谈前端存储
    跨域的原因,场景,方法
    vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别
    vue入门 vue与react和Angular的关系和区别
    详细图解作用域链与闭包
    jQuery的ajax详解
  • 原文地址:https://www.cnblogs.com/mindzone/p/12783182.html
Copyright © 2020-2023  润新知