• 第三节:条件查询


    一、条件查询

      1、语法

    select 查询列表|表达式|常量值|函数
    from 表名
    where 筛选条件;
    

        条件查询:根据条件过滤原始表的数据,查询到想要的数据

      2、分类

        (1)按条件表达式筛选

          条件运算符:> >= < <= != <>

          

        (2)按逻辑表达式筛选

          作用:用于连接条件表达式

          逻辑运算符: &&   ||   !

          更推荐使用: and  or  not

    and(&&):两个条件如果同时成立,结果为true,否则为false
    
    or(||):两个条件只要有一个成立,结果为true,否则为false
    
    not(!):如果条件成立,则not后为false,否则为true
    

           

        (3)模糊查询

    like
    between and
    in
    is null
    

          

      3、

    二、按条件表达式筛选

      1、查询工资大于 12000 的员工信息

    SELECT 
      * 
    FROM
      employees 
    WHERE salary > 12000 ;
    

      2、查询部门编号不等于 90 号的员工名和部门编号

        方式一:

    SELECT 
      last_name,
      department_id 
    FROM
      employees 
    WHERE department_id != 90 ;
    

        方式二:

    SELECT 
      last_name,
      department_id 
    FROM
      employees 
    WHERE department_id <> 90 ;

      

      3、

    三、按逻辑表达式筛选

      1、查询工资在 1000 到 2000 之间的员工们,工资以及奖金

    SELECT 
      last_name,
      salary,
      commission_pct 
    FROM
      employees 
    WHERE salary >= 10000 
      AND salary <= 20000 ;
    

      2、查询部门编号不是在 90 到 110之间,或者工资高于 15000 的员工信息

        方式一:

    SELECT 
      * 
    FROM
      employees 
    WHERE department_id < 90 
      OR department_id > 110 
      OR salary > 15000 ;
    

        方式二:

    SELECT 
      * 
    FROM
      employees 
    WHERE NOT (
        department_id >= 90 
        AND department_id <= 110
      ) 
      OR salary > 15000 ;
    

    四、模糊查询

      1、like

           含义:使用 like 运算选择类似的值,选择条件可以包含字符或数字;

        特点:一般和通配符搭配使用;'%' 和 '_' 可以同时使用。

        通配符:

    % 代表任意多个字符(0个或者多个)
    _ 代表单个字符(就一个)
    

       

        (1)查询员工中包含字符 a 的员工信息

    SELECT 
      * 
    FROM
      employees 
    WHERE last_name LIKE '%a%' ;
    

          (2)查询员工名中第三个字符为 n,第五个字符为 l 的员工名和工资

    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE last_name LIKE '__n_l%' ;
    

        (3)查询员工名中第二个字符为 _ 的员工名

    SELECT 
      last_name 
    FROM
      employees 
    WHERE last_name LIKE '_\_%' ;
    

        (4)使用 escape 来指定转义字符,如把 $ 声明为转义符来使用

    SELECT 
      last_name 
    FROM
      employees 
    WHERE last_name LIKE '_$_%' ESCAPE '$' ;
    

      2、between...and 

         含义:使用 between 运算来显示在一个区间内的值;

        

        特点:

          ①使用 between and 能提高语句的简洁度;
          ②包含两侧临界值;
          ③两个临界值不能调换位置(大于等于左边的值,小于等于右边的值);

        (1)查询员工编号在 100 到 120 之间的员工信息

          方式一:

    SELECT 
      * 
    FROM
      employees 
    WHERE employee_id BETWEEN 100 
      AND 120 ;
    

          等价于:

    SELECT 
      * 
    FROM
      employees 
    WHERE employee_id >= 100 
      AND employee_id <= 120 ;
    

      

      3、in

        含义:in 用于去判断某字段的值是否属于 in 列表中的某一项;

        

        特点:

          ① 使用 in 可以提高语句简洁度;
          ② in 列表的值类型必须统一或兼容;

          ③ in 列表中不支持通配符;

        (1)查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES 中的一个的员工名和工种编号

          方式一:

    SELECT 
      last_name,
      job_id 
    FROM
      employees 
    WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES') ;

          方式二:

    SELECT 
      last_name,
      job_id 
    FROM
      employees 
    WHERE job_id = 'IT_PROG' 
      OR job_id = 'AD_VP' 
      OR job_id = 'AD_PRES' ;
    

      4、is null | is not null

        使用 is (not) null 判断空值;

        ① = 或者 <> 不能用于判断 null 值
        ② is null 或 is not null 可以判断 null 值;

        (1)查询没有奖金的员工名和奖金率

          正确写法:

    SELECT 
      last_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct IS NULL ;
    

          错误写法:

    #  这种 = 不能判断 null,错误写法
    SELECT 
      last_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct = NULL ;
    

        (2)查询有奖金的员工名和奖金率

          正确写法:

    SELECT 
      last_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct IS NOT NULL ;
    

          注意,is 关键字不能用于非 null 的判断,如下错误写法:

    SELECT 
      last_name,
      commission_pct 
    FROM
      employees 
    WHERE salary IS 12000 ;

      5、安全等于 <=>

        ① 判断 null 值
        ② 判断基本数据类型,用于 等值 判断

           is null VS   <=>
          is null 仅可以判断 null 值,可读性较高
          <=> 既可以判断 null 值,又可以判断普通的数值,可读性较低

        (1)查询没有奖金的员工名和奖金率

    SELECT 
      last_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct <=> NULL ;
    

        (2)查询工资为 12000 的员工信息

    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE salary <=> 12000 ;
    

    五、练习题

      1、查询工资大于 12000 的员工姓名和工资

    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE salary > 12000 ;
    

      

      2、查询员工号为 176 的员工的姓名和部门号和年薪

    SELECT 
      last_name,
      department_id,
      salary * (1 + IFNULL(commission_pct, 0)) 年薪 
    FROM
      employees 
    WHERE employee_id = '176' ;
    

      

      3、选择工资不在 5000 到 12000 的员工的姓名和工资

        方式一:

    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE salary NOT BETWEEN 5000 
      AND 12000 ;
    

        方式二:

    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE NOT (salary >= 5000 
        AND salary <= 12000) ;
    

      

      4、选择在 20 或 50 号部门工作的员工姓名和部门号

    SELECT 
      last_name,
      department_id 
    FROM
      employees 
    WHERE department_id IN (20, 50) ;
    

      

      5、选择公司中没有管理者的员工姓名及 job_id

        方式一:

    SELECT 
      last_name,
      job_id,
      manager_id 
    FROM
      employees 
    WHERE manager_id IS NULL;
    

      

        方式二:

    SELECT 
      last_name,
      job_id,
      manager_id 
    FROM
      employees 
    WHERE manager_id <=> NULL;
    

      

      6、选择公司中有奖金的员工姓名,工资和奖金级别(涉及连接查询)

    SELECT 
      last_name,
      salary,
      g.grade_level 
    FROM
      employees e,
      job_grades g 
    WHERE e.`salary` BETWEEN g.`lowest_sal` 
      AND g.`highest_sal` 
      AND commission_pct IS NOT NULL ;

      7、选择员工姓名的第三个字母是 a 的员工姓名

    SELECT 
      last_name 
    FROM
      employees 
    WHERE last_name LIKE '__a%' ;
    

      

      8、选择姓名中有字母 a 和 e 的员工姓名

    SELECT 
      last_name 
    FROM
      employees 
    WHERE last_name LIKE '%a%' 
      AND last_name LIKE '%e%' ;
    

      

      9、显示出表 employees 表中 first_name 以 'e'结尾的员工信息

    SELECT 
      first_name 
    FROM
      employees 
    WHERE first_name LIKE '%e' ;
    

      

      10、显示出表 employees 部门编号在 80-100 之间 的姓名、职位

    SELECT 
      * 
    FROM
      employees 
    WHERE department_id BETWEEN 80 
      AND 100 ;
    

      

      11、显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、职位

    SELECT 
      * 
    FROM
      employees 
    WHERE manager_id IN (100, 101, 110) ;
    

      

      12、查询员工号为176的员工的姓名和部门号和年薪

    SELECT 
      last_name,
      department_id,
      salary * 12 * (1 + IFNULL(commission_pct, 0)) 年薪 
    FROM
      employees 
    WHERE employee_id = '176' ;
    

      

      13、查询没有奖金,且工资小于 18000 的salary,last_name

    SELECT 
      salary,
      last_name 
    FROM
      employees 
    WHERE commission_pct IS NULL 
      AND salary < 18000 ;
    

      

      14、查询 employees表中,job_id 不为 'IT' 或者工资为 12000 的员工信息

    SELECT 
      * 
    FROM
      employees 
    WHERE job_id <> 'IT' 
      AND salary = 12000 ;
    

      

      15、查看部门 department 表的结构

    DESC departments;
    

      

      16、查询部门department表中涉及到了哪些位置编号

    SELECT DISTINCT location_id
    FROM departments;
    

      

      17、经典面试题

        试问下面两条 SQL 的执行效果是否一样?

        第一条:

    SELECT 
      * 
    FROM
      employees
    

      

        第二条:

    SELECT 
        * 
      FROM
        employees 
      WHERE commission_pct LIKE '%%' 
        AND last_name LIKE '%%' ;
    

      

        结果不一定一样!

         如果 commission_pct 列或者 last_name 列允许有 null 值,则结果不一样。

         因为 like 模糊查询并不会匹配 null 值。

  • 相关阅读:
    好玩/感人的小事
    本周最新文献速递20200207
    (史上最全)SNP位点与转录因子结合特异性数据库:GVATdb
    本周最新文献速递20210131
    【Python高级编程029 ● http协议 ● URL】
    【Python高级编程028 ● http协议 ● http协议介绍】
    【Python高级编程027 ● 网络编程 ● socket之send和recv原理剖析】
    【Python高级编程026 ● 网络编程 ● 多任务版TCP服务端程序开发】
    【Python高级编程025 ● 网络编程 ● 开发TCP网络程序注意点】
    【Python高级编程024 ● 网络编程 ● TCP服务端程序开发】
  • 原文地址:https://www.cnblogs.com/niujifei/p/14863143.html
Copyright © 2020-2023  润新知