MySQL条件查询_006

五、DQL语言

5.6.条件查询

select 查询列表

from

表名

where

筛选条件;

注:类似java的if语句

执行顺序
from找表
筛选条件
查询列表

  • 分类

    • 按条件表达式

      • 条件运算符

      • java中的不等于 != 也支持

      • <    >  
        <>(又大又小就是不等于),在MySQL中推荐使用
        
        <=    >=
        
    • 按逻辑表达式

      • 逻辑运算符
      • && || !
      • and or not 推荐使用
    • 模糊查询

      • like 像
      • between and
      • in
      • is null

5.6.1.按条件表达式

  • 条件表达式

  • 找出employees中工资大于12000的员工信息

    SELECT 
    *
    FROM
    employees 
    WHERE salary >12000;
    
    image-20220301210929328
  • 部门编号不等于90的员工

  •   SELECT 
        last_name,
        department_id
      FROM
        employees 
      WHERE department_id <> 90 
    
  • image-20220301211714422

5.6.2.按逻辑表达式

常用于多个条件表达式的连接

  • 找出工资在10000-20000的员工信息

  • SELECT
    	*
    FROM
    	employees
    WHERE
    	salary >=10000 AND salary <=20000;
    
    
  • image-20220301212839033
  • 部门编号不在90—100之间,或者工资大于15000的员工信息

  • SELECT
    	*
    FROM 
    	employees
    WHERE
    	department_id<90 OR department_id>100 OR salary;
    
  • image-20220301213320131

5.6.3.按模糊查询

模糊查询经常与通配符联合使用

5.6.3.1.关键字like的使用
  • 查找出名中含有字母a的员工信息

    • 显然使用条件表达式或者逻辑表达式无法操作,二者是精确查询,精确到具体
    • 使用模糊查询
    • 通配符百分号
      • 代表多个任意字符
      • 包括0个字符
    • %a%
      • 字母a的前后还有任意字符
    • 通配符下滑线
      • 单个字符的通配符
  • select 
    	*
    from
    	employees
    where
    	last_name like '%a%';
    #在MySQL中,字符必须使用单引号括起来
    #MySQL不区分大小写,所以结果中,last_name
    #有大写字母A的也筛选出来了
    #注意`a`使用通配符,因为人名不可以就一个字母
    
  • image-20220301214758924


单个字符的通配符下划线

问题:找出名第三个字符是a员工和及工资

select last_name,salary
from employees
where last_name like '__a%';

image-20220301215911660

注意:

  • 找出第二个字符是下划线的名,怎么找?

    • 使用转义字符

      • 与java转义字符一致用反斜杠

      • ‘\_’
        
        
      • 自己定义转义字符(推荐使用)+关键字escape

      • where last_name like '_$_%' escape '$'
        #使用escape将美元符号定义为转义字符
        
      • image-20220301220904083

5.6.3.2.关键字 between and

问题:员工编号在50—100之间的员工信息?

between A and B

  • A、B的位置颠倒结果不同,意义不同

  • A、B数据类型要一致

  • A、B数据类型不一致,但是可以相互转换

例如: between 10 and 20 等价于>=10且<=20,若颠倒顺序between 20 and 10 等价于>=20 且<=10,有满足这样的吗?没有,显然违背逻辑,但是在MySQL中不会报错,只不过是结果空的

  • 思考: A=B 情况下,怎么样?
SELECT *
FROM employees
WHERE employee_id BETWEEN 50 AND 100;

image-20220301222839372

注意:

  • 员工ID可以=100,也就说between and是包含边界的
5.6.3.3.关键字 in
  • in (A,B,C) 满足ABC三个条件中的其中一个的,给我找出来

  • 判断某字段的值是否属于in()列表中的某一个

  • 常用于代替or解决的问题

  • in列表的类型要一致,不一致那就要相互兼容(可以相互转换)

in查找的是符合在列表的,符合在列表,怎么样?自然也有不在列表的,怎么写?-----嘛!

not in

select last_name,job_id
from employees
where job_id not in ('AD_VP','IT_VP')

image-20220302230424126

注意:在输入命令时,若报错,请仔细检查,肯定有那个字符细节上处理不到位

想输入着重号,很难输入,反正就是不顺利,很可能此时是把(单引号)当做着重号了

  • in不支持通配符,为什么?

    in最像什么?java中的switch case 语句是与in列表的东西进行匹配,类似与等于,就像switch case一样

    • 匹配上一个case,做出相应的操作,要求输入的类型和case的类型和大小一致
    • 类型不同,可以怎么样?可以是字符、字符串转换为int型后,匹配上某一个case,便执行操作
    • 不要忘记了,在一定范围内,遵循Unicode编码表,是可以将字符与int型进行等价的隐式转换(自动转换)

问题:找出工种编号是IT_PROT 、 AD_VP 、AD_PRES中的一个的,员工名及其工种编号

SELECT last_name,job_id
FROM employees
WHERE job_id IN ('AD_VD','PRES_VD','AD_VP');

image-20220302224000965

思考:为什么in里面的参数要用好、单引号?

并不是为了为了更好看,那些参数是什么?是字符串,在MySQL里,字符串就是用单引号或者双引号表示,

如果参数是整型,则不需要

5.6.3.4.关键字is null
  • 注意:
    • isnull是搭配使用的,is not null也是,不要拿去和别的对象使用
    • 不要出现is 12000来找出工资12000的员工,这是错误使用
    • 要找工资12000的员工,直接用等于号,条件表达式就可以了

问题:给我把公司里没有奖金的员工找出来

select last_name,commission_pct
from employees
where commission_pct is null

image-20220302230845924

思考:逆向思维,给我找出有奖金的员工,怎么做?

  • 逆向,在编程里,逆向,好办呀,
select last_name,commission_pct
from employees
where commission_pct is not null;

image-20220302231255603

5.6.3.4.1安全等于<=>

上面的问题, is null 还可以用<=>安全等于来代替

对比:

符号用法范围
is null判断有固定使用
is not null判断没有固定使用
<=>可以代替is null除了用于null,还可以用于普通的等于,机动灵活,比如工资12000
注意否定时,not的位置
SELECT last_name,commission_pct
FROM employees
WHERE  NOT commission_pct <=> NULL;

image-20220302234632901

练习:查出工号176的员工年薪和所属部门编号

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

image-20220302234317976

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@yanyu666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值