mysql知识积累- -必知必会

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';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值