学习笔记,以代码和例子堆砌而成,方便查阅。
参考书籍:《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子句取反。