上一篇 数据库学习之MySQL (六)——条件查询 条件表达式 逻辑表达式 讲了条件查询,那是比较精确的而又死板的,这里这里讲一下模糊查询。
like
这个就是一个执行通配符(wildcard character) 筛选的函数罢了
我们先来试一试下面的代码:
USE data1;
SELECT
`last_name`,
CONCAT_WS(',',
`first_name`,
IFNULL(`manager_id`, 0),
IFNULL(`job_id`, 0),
IFNULL(`email`, 0),
IFNULL(`commission_pct`, 0)
) 职工基本情况,
`salary`
FROM
employees
WHERE
`last_name` LIKE '%b%';
%就是通配符,注意通配符和正则表达式(regular expression) 是两码事,目的也不相同。
通配符是根据形势筛选个体(比如字符串 或者一个对象的某个属性),
正则表达式是在一个个体(一个字符串)中摘取自己想要的片段,摘取的过程就必须先匹配(match),锁定自己要的部分,再拿出来。
下面是运行结果:
另外 之前学的 逻辑表达式完全也可以应用上,毕竟无论是模糊查询还是条件查询,都是表达式:
where处改变了一下,代码如下:
WHERE
NOT(salary>=10000 AND salary<=20000)
AND `last_name` LIKE '%b%';
结果如下:
现在我们具体看看
LIKE 支持的通配符 % _ 介绍
其实就支持两种
百分号% 代表(通配)任意数量**(包括0个)的字符,意味着%可以代表所有**东西,除了NULL,类似于正则表达式中的*
,这个星号匹配我们在SELECT * FROM employees;
还用过。
下划线_ 代表(通配)1个的字符,类似于正则表达式中的 ?
.
下面举个栗子:要last_name的第二个字符是下划线 以及 first_name的第二个字母是b的所有人的资料
WHERE
`last_name` LIKE '_\_%'
AND `first_name` LIKE '_b%';
这里转义的方式与绝大多数语言相同:利用反斜杠\
当然MySQL也可以自定义转义符号:比如想改成$
WHERE
`last_name` LIKE '_$_%' ESCAPE '$'
AND `first_name` LIKE '_b%';
between and
上一节教程提到了这个,between and其实可以完全实现这个功能。
WHERE
salary between 10000 and 20000;
另外 换成
WHERE
salary between 20000 and 10000;
你可以试试行不行:)
in
这里,我们假设需要找到所有last_name为Peter, Christopher, David, Oliver, Patrick的人,你应该怎么做?
上一节的知识 我们会这样:
USE data1;
SELECT
`last_name`,
`first_name`,
`job_id`,
CONCAT(',',
`last_name`,
`first_name`,
IFNULL(`manager_id`, 0),
IFNULL(`job_id`, 0),
IFNULL(`email`, 0),
IFNULL(`commission_pct`, 0)
) 职工基本情况,
`salary`
FROM
employees
WHERE
first_name = 'Peter' OR
first_name = 'Christopher' OR
first_name = 'David' OR
first_name = 'Oliver' OR
first_name = 'Patrick';
但是很明显 where部分太冗余了 如果代码放在一行可能更加难受,
而in就是解决这个问题的,我们看看改进后的where:
WHERE
first_name IN('Peter','Christopher','David','Oliver','Patrick');
is null 和 is not null
当单元格为空,值就是NULL,我们想针对这类空值进行判断,该怎么办?
WHERE
`commission_pct` = NULL;
这样吗? 你可以试试行不行2333
WHERE
`commission_pct` IS NULL;
效果如下:
如果不为空 很简单
WHERE
`commission_pct` IS NOT NULL;
安全等于 <=>
上面 IS
关键字只能判断NULL
而 =
只能判断普通值(不是NULL的)
有一个全能型选手能够搞定所有可能的判断,这就是安全判断:
WHERE
`commission_pct` <=> NULL;
WHERE
`commission_pct` <=> 0.4;
但传统说法认为安全等于可读性不高 我觉得倒是挺靠谱的2333