如何排序检索数据

使用 ORDER BY 子句有以下几个点需要掌握:

  1. 排序的列名:ORDER BY 后面可以有一个或多个列名,如果是多个列名进行排序,会按照后面第一个列先进行排序,当第一列的值相同的时候,再按照第二列进行排序,以此类推。
  2. 排序的顺序:ORDER BY 后面可以注明排序规则,ASC 代表递增排序,DESC 代表递减排序。如果没有注明排序规则,默认情况下是按照 ASC 递增排序。如果排序字段类型为文本数据,就需要参考数据库的设置方式了,这样才能判断 A 是在 B 之前,还是在 B 之后。比如使用 MySQL 在创建字段的时候设置为 BINARY 属性,就代表区分大小写。
  3. 非选择列排序:ORDER BY 可以使用非选择列进行排序,所以即使在 SELECT 后面没有这个列名,你同样可以放到 ORDER BY 后面进行排序。ORDER BY 的位置:ORDER BY 通常位于 SELECT 语句的最后一条子句,否则会报错。
    1. ORDER BY (hp_max+mp_max) DESC

    null/not null和空值’’区别

    1、我字段类型是not null,为什么我可以插入空值 2、为毛not null的效率比null高 3、判断字段不为空的时候,到底要 select * from table where column <> '' 还是要用 select * from table wherecolumn is not null 呢。

首先,我们要搞清楚“空值” 和 “NULL” 的概念:

  1. 1、空值是不占用空间的
  2. 2mysql中的NULL其实是占用空间的

打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。
搞清楚“空值”和“NULL”的概念之后,问题基本就明了了,我们搞个例子测试一下:

  1. CREATE TABLE `test` (
  2. `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  3. `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
  4. ) ENGINE = MYISAM ;

插入数据:

  1. INSERT INTO `test` VALUES (null,1);

mysql发生错误:

  1. #1048 - Column 'col1' cannot be null

再来一条

  1. INSERT INTO `test` VALUES ('',1);

成功插入。
可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1也就有答案了。
对于问题2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响
而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多

我们再向test的表中插入几条数据:

  1. INSERT INTO `test` VALUES ('', NULL);
  2. INSERT INTO `test` VALUES ('1', '2');

现在表中数据:
image.png
现在根据需求,我要统计test表中col1不为空的所有数据,我是该用“<> ‘’” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。

  1. SELECT * FROM `test` WHERE col1 IS NOT NULL

image.png

  1. SELECT * FROM `test` WHERE col1 <> ''

image.png
可以看到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件。
MYSQL建议列属性尽量为NOT NULL
**

MySQL null和空值’’的区别

实际上 mysql 有两种空值。一种是空值 ‘’(remark字段那种,注意它不是空格),一种是null值(operate_detail字段)。
空值(‘’)是不占用空间的,
MySQL中的NULL其实是占用空间的

长度验证:注意空值的’’之间是没有空格的。

  1. mysql> select length(''),length(null),length(' ');
  1. +------------+--------------+--------------+
  2. | length('') | length(null) | length(' ') |
  3. +------------+--------------+--------------+
  4. | 0 | NULL | 2 |
  5. +------------+--------------+--------------+

null注意

注意事项:
1:在进行count(字段)统计某列的记录数的时候,如果采用的NULL值,系统会自动忽略掉,但是空值是会进行count(*)统计到其中的。
2: 判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用ifnull()函数来进行处理,判断空字符用=’’或者 <>’’来进行处理
3: 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现 ‘0000-00-00 00:00:00’
4:对于空值的判断到底是使用is null 还是=’’ 要根据实际业务来进行区分。