SQL操作指南六(谓词)

2018-11-11  本文已影响0人  了不起的树懒

谓词,通常来说是函数的一种,是需要满足特定条件的函数。该条件就是“返回值是真值”,即返回的值必须为TRUE/FALSE/UNKNOWN。

+---------+
| str_exp |
+---------+
| abcddd  |
| dddabc  |
| abddc   |
| abcdd   |
| ddabc   |
| abddc   |
+---------+

前方一致查询

SELECT *
FROM SampleLike
WHERE str_exp LIKE 'ddd%';
+---------+
| str_exp |
+---------+
| dddabc  |
+---------+

其中"%"代表"0字符以上的任意字符串"的特殊符号。

中间一致查询

 SELECT *
 FROM SampleLike
 WHERE str_exp LIKE '%ddd%';
+---------+
| str_exp |
+---------+
| abcddd  |
| dddabc  |
+---------+

在字符串的起始和末尾都加上"%",就能取出包含"ddd"的字符串了。

后方一致查询

 SELECT *
 FROM SampleLike
 WHERE str_exp LIKE '%ddd';
+---------+
| str_exp |
+---------+
| abcddd  |
+---------+

使用"_"选取字符
此外,我们还可以用"_(下划线)"代替"%",与"%"不同的是其代表了"任意一个字符"。

--使用__(下划线)进行后方一致查询
SELECT *
FROM SampleLike
WHERE str_exp LIKE 'abc__';
+---------+
| str_exp |
+---------+
| abcdd   |
+---------+
--查询"abc+任意3个字符"的字符串
 SELECT *
 FROM SampleLike
 WHERE str_exp LIKE 'abc___';
+---------+
| str_exp |
+---------+
| abcddd  |
+---------+
SELECT shop_name,sell_price
FROM shop_list
WHERE sell_price BETWEEN 1000 AND 3000;

使用BETWEEN会包含两个临界值,如果不想让结果包含临界值,那么就必须用"<"和">"。

SELECT <列名>
FROM <表名>
WHERE <列名> IS NULL;
SELECT <列1>,<列2>····
FROM <表名>
WHERE <列名> = <数据1>
        OR <列名> = <数据2>
        OR <列名> = <数据3>;

如果使用IN 谓词,那么以上的写法可以更加简单:

SELECT <列1>,<列2>····
FROM <表名>
WHERE <列名> IN (数据1,数据2,数据3);

需要注意的是,使用IN和NOT IN 的时候是不能取出NULL的数据的。

+---------+-----------+---------+--------+
| area_id | area_name | shop_id | number |
+---------+-----------+---------+--------+
| 000A    | 北京      | 0001    |     30 |
| 000A    | 北京      | 0002    |     50 |
| 000A    | 北京      | 0003    |     15 |
| 000B    | 上海      | 0002    |     30 |
| 000B    | 上海      | 0003    |    120 |
| 000B    | 上海      | 0004    |     20 |
| 000B    | 上海      | 0006    |     10 |
| 000B    | 上海      | 0007    |     40 |
| 000C    | 重庆      | 0003    |     20 |
| 000C    | 重庆      | 0004    |     50 |
| 000C    | 重庆      | 0006    |     90 |
| 000C    | 重庆      | 0007    |     70 |
| 000D    | 杭州      | 0001    |    100 |
+---------+-----------+---------+--------+

如果我们想要选出000B地区商品的数据,那么需要两个步骤:
1.首先选出根据area_id选出所有000B地区的数据;

SELECT *
FROM shop_area
WHERE area_id='000B';
+---------+-----------+---------+--------+
| area_id | area_name | shop_id | number |
+---------+-----------+---------+--------+
| 000B    | 上海      | 0002    |     30 |
| 000B    | 上海      | 0003    |    120 |
| 000B    | 上海      | 0004    |     20 |
| 000B    | 上海      | 0006    |     10 |
| 000B    | 上海      | 0007    |     40 |
+---------+-----------+---------+--------+

2.使用子查询作为IN的参数读取000B的商品数据;

SELECT shop_id,shop_name,sell_price
FROM shop_list
WHERE shop_id IN (SELECT shop_id FROM shop_area WHERE area_id='000B');
+---------+-----------+------------+
| shop_id | shop_name | sell_price |
+---------+-----------+------------+
| 0002    | 打孔器    |        600 |
| 0003    | 运动T恤   |       3000 |
| 0004    | 菜刀      |       6000 |
| 0006    | 扳手      |       3000 |
+---------+-----------+------------+

使用IN的好处在于:数据不是一成不变的,当数据发生变化时,子查询语句查询的值也发生了变换,不像"="总是一个固定的值。

NOT IN也可以使用子查询作为参数,其语法和IN完全一样。

SELECT shop_name,sell_price
FROM shop_list as SL
WHERE EXISTS (SELECT * 
              FROM shop_area AS SA 
              WHERE SA.area_id='000b' 
              AND SA.shop_id=SL.shop_id);
+-----------+------------+
| shop_name | sell_price |
+-----------+------------+
| 打孔器    |        600 |
| 运动T恤   |       3000 |
| 菜刀      |       6000 |
| 扳手      |       3000 |
+-----------+------------+

EXIST的参数
EXIST的左侧没有参数,因为EXIST是只有一个参数的谓词,所以只需要在右侧写一个参数,该参数通常都是一个子查询(通常指定关联子查询作为EXIST的参数)。

使用 NOT EXITS 代替NOT IN
以下示例(读取上海地区000B在售以外商品的单价):

SELECT shop_name,sell_price
FROM shop_list AS SL
WHERE NOT EXISTS(SELECT*
                 FROM shop_area AS SA 
                 WHERE SA.area_id='000B' 
                 AND SA.shop_id=SL.shop_id);
+-----------+------------+
| shop_name | sell_price |
+-----------+------------+
| T恤衫     |       2000 |
| 砧板      |       2000 |
+-----------+------------+
上一篇 下一篇

猜你喜欢

热点阅读