第九章:第16节 MySQL基础篇——数据查询语言DQL(基本查询二)where子句

更新于:2017-10-10 19:25:58

where子句

一个概念:where子句,相当于php或js中的if条件语句:其最终结果就是布尔值(true/false)

php:if($n  % 4 == 0 && $n % 100 != 0  || $n % 400 == 0 ){}

则:

where  true,  where  1;    where 1=1;  都表示true

where  false,  where  0;    where 1<>1;  都表示false

1.png

可在实际应用中像上面的情况很少出现,where条件里通常有字段参与逻辑运算


1.png


条件跟字段挂钩:判断条件就是判断每行字段值是否满足条件。


where中可用的运算符:


算术运算符: +  -  *  /   %

比较运算符: >   >=   <    <=   =(等于)   <>(不等于)   

==(等于,mysql扩展),!=(不等于,mysql扩展)

逻辑运算符: and(与)  or(或)   not(非)


与PHP不同的是:

PHP中等于号是“==”,在MySQL里是“=”。

PHP的“&&”、“||”、“!”与或非在MySQL也可以用,但不推荐用。最好用MySQL自己的英文单词的与或非“and”、“or”、“not”。


1.png


对于这样不好理解的:

1.png


最好和PHP一样加上小括号:


1.png


提示:和PHP一样,数字不用加引号,字符串需要加引号。


布尔值的判断方式:


布尔值:本质上,布尔值只是一位整数的“别名”,0表示false,非0表示true。

判断为true:   XX  is  true

判断为fale:   XX  is  false

XX应该是一个字段名,且其类型应该是一个整数。

实际应用中,布尔值判断很少用,因为可以直接使用数学大小。

1.png


1.png


空值的判断方式:


判断为null:   XX  is  null

判断为非空:   XX  is  not  null

XX应该是一个字段名


看下“user_info”表定义结构:


1.png


可看到字段“register_time”是默认null的,刚才我们添加了一条记录,并没有往“register_time”插入数据,那最新的那条记录字段“register_time”的值就是null了。


1.png


1.png


虽然我们用select语句获取“register_time”的值是字符串“null”,可它在MySQL里可不是存储的字符串“null”。


1.png

在MySQL里用1个字节表示的null,而不是四个字节的英文字符。一行记录占65535个字节,可存65532个字节字符,有两个字节表示字符串的长度,还有1个字节是用来表示null的。


注意:

在设计表时尽量给字段加上“not null”属性,整数型默认0是空,字符串默认''是空。

我们也都看到了,数据表实际存的是null,获取到的可是字符串“null”,以后用PHP获取数据时,PHP会把null当成字符串“null”处理,字符串不为空即是TRUE,“null”转成布尔值是TRUE,这样容易对程序造成错误。


between语法:


XX  between  值1  and  值2;

含义:字段XX的值在值1和值2之间(含),相当于:XX >=值1 and XX<=值2;


1.png


in语法:


XX  in (值1,值2,.......);

含义:XX等于其中所列出的任何一个值都算成立,相当于:

XX = 值1  or XX = 值2  or  XX = 值2

1.png


也可以有not in语法,它和 in语法获取的结果完全相反:


1.png


like语法(模糊查找):


语法形式: XX like  ‘要查找字符’;

说明:

1,like语法(模糊查找)用于对字符类型的字段进行字符匹配查找

2,要查找的字符中,有2个特殊含义的字符:

2.1:  %   其含义是:代表任意个数的任意字符(可以为0个字符)

2.2:  _   其含义是:代表1个的任意字符

2.3:这里的字符,都是指现实中可见的一个“符号”,而不是字节。

3,实际应用中的模糊查找,通常都是这样:like ‘%关键字%’;


1.png


也不难,有两个地方需要注意的:


1、如果要查找的字符中包含“%”或“_”,“’”,则只要对他们进行转义就可以:

like  ‘%ab\%cd%’  //这里要找的是: 包含 ab%cd 字符的字符

like   ‘\_ab%’   //这里要找的是: _ab开头的字符

like   ‘%ab\’cd%’   //这里要找的是: 包含 ab’cd 字符的字符


2、

1.png

上面的where条件获取的结果虽然是一样的,但强烈反对用第一种方法,为什么呢?


我们用MySQL的explain命令查看这两条select语句(explain是专门用于优化查询的解释命令,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。下一章也会重点讲解,这里先目睹为快):

1.png


explain可用于任何select语句之前。


通过explain命令之后,我们可以看到这两个select语句出现了不一样的解释参数,“type”、“extra”两项的值不一样。


好多朋友会看不懂,告诉大家吧:用“=”的select语句通过参数比较完全优于用“like”的select语句,用“=”可以很好的用到索引(字段user_name在表user_info里使用唯一索引)。


额外说明:更新数据和删除数据的SQL语句where子句同样适用以上所有语法。


本节学习代码》》》