MySQL查漏补缺(二)排序检索、过滤数据、模糊查询、正则表达式

一、数据表

/*
 Navicat Premium Data Transfer

 Source Server         : hu
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : localhost:3306
 Source Schema         : uer

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 28/02/2021 16:23:07
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for orderby
-- ----------------------------
DROP TABLE IF EXISTS `orderby`;
CREATE TABLE `orderby`  (
  `auto` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `shor` int(5) NULL DEFAULT NULL,
  PRIMARY KEY (`auto`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of orderby
-- ----------------------------
INSERT INTO `orderby` VALUES (1, 'hu', 5);
INSERT INTO `orderby` VALUES (2, 'hu', 5);
INSERT INTO `orderby` VALUES (3, 'hu', 3);
INSERT INTO `orderby` VALUES (4, 'hu', 2);
INSERT INTO `orderby` VALUES (5, 'hu', 1);
INSERT INTO `orderby` VALUES (6, 'hu', 5);
INSERT INTO `orderby` VALUES (7, 'hu', 8);
INSERT INTO `orderby` VALUES (8, 'hu', 4);
INSERT INTO `orderby` VALUES (9, 'hu', 2);
INSERT INTO `orderby` VALUES (10, 'hu', 3);

SET FOREIGN_KEY_CHECKS = 1;

二、排序检索数据

检索出来的数据并不是以纯粹的随机顺序显示的,如果不排序,数据一般将以它在底层表中出现的顺序显示,

这可以是数据最初添加到表中的顺序,但是,如果数据后来进行过更新或者删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。

关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。

select * from orderBy order by shor asc,auto

降序:desc

升序:asc

注意:如果要对多个列进行排序,则需要对每个列都加上关键字(desc或者asc)

升序是默认排序方式,可以不写

三、过滤数据

数据库表一般包含大量的数据,很少需要检索表中的所有行,通常会根据特定的操作或报告的需要提取表数据的子集。只检索所需要的数据,需要制定搜索条件,也叫过滤条件。

操作符:

= 等于

<> 不等于

!= 不等于

< 小于

<= 小于等于

> 大于

>= 大于等于

Between 在指定的两个值之间

select * from orderBy where short between 3 and 5

空值检查

Null:空值,他与字段包含0、空字符串或仅仅包含空格不同

-- 测试之前将几条数据的shor字段置为null
select * from orderBy where shor is null

注意:在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL的行。但是,不行,因为位置具有特殊含义,数据库不知道他们是否匹配,所以在匹配过滤或不匹配过滤时不返回他们。

四、数据过滤

上一节介绍的是所有where子句在过滤数据时使用的都是单一的条件,为了进行更强的过滤控制,MySQL允许给出多个WHERE子句,这些子句可以两种方式联合使用:and子句或者or子句。

and和or的优先级问题

SQL语句在处理时,会优先处理and再去处理or。若想先处理or子句,则需要在对应的位置上增加上小括号。

IN操作符

in操作符用来指定条件范围,范围中的每个条件都可以用来进行匹配。in取合法值的由逗号分隔的清单,全都包括在小括号中。

NOT操作符

where子句中的not操作符有且只有一个功能,那就是否定它之后跟的任何条件。

select * from orderBy where shor not in (5,8)

注意:Mysql支持not对in、between和exists(存在)子句取反

五、使用通配符进行过滤

通配符:用来匹配值一部分的特殊字符。

搜索模式:由字面值、通配符或两者组合成的搜索条件。

在搜索子句中使用通配符,必须使用like操作符,like指示Mysql,后面跟的搜索模式利用通配符而不是直接相等匹配进行比较。

使用这种功能是有代价的:通配符搜索的处理一般要比前面说的其他搜索花费的时间更长。

%通配符

%代表任意字符出现的任意次数

注意:根据MySQL的配置方式,搜索是可以区分大小写的,如果区分大小写,则‘hu%’和 HuLeTian将是不匹配的。%不可以匹配NULL。

下划线(_)通配符

_代表匹配单个字符,只能匹配一个,不能多也不能少。

六、正则表达式

前几节的过滤例子允许用匹配、比较和通配符寻找数据,对于基本的过滤,这样就足够了,但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加。

例如:想从文本文件中提取电话号码、查找名字中间有数字的所有文件等都可以使用正则表达式。

正则表达式使用正则表达式语言来建立,正则表达式语言是用来完成刚讨论的所有工作以及更多的工作的一种特殊语言。

正则表达式与MySQL的关系

正则表达式是用来匹配文本的,将一个模式(正则表达式)与一个文本串进行比较,MySQL用where子句对正则表达式提供了初步的支持,允许你指定正则表达式过滤select检索出的数据。

如果你熟悉正则表达式,则要注意:MySQL仅支持多数正则表达式实现的一个很小的子集。

基本字符匹配

select shor
from zhengze
where shor regexp '2'
order by shor asc

结果:

| shor   |
|--------|
| 200    |
| 245    |
| 5245   |
| 24050  |
| 47278  |

分析:

regexp后面跟的就是正则表达式,此句话表示:查询zhengze表中shor列的文本包含字符‘2’的所有行。

等同于 like ‘%2%’

正则表达式中字符含义:

|  字符      |  含义                    |
|  ----     | -------------------------|
| .         | 匹配任意一个字符            |
| [字符]     | 匹配任意一个括号中的单一字符  |

注意:

MySQL中的正则表达式匹配(自3.23.4后),不区分大小写,即大小写都匹配。

进行OR匹配

shor regexp '2|1'

分析:

该正则表达式表示:匹配shor列所有数据中包含1或者包含2的行。

shor regexp '[123] Ton'

分析:

匹配shor列中包含1 Ton或者2 Ton或者3 Ton的所有行。

注意:

[]:代表匹配特定的单一字符

[123]代表的含义:[1|2|3],即只能有一个字符,是1或者2或者3

regexp ‘1|2|3 Ton’:代表匹配1或者2或者3 Ton

匹配范围

[1-3]:表示1或2或3

[a-z]:表示a到z这26个英文字母(不区分大小写)

匹配特殊的字符

假设我们要匹配包含’.‘的所有行,regexp ‘.’ ,这样写会将所有行都匹配出来,因为’.'代表任意一个字符。

为了匹配特殊字符,必须用\\为前导。例如:’\\-’:表示查找’-’,’\\.’:表示查找’.’。这就是所谓的转义(escaping)。

为了匹配\本身,则需要使用\\\。

注意:

多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另外一个)。

匹配多个实例

目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何的行。但有时需要对匹配的数目进行更强的控制。例如:要寻找所有的数,不管数中包含多少数字。

重复元字符

|  元字符   | 说明            |
|  ----  | -----------------|
|  *     | 0个或者多个匹配    |
|  +     | 1个或者多个匹配    |
|  ?     | 0个或者1个匹配     |
|  {n}   | 指定n个匹配        |
|  {n,}  | 不少于n个匹配      |
|  {n,m} | 匹配数目在n和m之间  |

例如:

regexp ‘\\([0-9] sticks?\\)’

(即为(,[0-9]:表示匹配0-9中的任意一个数字,然后加上stick或者sticks(因为?代表0个s或者一个s),最后在加上)。

即要匹配以下子串:

(0 stick) (0 sticks)

(1 stick) (1 sticks)

(2 stick) (2 sticks)

(3 stick) (3 sticks)

(4 stick) (4 sticks)

(5 stick) (5 sticks)

(6 stick) (6 sticks)

(7 stick) (7 sticks)

(8 stick) (8 sticks)

(9 stick) (9 sticks)

定位符

目前为止,所有的例子都是在匹配一个串中任意位置的文本,为了匹配特定位置的文本,需要使用下面表中的定位符。

^:文本的开始

$:文本的结束

[[:<:]]:词的开始

[[:>:]]:词的结束

注意:

like和regexp的不同在于,like匹配整个串,regexp匹配子串。利用定位符,通过^开始每个表达式,通过$结束每个表达式,可以使regexp和like效果一样。

猜你喜欢

转载自blog.csdn.net/weixin_44613100/article/details/114238337
今日推荐