按照惯例,先把这次讲解需要用到的表贴出来
product表
一.LIKE谓词
1. LIKE是用来进行字符串模糊查询的谓词,我们之前介绍字符串匹配查询的时候使用的都是等于号,这种情况只有当完全相等的情况下才会完成匹配,但是如果不完全一致时如何完成检索呢? 这就需要用到 LIKE 了
2. 如果我们想从product表中找出product_name叫做高压锅的商品信息,但是我们忘了具体的名字是什么了,只知道是叫什么什么锅,那么这时候应该怎么去写呢
select * from product where product_name LIKE '%锅';
在语句中 LIKE表示 进行的是模糊查询,然后%锅 表示的是你要找的数据是什么什么锅,%表示0字符以上的任意字符串,同样的%可以用到任何你需要进行模糊查询的位置,比如%压%也可以匹配到高压锅
3. 需要注意的是,%可以匹配到无穷多个字符,如果表中有一个数据叫做高高压锅,通过%锅也可以匹配到,那么如果我们只想看到高压锅这条数据,应该怎么做呢?通过下划线 “_” 下划线只匹配任意单个字符,不会像%一样匹配多个字符
二.BETWEEN--范围查询
1. 顾名思义,between表示一个范围,我们从product表中,找出售价在100--1000范围内的商品信息
select * from product where sale_price between 100 and 1000;
由此我们可以看出between是包括100和1000两个边界值的,如果不想包含这个边界值,还是需要用大于号和小于号去进行比较
三.IS NULL 和 IS NOT NULL
1. 还是顾名思义是用来判断是否为空值的语法,还是以product表为例
我们先找出注册日期regist_date为空的商品信息
select * from product where regist_date IS NULL;
再找出注册日期不为空的数据
select * from product where regist_date IS NOT NULL;
四.IN--or的简单用法
1. 如果我们需要查找出售价是1000,3000,6800的商品,如果使用的是or的语法,应该这样去写
select * from product where sale_price=1000 or sale_price=3000 or sale_price=6800;
但是这样的话,代码比较长 如果使用in关键字的话,应该这样写
select * from product where sale_price in (1000,3000,6800); 结果与上面的相同
而且,IN关键字还有一个更方便的用处,就是IN的参数可以是一个子查询的结果
比如,我们把上面说的两张表结合起来说 找出大阪店000C 的在售商品的售价
SELECT product_name,sale_price
from product
where product_id in (select product_id from shopproduct where shop_id='000C');
在子查询中,我们先找到所有的大阪店000C在售的所有商品编号,然后再找出他们的售价,这也就是IN关键字比OR更灵活的地方了
五.EXISTS谓词--理解起来有点难,但是有很大的便利性
1. 谓词的作用就是判断是否存在满足某种条件的记录,如果存在返回true,如果不存在就返回false
我们还是采用IN中提到的例子进行对比 找出大阪店000C 的在售商品的售价
SELECT product_name,sale_price
from product as p
where EXISTS (select *
from shopproduct as sp
where sp.shop_id='000C' AND sp.product_id=p.product_id);
在这段代码中 EXISTS 的参数是一个关联子查询,由于EXISTS的返回值是布尔类型的,所以 他并不关心你select * 还是别的乱七八糟的东西,这不影响程序的结果,不过 一般习惯上还是在内层中select *
这段代码具体的执行过程是: 先从外层查询中找到一条记录,然后拿到内层查询中去进行判断,如果满足内层循环所指定的条件,则内层循环返回一个true,则将这条记录的product_name和sale_price进行输出