SQL必知必会学习02

过滤数据

使用where子句

查询website表中中国公司的数据。

SELECT name,url,alexa,country FROM websites where country='CN';
+--------+-------------------------+-------+---------+
| name   | url                     | alexa | country |
+--------+-------------------------+-------+---------+
| Taobao | https://www.taobao.com/ |    13 | CN      |
| Weibo  | http://weibo.com/       |    20 | CN      |
+--------+-------------------------+-------+---------+

同时使用order by和where子句时,应该让order by子句位于where子句之后。

where子句操作符

操作符说明
=等于
<>不等于
!=不等于
<小于
<=小于等于
!<不小于
>大于
>=大于等于
!>不大于
between在指定的两个值之间
is null为null值
注意:并非所有的DBMS都支持这些操作符,想确定你的DBMS支持哪些操作符,请参阅相关文档。

检查单个值

SELECT name,url,alexa,country FROM websites where alexa<20;
+----------+---------------------------+-------+---------+
| name     | url                       | alexa | country |
+----------+---------------------------+-------+---------+
| Google   | https://www.google.cm/    |     1 | USA     |
| Taobao   | https://www.taobao.com/   |    13 | CN      |
| Facebook | https://www.facebook.com/ |     1 | USA     |
+----------+---------------------------+-------+---------+

不匹配检查

SELECT name,url,alexa,country FROM websites where country <> 'USA';
+--------+-------------------------+-------+---------+
| name   | url                     | alexa | country |
+--------+-------------------------+-------+---------+
| Taobao | https://www.taobao.com/ |    13 | CN      |
| Xuexi  | http://www.xxx.cn       |   888 | xxx     |
| Weibo  | http://weibo.com/       |    20 | CN      |
+--------+-------------------------+-------+---------+

SQL语句不区分大小写,但是过滤数据时,数据区分大小写。

SELECT name,url,alexa,country FROM websites where country <> 'usa';
+----------+---------------------------+-------+---------+
| name     | url                       | alexa | country |
+----------+---------------------------+-------+---------+
| Google   | https://www.google.cm/    |     1 | USA     |
| Taobao   | https://www.taobao.com/   |    13 | CN      |
| Xuexi    | http://www.xxx.cn         |   888 | xxx     |
| Weibo    | http://weibo.com/         |    20 | CN      |
| Facebook | https://www.facebook.com/ |     1 | USA     |
+----------+---------------------------+-------+---------+

范围值检查

查询alexa列在10~20之间的数据。

SELECT name,url,alexa,country FROM websites where alexa between 10 and 20;
+--------+-------------------------+-------+---------+
| name   | url                     | alexa | country |
+--------+-------------------------+-------+---------+
| Taobao | https://www.taobao.com/ |    13 | CN      |
| Weibo  | http://weibo.com/       |    20 | CN      |
+--------+-------------------------+-------+---------+

空值检查

由于name列没有空值,所以未返回结果。

SELECT name,url,alexa,country FROM websites where name is null;
Empty set (0.00 sec)

随便添加一列有空值的数据再一次查询(空值时没有数值,而不是0)

SELECT name,url,alexa,country FROM websites where name is null;
+------+------+-------+---------+
| name | url  | alexa | country |
+------+------+-------+---------+
| NULL | NULL |    50 | NULL    |
+------+------+-------+---------+

组合where子句

and操作符

查询alexa<=50 并且 country='CN’的数据

select name,url,alexa,country from websites where alexa<=50 and country='CN';
+--------+-------------------------+-------+---------+
| name   | url                     | alexa | country |
+--------+-------------------------+-------+---------+
| Taobao | https://www.taobao.com/ |    13 | CN      |
| Weibo  | http://weibo.com/       |    20 | CN      |
+--------+-------------------------+-------+---------+

or操作符

查询alexa大于等于80或者alexa小于20的数据

select name,url,alexa,country from websites where alexa>=80 or alexa<20;
+----------+---------------------------+-------+---------+
| name     | url                       | alexa | country |
+----------+---------------------------+-------+---------+
| Google   | https://www.google.cm/    |     1 | USA     |
| Taobao   | https://www.taobao.com/   |    13 | CN      |
| Xuexi    | http://www.xxx.cn         |   888 | xxx     |
| Facebook | https://www.facebook.com/ |     1 | USA     |
+----------+---------------------------+-------+---------+

求值顺序

where子句可以包含任意数目的and和or操作符。
接下来的代码练习,我们用一个新的数据表操作

select * from products;
prod_id,  prod_name, 			prod_price
'BNBG01', 'Fish bean bag toy', '3.49'
'BNBG02', 'Bird bean bag toy', '3.49'
'BNBG03', 'Rabbit bean bag toy', '3.49'
'BR01', '8 inch teddy bear', '5.99'
'BR02', '12 inch teddy bear', '8.99'
'BR03', '18 inch teddy bear', '11.99'
'RGAN01', 'Raggedy Ann', '4.99'
'RYL01', 'King doll', '9.49'
'RYL02', 'Queen dool', '9.49'
select * from products where prod_id='BR01' or prod_id='BR03' and prod_price>=10;

在处理or操作符前,优先处理and操作符。

+---------+--------------------+------------+
| prod_id | prod_name          | prod_price |
+---------+--------------------+------------+
| BR01    | 8 inch teddy bear  |       5.99 |
| BR03    | 18 inch teddy bear |      11.99 |
+---------+--------------------+------------+

圆括号具有比and或or更高的求值顺序。DBMS首先过滤圆括号内的or条件。

mysql> select * from products where (prod_id='BR01' or prod_id='BR03') and prod_price>=10;
+---------+--------------------+------------+
| prod_id | prod_name          | prod_price |
+---------+--------------------+------------+
| BR03    | 18 inch teddy bear |      11.99 |
+---------+--------------------+------------+

in操作符

in操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

mysql> select * from products where prod_id in('BNBG01','BNBG03','RYL02') order by prod_name;
+---------+---------------------+------------+
| prod_id | prod_name           | prod_price |
+---------+---------------------+------------+
| BNBG01  | Fish bean bag toy   |       3.49 |
| RYL02   | Queen dool          |       9.49 |
| BNBG03  | Rabbit bean bag toy |       3.49 |
+---------+---------------------+------------+

in操作符完成了与or相同的工作

not操作符

where子句中的not操作符有且只有一个功能,那就是否定其后所跟的任何条件。

mysql> select * from products where prod_id not in('BNBG01','BNBG03','RYL02') order by prod_name;
+---------+--------------------+------------+
| prod_id | prod_name          | prod_price |
+---------+--------------------+------------+
| BR02    | 12 inch teddy bear |       8.99 |
| BR03    | 18 inch teddy bear |      11.99 |
| BR01    | 8 inch teddy bear  |       5.99 |
| BNBG02  | Bird bean bag toy  |       3.49 |
| RYL01   | King doll          |       9.49 |
| RGAN01  | Raggedy Ann        |       4.99 |
+---------+--------------------+------------+
mysql> select * from products where not prod_price>=8;
+---------+---------------------+------------+
| prod_id | prod_name           | prod_price |
+---------+---------------------+------------+
| BNBG01  | Fish bean bag toy   |       3.49 |
| BNBG02  | Bird bean bag toy   |       3.49 |
| BNBG03  | Rabbit bean bag toy |       3.49 |
| BR01    | 8 inch teddy bear   |       5.99 |
| RGAN01  | Raggedy Ann         |       4.99 |
+---------+---------------------+------------+

LIKE操作符

百分号(%)通配符

找出所有以词Fish起头的产品,区分大小写。
写成fish则不会返回Fish的结果

mysql> select * from products where prod_name like 'Fish%';
+---------+-------------------+------------+
| prod_id | prod_name         | prod_price |
+---------+-------------------+------------+
| BNBG01  | Fish bean bag toy |       3.49 |
+---------+-------------------+------------+

说明:
如果你使用的是Microsoft Access,需要使用*而不是%

通配符可以在搜索模式的任意位置使用

'%bean bag%'表示匹配任何位置上包含文本bean bag的值、

mysql> select * from products where prod_name like '%bean bag%';
+---------+---------------------+------------+
| prod_id | prod_name           | prod_price |
+---------+---------------------+------------+
| BNBG01  | Fish bean bag toy   |       3.49 |
| BNBG02  | Bird bean bag toy   |       3.49 |
| BNBG03  | Rabbit bean bag toy |       3.49 |
+---------+---------------------+------------+

找出以F开头以y结尾的所有产品
如果最后一个字符可能是空格则使用'F%y%'

mysql> select * from products where prod_name like 'F%y';
+---------+-------------------+------------+
| prod_id | prod_name         | prod_price |
+---------+-------------------+------------+
| BNBG01  | Fish bean bag toy |       3.49 |
+---------+-------------------+------------+

根据部分信息搜索电子邮件地址
例如

where email like 'b%@xxx.com'

where prod_name like '%'不会匹配产品名称为NULL的行。

下划线(_)通配符

下划线_的用途和%一样。但它只匹配单个字符,而不是多个字符。
说明:
DB2不支持通配符_
如果你使用的是Microsoft Access,需要使用而不是_

一个下划线
mysql> select * from products where prod_name like '_ inch teddy bear';
+---------+-------------------+------------+
| prod_id | prod_name         | prod_price |
+---------+-------------------+------------+
| BR01    | 8 inch teddy bear |       5.99 |
+---------+-------------------+------------+
两个下划线
mysql> select * from products where prod_name like '__ inch teddy bear';
+---------+--------------------+------------+
| prod_id | prod_name          | prod_price |
+---------+--------------------+------------+
| BR02    | 12 inch teddy bear |       8.99 |
| BR03    | 18 inch teddy bear |      11.99 |
+---------+--------------------+------------+
对比使用%
mysql> select * from products where prod_name like '% inch teddy bear';
+---------+--------------------+------------+
| prod_id | prod_name          | prod_price |
+---------+--------------------+------------+
| BR01    | 8 inch teddy bear  |       5.99 |
| BR02    | 12 inch teddy bear |       8.99 |
| BR03    | 18 inch teddy bear |      11.99 |
+---------+--------------------+------------+

方括号([])通配符

方括号[]通配符用来指定一个字符集,它必须匹配指定位置的一个字符。
并不是总支持集合
并不是所有的DBMS都支持用来创建集合的[],只有微软的Access和SQL Server支持集合。
由于我使用的是MySQL,所以这个用不了,就不再描述。

使用通配符的技巧

不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据攻城小狮子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值