MySQL必知必会_条件查询

进阶2:条件查询

  • 条件查询:根据条件过滤原始表的数据,查询到想要的数据
  • 语法:
  • select 
        要查询的字段|表达式|常量值|函数
    from 
        表
    where 
        条件 ;
    
  • 分类:

    • 条件表达式
      示例:salary>10000
      条件运算符:

      < >= <= = != <>

    • 逻辑表达式
      示例:salary>10000 && salary<20000

    • 逻辑运算符:

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

  • 模糊查询
    示例:last_name like ‘a%’

    一、语法
    select 查询列表
    from 表名
    where 筛选条件
    
    二、筛选条件的分类
    1、简单条件运算符
    > < = <> != >= <=  <=>安全等于
    2、逻辑运算符
    && and
    || or
    !  not
    3、模糊查询
    like:一般搭配通配符使用,可以判断字符型或数值型
    select *
    from employees
    where department_id like '1__';
    
    通配符:%任意多个字符,_任意单个字符
    
    between and
    in
    is null /is not null:用于判断null值
    
    is null PK <=>
                普通类型的数值 null值       可读性
    is null     ×           √       √
    <=>     √           √       ×
    
    
    
    #进阶2:条件查询
    /*
    
    语法:
        select 
            查询列表
        from
            表名
        where
            筛选条件;
    执行顺序:先看表名,是否存在该表;然后看筛选条件,是否符合筛选条件(看是在哪一行);最后看查询列表,看是在哪一列。
    
    分类:
        一、按条件表达式筛选
    
        简单条件运算符:> < = != <> >= <=
    
        二、按逻辑表达式筛选
        逻辑运算符:
        作用:用于连接条件表达式
            && || !
            and or not
    
        &&和and:两个条件都为true,结果为true,反之为false
        ||或or: 只要有一个条件为true,结果为true,反之为false
        !或not: 如果连接的条件本身为false,结果为true,反之为false
    
        三、模糊查询
            like
            between and
            in
            is null
    
    */
    #一、按条件表达式筛选
    
    #案例1:查询工资>12000的员工信息
    
    SELECT 
        *
    FROM
        employees
    WHERE
        salary>12000;
    
    
    #案例2:查询部门编号不等于90号的员工名和部门编号
    SELECT 
        last_name,
        department_id
    FROM
        employees
    WHERE
        department_id<>90;
    
    
    #二、按逻辑表达式筛选
    
    #案例1:查询工资z在10000到20000之间的员工名、工资以及奖金
    SELECT
        last_name,
        salary,
        commission_pct
    FROM
        employees
    WHERE
        salary>=10000 AND salary<=20000;
    #案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
    SELECT
        *
    FROM
        employees
    WHERE
        NOT(department_id>=90 AND  department_id<=110) OR salary>15000;
    #三、模糊查询
    /*
    like
    
    
    
    between and
    in
    is null|is not null
    
    */
    #1.like
    /*
    特点:
    ①一般和通配符搭配使用,既可以判断字符型,也可以判断数值型
        通配符:
        % 任意多个字符,包含0个字符
        _ 任意单个字符
    *、
    
    #案例1:查询员工名中包含字符a的员工信息
    
    select 
        *
    from
        employees
    where
        last_name like '%a%';#abc
    #案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
    select
        last_name,
        salary
    FROM
        employees
    WHERE
        last_name LIKE '__n_l%';
    
    #案例: 查找部门编号为1开头的三位数。    
    select 
        department_id
    from 
        employees
    where 
        department_id like '1__'
    
    
    #案例3:查询员工名中第二个字符为_的员工名,转义,要么 \_,要么 随意指定转义符号,例如 $,用 $_ 来转义 _ ,然后 ESCAPE '$',表示这是个转义字符
    
    SELECT
        last_name
    FROM
        employees
    WHERE
        last_name like '_\_%';
        last_name LIKE '_$_%' ESCAPE '$';
    #2.between and
    /*
    ①使用between and 可以提高语句的简洁度
    ②包含临界值
    ③两个临界值不要调换顺序
    ③定义范围,定义的是连续的范围
    
    */
    
    
    #案例1:查询员工编号在100到120之间的员工信息
    
    SELECT
        *
    FROM
        employees
    WHERE
        employee_id >= 100 AND employee_id<=120;
    #----------------------
    SELECT
        *
    FROM
        employees
    WHERE
        employee_id BETWEEN 100 AND 120;
    
    #3.in
    /*
    含义:判断某字段的值是否属于in列表中的某一项
    特点:
        ①使用in提高语句简洁度
        ②in列表的值类型必须一致或兼容('123'可以转换为123)
        ③in列表中不支持通配符(因为IN等价于 = ,而通配符一般与LIKE 搭配使用)
        ③定义范围,定义的是离散的范围
    
    
    */
    #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    
    SELECT
        last_name,
        job_id
    FROM
        employees
    WHERE
        job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES';
    
    
    #------------------
    
    SELECT
        last_name,
        job_id
    FROM
        employees
    WHERE
        job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
    
    #4、is null
    /*
    =或<>不能用于判断null值
    is null或is not null 可以判断null值
    
    
    
    
    */
    
    #案例1:查询没有奖金的员工名和奖金率
    SELECT
        last_name,
        commission_pct
    FROM
        employees
    WHERE
        commission_pct IS NULL;
    
    
    #案例1:查询有奖金的员工名和奖金率
    SELECT
        last_name,
        commission_pct
    FROM
        employees
    WHERE
        commission_pct IS NOT NULL;
    
    #----------以下为错误的
    SELECT
        last_name,
        commission_pct
    FROM
        employees
    
    WHERE 
        salary IS 12000;
    
    
    #安全等于  <=>
    
    
    #案例1:查询没有奖金的员工名和奖金率
    SELECT
        last_name,
        commission_pct
    FROM
        employees
    WHERE
        commission_pct <=>NULL;
    
    
    #案例2:查询工资为12000的员工信息
    SELECT
        last_name,
        salary
    FROM
        employees
    
    WHERE 
        salary <=> 12000;
    
    
    #is null pk <=>
    /*
    IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
    <=>    :既可以判断NULL值,又可以判断普通的数值,可读性较低
    */
    
    #测试
    
    
    #查询员工号为176的员工的姓名和部门号和年薪
    
    SELECT 
        CONCAT(last_name,first_name) AS 姓名,
        department_id AS 部门编号,
        salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
    FROM 
        employees
    WHERE
        employee_id = 176;
    
    #查询没有奖金,并且工资小于18000的 salary,last_name
    SELECT
        last_name,
        salary
    FROM 
        employees
    WHERE
        commission_pct IS NULL AND salary < 18000;
    #job_id不为‘IT’或者工资为12000的员工信息
    SELECT 
        *
    FROM
        employees
    WHERE
        job_id <> 'IT' OR salary = 12000;
    #查看departments表的结构  
    DESC departments;
    
    #查询departments表中涉及到了哪些位置编号(去重)
    SELECT DISTINCT 
        location_id
    FROM 
        departments;
    
    #经典面试题
    /*
     试问 select * from employees  和select * from employees where commision_pct like '%%' and 
     last_name like '%%';
     结果是否一样?并说明原因
    
     答:不一样,因为如果判断的字段有null值,则不符合第二种的筛选条件。
    */  
    
    #查找工资不在5000-20000范围(说明多个表达式可以搭配使用)
    SELECT 
        salary
    FROM 
        employees
    WHERE
        NOT (salary BETWEEN 5000 AND 20000);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值