1,关于distinct
distinct能进行去重,但是这是一个关键字,放在select后面,当多个字段的时候,意义就变了。
比如
select distinct name,sex from user;
这个句子的意思是对name字段和sex字段都相同的行进行去重,而并不是对name进行去重,如果将distinct进行调整,select sex,distinct name from user;会发现报错了,distinct是一个关键字,但是并非修饰单个字段的。所以这个时候应该是用group by
select name ,sex from user group by name;
2,关于limit
单独一个数字,表示的是限制多少行,两个数字的表示从行几开始计算的多少行
以下两个句子的意义是相同的
select * from user limit 5;
select * from user limit 0,5;
3,使用完全限制的表名,能实现跨库操作
select user.name from today.user
4,where的操作符,不等于
操作符 | 说明 |
---|---|
<> | 不等于 |
!= | 不等于 |
5,varChar的不区分大小
mysql的sql关键字不区分大小写,但是字段的varChar也是不区分大小写的,这就是一个大问题了。
比如
select * from user where name = 'zhangSan';
这里是要查找名字是zhangSan的人员信息,但是mysql数据库却查出了zhangsan,如果是查找后没有进行应用过滤,就可能拿zhangsan的信息来使用了,这也是证明了为什么有时候用数字来进行做type的区分,当然啦,一般的type即使是不区分大小写也不会有问题,安全起见还是要避免而已。
同时,这种判断有另一个更加大的风险,如果是sql是!=判断逻辑,就会出现判断失误了。这个时候,获取的数据就是错误的,无法在应用层进行处理了,不过如果是汉子,就不存在大小写的问题了。
针对这个问题,在创建表的时候,应该选择区分大小写,utf8应该选择utf8_bin规则,进行区分大小写,这个时候执行的sql就不会查找到错误的数据。
6,关于null
判断是否为null,用is null
在mysql中null是具有特殊意义的,所以在条件筛选的时候,null是当做一个特殊值看待的,所以在进行条件筛选的时候,一定要考虑是否为null
以下两个句子,执行后的结果是完全不同的,第一个sql的结果不会包换为null的行
SELECT * FROM `tt_today` WHERE t_title != 'title';
SELECT * FROM `tt_today` WHERE t_title != 'title' OR t_title IS NULL;
7,关于in
in操作用于指定操作的范围
SELECT * FROM `tt_today` WHERE `create_time` IN (123456);
8,关于not
MySQL中的 NOT MySQL 支 持 使 用 NOT 对 IN 、 BETWEEN 和EXISTS子句取反
NOT IN,NOT BETWEEN,NOT EXISTS
SELECT * FROM `tt_today` WHERE `create_time` NOT IN (123456);
SELECT * FROM `tt_today` WHERE `create_time` NOT BETWEEN 12345 AND 123456;
SELECT t.`id`,t.`t_title`,t.`t_content` FROM `tt_today` t WHERE
NOT EXISTS
(SELECT * FROM `user` u WHERE u.`name` = t.`name`) ;
9,关于EXISTS
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
下面的sql,前半部分是查询语句,后面的EXISTS就是用来检测前面查找的数据是否为true。
SELECT
t.`id`,
t.`t_title`,
t.`t_content`
FROM
`tt_today` t
WHERE EXISTS
(SELECT
*
FROM
`user` u
WHERE u.`name` = t.`name`) ;
10,关于通配符LIKE
LIKE是谓语,不是操作符,LIKE配合%实现模糊查询,但是注意查询的结果与是否区分大小写有关。
"%"通配符可以放在头部,尾部和中间,需要注意的是尾部空格也是字符,所以应使用函数去掉空格。
"%“通配符能匹配0个到多个字符,但是”_"通配符只能匹配一个字符
注意null不在通配符的检索范围内。
另外注意,通配符搜索性能差,头部尽量不使用通配符
'_ lisi’限制了前面一定有一个字符,查询结果: 1 lisi
SELECT `name` FROM `tt_today` WHERE `name` LIKE '_ lisi';
SELECT `name` FROM `tt_today` WHERE `name` LIKE '% lisi';
正则表达式
正则表达式-"REGEXP "
以下两种写法的执行结果相同
SELECT * FROM `tt_today` WHERE `name` REGEXP 'lisi';
SELECT * FROM `tt_today` WHERE `name` LIKE '%lisi%';
如果数据表的设置支持区分大小写的,查询的结果是支持大小写的,但是如果是默认状态下,是不区分大小写的,这个时候可以使用BINARY 关键字
SELECT * FROM `tt_today` WHERE `name` REGEXP BINARY 'lisi';
正则表达式-"|"OR匹配
在正则表达式中可以插入多个|,"|"表示or。
查找包含lisi或者包含张三的记录
SELECT * FROM `tt_today` WHERE `name` REGEXP 'lisi|zhangsan';
正则表达式-"[]"匹配特定字符
下面两个sql的查找结果是相同的,这里的[12] 是[1|2]的简写,表示1或者2,但是注意的一个问题,正则表达式本身就具有LIKE的特性,所以需要考虑到组合后的正则表达式能查更多的内容。
SELECT * FROM `tt_today` WHERE `name` REGEXP '[12] lisi';
SELECT * FROM `tt_today` WHERE `name` REGEXP '1 lisi|2 lisi';
正则表达式-"^"否定
下面三个sql,第一sql表示的是包含^2 lisi
第二个表示不包含2 lisi
第三个表示不包含1 lisi也不包含2 lisi
SELECT * FROM `tt_today` WHERE `name` REGEXP '^2 lisi';
SELECT * FROM `tt_today` WHERE `name` REGEXP '[^2] lisi';
SELECT * FROM `tt_today` WHERE `name` REGEXP '[^12] lisi';