初识Mysql(part5)--我需要知道的11条Mysql语句之过滤

学习笔记,以代码和例子堆砌而成,方便查阅。
参考书籍:《Mysql必知必会》等
要点:WHERE关键字、AND关键字、OR关键字、IS关键字、IN关键字


此Blog里的例子都会用下面interest数据表:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'3', 'Bai', 'dance', 'A', '8769.43', 'jijijiji'
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'
'6', 'Kit', 'sing', 'B', '2345.00', '好吧'
'7', 'Mark', 'draw', 'A', NULL, ''
'8', 'Fairy', 'dance', 'B', '1356.68', '概率论与数理统计'

检索出price=2345.00的行.

SELECT name,price FROM interest WHERE price=2345;

输出:

# name, price
'Kit', '2345.00'

检索grade='A’的行,并对检索出来的行按照price降序排列.

SELECT * FROM interest WHERE grade='A' ORDER BY price DESC;

输出:

# id, name, hobby, grade, price, comment
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'
'3', 'Bai', 'dance', 'A', '8769.43', 'jijijiji'
'7', 'Mark', 'draw', 'A', NULL, ''

在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则会报错。且’A’用小写形式’a’也可以,因为Mysql在执行匹配时,默认不区分大小写。


检索price小于5000的行

SELECT * FROM interest WHERE price<5000;

输出:

# id, name, hobby, grade, price, comment
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'
'6', 'Kit', 'sing', 'B', '2345.00', '好吧'
'8', 'Fairy', 'dance', 'B', '1356.68', '概率论与数理统计'

检索grade不等于’A’的行

SELECT * FROM interest WHERE grade<>'A';

输出:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'
'6', 'Kit', 'sing', 'B', '2345.00', '好吧'
'8', 'Fairy', 'dance', 'B', '1356.68', '概率论与数理统计'

上述结果用!=也可以实现。


检索price在3000到8000之间的行

SELECT * FROM interest WHERE price BETWEEN 3000 AND 8000;

输出:

# id, name, hobby, grade, price, comment
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'

在使用BETWEEN时,必须指定两个值所需范围的下限和上限,且这俩值必须用AND 关键字分隔。


检索price列包含空值的行

SELECT name,grade,price FROM interest WHERE price IS NULL;

输出:

# name, grade, price
'Mark', 'A', NULL

WHERE子句操作符

操作符说明
=等于
<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于
BETWEEN在指定的两个值之间

检索price大于3000且小于8000的行.

SELECT * FROM interest WHERE price>3000 AND price<8000;

输出:

# id, name, hobby, grade, price, comment
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'

我们还可以添加多个条件,每添加一个条件,就使用一个AND.


检索price大于7000,或者grade='B’的行.

SELECT * FROM interest WHERE price>7000 OR grade='B';

输出:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'3', 'Bai', 'dance', 'A', '8769.43', 'jijijiji'
'4', 'Add', 'sing', 'B', '3456.32', '不想说话'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'
'6', 'Kit', 'sing', 'B', '2345.00', '好吧'
'8', 'Fairy', 'dance', 'B', '1356.68', '概率论与数理统计'

先检索出hobby='draw’或hobby='sing’的行,在这些行中再检索出price大于5000的行

SELECT * FROM interest WHERE (hobby='draw' OR hobby='sing') AND price>5000;

输出:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'

需要注意的是,如果我们不加园括号,提升hobby='draw' OR hobby='sing'的计算顺序,mysql就会先帮我们计算hobby='sing' AND price>5000,这样就不符合我们的需求了。我们试试不加圆括号会得到什么结果:

SELECT * FROM interest WHERE hobby='draw' OR hobby='sing' AND price>5000;

输出:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'
'7', 'Mark', 'draw', 'A', NULL, ''

mysql帮我们多检索出来一行,这个行只满足hobby='draw,但price值为空。


检索price等于9999.99和8888.88的行。

SELECT * FROM interest WHERE price IN (8888.88, 9999.99);

输出:

# id, name, hobby, grade, price, comment
'1', 'Bunny', 'sing', 'B', '8888.88', '小黄唧唧'
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'5', 'Tim', 'sing', 'A', '8888.88', '还是不想说话'

IN操作符和OR操作符虽然有时,能完成相同的任务,但是IN操作符比OR操作符执行更快,且IN可以包含其他的SELECT语句,使得能动态建立WHERE子句。


检索hobby等于’dance’和’sing’以外的行

SELECT * FROM interest WHERE hobby NOT IN ('dance','sing');

输出:

# id, name, hobby, grade, price, comment
'2', 'Ada', 'draw', 'A', '9999.99', '小黄的铲屎官'
'7', 'Mark', 'draw', 'A', NULL, ''

Mysql支持NOT对IN、BETWEEN和EXISTS子句取反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GUI Research Group

谢谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值