哈罗,各位小伙伴大家好,又见面了,我还是那个不吃饱不干活的小尘,欢迎来到本期的SQL语言之条件查询部分,让我们一起进入知识的海洋吧~
之前我们知道了简单查询,这次的条件查询又是什么样的呢?
让我们一起来探索吧~
一、语法
先回顾一下基础查询:
select 查询列表 from 表名
查询列表:字段、表达式、函数、常量值……
这是查询表中所有行的数据。
若我只想查询部分行呢?
这时候就要追加 where 子句了。
在where 后面加上筛选条件即可。当where后面的条件成立的话,就可以显示出来。
即:
select
查询列表;
from
表名;
where
筛选条件;
二、分类注:
执行顺序:表名--->筛选条件--->查询列表
根据筛选条件的不同,大致可以分为一下几类:
1、按照条件表达式筛选
条件运算符: > < = != 或 <> >= <=
注:MySQL里面的条件运算符,等于是只有一个等于号,不像java里面的两个。
不等于号可以用“ != ” ,但它也有自己的符号“ <> ”
案例一、
查询工资>12000的员工信息
代码:
SELECt * FROM employees WHERe salary>12000;
执行结果:
案例二、
查询部门编号不等于90号的员工名和部门编号
我们要查什么,select后面就写什么
代码:
SELECT last_name, department_id FROM employees WHERe department_id<>90;
执行结果:
2、按照逻辑表达式筛选逻辑运算符:&& || !
在MySQL里面,推荐使用它自己的运算符:
and (&&)、or(||)、not(!)
作用:用于连接条件表达式。当条件比较多的时候,得连在一起啊,又不能用逗号。
意思:and 和 && :如果两个条件都为true,那么最终结果为true,反之为false。
or 和 || :只要有一个条件为true,那整体就为true,反之就为false。
not 和 !:如果连接的条件本身为false,那么结果为true,反之为false。
案例一、
查询工资在10000到20000之间的员工名、工资以及奖金
代码:
select last_name, salary, commission_pct from employees where salary >= 10000 and salary <= 20000 ;
执行结果:
案例二、
查询部门编号不在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;
执行结果:
和
3、模糊查询<1> likelike
between and
in
is null
案例一、
查询员工名中包含字符a的员工信息
代码:
SELECt * FROM employees WHERe last_name LIKE '%a%';
注:这个筛选条件不是具体的条件了,不是具体的条件或是大于某个具体的值。是一个很模糊的条件,不是一个精确的值。所以叫“模糊查询”。
last_name like '%a%';
解读:字符型的值必须用单引号引用!!!
根据题目必须包含字符a,那还有其他字符啊,前面可能有,后面也有可能有。
在a前后加上百分号%,这里的百分号代表一种通配符,代表任意一个字符。
执行结果:
案例二、
查询员工名中第三个字符为n,第五个自字符为l的员工名和工资
代码:
select last_name, salary from employees where last_name like '__n_l%';
执行结果:
案例三、
查询员工名中第二个字符为下划线_的员工名
下划线本身是通配符,但我们现在要让它当成普通字符来使。
SELECt
last_name
FROM
employees
WHERe
last_name LIKE '__%';
这样写吗?
明显是不对的!上面打的那个下划线是一个通配符,而不是普通的字符下划线!
所以我们需要转义一下。
last_name LIKE '__%';
代码:
select last_name from employees where last_name like '__%';
执行结果:
其实在MySQL中也推荐大家这样去用:
下划线需要转义,我们可以随意在前面写一个转义字符(即可以不用“ ”)。
比如我们写一个$ , 即: last_name LIKE '_$_%';
那么我们此时需要标明一下这个$符号实际上是一个转义。那我们可以加上ESCAPE关键字,给$指定一下,说明一下$是一个转义。
即:last_name LIKE '_$_%' ESCAPE '$';
执行一下也是好使的:
<2> between and总结:
like
一般和通配符搭配使用。
通配符: %(任意多个字符,包含0字符)、_ (任意单个字符)
在英文中,between and表示在……之间
案例一、
查询员工编号在100~120之间的员工信息
按照之前的写法,肯定是这样:
SELECt * FROM employees WHERe employee_id>=100 AND employee_id<=120;
执行结果:
那有的小伙伴就要问了,employee_id 这个写了两遍,可以省略吗?
想啥呢?肯定不能啊。
除非……要请出咱们的 between and 出山了!
代码:
SELECt * FROM employees WHERe employee_id BETWEEN 100 AND 120;
执行结果:
<3> in总结:
between and
1)使用between and 可以提高语句的简洁度
2)between and 包含临界值
3)两个临界值不能调换顺序
4)临界值类型必须一致
案例一、
查询员工的工种编号是 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';
执行结果:
我们可以看到,非常繁琐麻烦。
我们可以使用in来实现简洁。
因为我们判断的都是job_id,所以我们可以用in来将可能出现的值都放进小括号里面。
即:
SELECt
last_name,
job_id
FROM
employees
WHERe
# job_id ='IT_PROG' or job_id='AD_VP' or job_id='AD_PRES';
job_id IN('IT_PROG','AD_VP','AD_PRES');
执行结果:
问:
in里面支持写百分号之类的通配符吗?
如:
查询员工的工种编号是 IT_PROG , AD_开头 的员工名和工种编号
代码:
#查询员工的工种编号是 IT_PROG , AD_开头 的员工名和工种编号
SELECt
last_name,
job_id
FROM
employees
WHERe
job_id IN('IT_PROG','AD_%');
执行结果:
我们可以看到,明显是不可以的!
因为in是判断与括号里面的数值是否相等的,而不是和like一样。
当然,这里用like也是不行的,like没有这个用法。
总结:
in
含义:判断某字段的值是否属于in列表中的某一项
特点:1)使用in做筛选的话,比使用or做筛选更简洁,即提高了语言简洁度
2)in列表中的值类型必须统一(兼容)
3)不支持通配符
<4> is null
案例一、
查询没有奖金的员工名和奖金率
按道理咱们应该这样写:
SELECt last_name, commission_pct FROM employees WHERe commission_pct =NULL;
执行结果:
让我们失望的是,并没有结果出现!
原因就在于,=运算符不能判断NULL值!
这个时候我们可以用is null
代码:
#查询没有奖金的员工名和奖金率 SELECt last_name, commission_pct FROM employees WHERe commission_pct IS NULL;
执行结果:
那我们想查询有奖金的,就很简单啦:
把“is null”改成“is not null”就可以啦!
代码:
SELECt last_name, commission_pct FROM employees WHERe commission_pct IS NOT NULL;
执行结果:
补充:
有的小伙伴感觉is可以这样用:
用来判断薪资是否是20000。
代码:
SELECt last_name FROM employees WHERe salary IS 20000;
执行结果:
哎呀,报错了!
注意了,is适合null搭配的,不能随意更改!
<5>安全等于总结:
is null
1)=或者<>不能用于判断null值
2)is null 或 is not null可以判断null值
3)is不能随意搭配
不等于我们是这样写的: <>
那我们在里面加一个等于号,就是安全等于: <=>
案例一、
查询没有奖金的员工名和奖金率
刚才我们用is null来做的,现在我们用安全等于来试试。
代码:
SELECt last_name, commission_pct FROM employees WHERe commission_pct <=> NULL;
执行结果:
案例二、
查询工资为12000的员工信息
当然,安全等于不仅可以判断NULL值,还可以判断普通类型的值。
代码:
SELECt last_name, salary FROM employees WHERe salary <=> 12000;
执行结果:
三、条件查询案例总结:
1)安全等于是判断是否等于,如果等于,返回true
2)is null只可以判断null值,但可读性较高。
3)安全等于既可以判断null值,又可以判断普通数值。但可读性较低。
4)建议大家用is null
案例一、
查询员工号为176的员工的姓名和部门号和年薪
正常来说,我们应该这样写:
select last_name, department_id, salary*12*(1+commission_pct) AS 年薪 from employees;
执行结果:
但是,
commission_pct有为null的情况。
所以,要把要用IFNULL函数,若奖金为空的话,就给它赋值0。(上面刚讲过)
所以应该这样写:
SELECt last_name, department_id, salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees;
执行结果:
好啦~今天的知识点有点多,要好好消化哦
下次咱们来做些练习题巩固一下
MySQL数据库专栏持续更新中,欢迎前来学习
原创不易,请多多支持
咱们下次再见喽~



