菜鸟笔记
提升您的技术认知

正则表达式与分页查询-ag真人游戏

​ 正则表达式(regular expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)、特殊字符(称为"元字符")以及数字(0-9)等。虽然用起来比较繁琐,但是可以很好的提高效率。

在mysql中同样也可以使用正则表达式,在mysql中要是用正则表达式时可以使用关键字regexp 操作符来进行正则表达式匹配。在mysql常见的正则符有:

模式 描述
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结束位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “play” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[abc]’ 可以匹配 “play” 中的’p’。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
匹配前面的子表达式一次或多次。例如,‘zo ’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

^模式: 匹配输入字符串的开始位置。
---------->>>>>案例1:查找员工名字以s开头的,返回员工的详细信息。

mysql> select * from emp where ename regexp '^s';
 ------- ------- --------- ------ ------------ ------ ------ -------- 
| empno | ename | job     | mgr  | hiredate   | sal  | comm | deptno |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
|  7369 | smith | clerk   | 7902 | 1980-12-17 |  800 | null |     20 |
|  7788 | scott | analyst | 7566 | 1987-04-19 | 3000 | null |     20 |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
2 rows in set

$模式:匹配输入字符串的结束位置。
----------->>>>>>>案例2:查找员工名字以s结尾的,返回员工的详细信息。

mysql> select * from emp where ename regexp 's$';
 ------- ------- --------- ------ ------------ ------ ------ -------- 
| empno | ename | job     | mgr  | hiredate   | sal  | comm | deptno |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
|  7566 | jones | manager | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7876 | adams | clerk   | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james | clerk   | 7698 | 1981-12-03 |  950 | null |     30 |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
3 rows in set

. 模式: 含有 . 的字符

----------->>>>>>>案例3:查找员工名字含有a的员工的详细信息。

mysql> select * from emp where ename regexp 'a';
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
| empno | ename  | job      | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
|  7499 | allen  | salesman | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager  | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager  | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7876 | adams  | clerk    | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james  | clerk    | 7698 | 1981-12-03 |  950 | null |     30 |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
7 rows in set

[…]模式: 匹配所包含的任意一个字符

----------->>>>>>>案例4:查找员工名字含有azxyv的员工的详细信息。

mysql> select * from emp where ename regexp '[azxyv]';
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
| empno | ename  | job      | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
|  7499 | allen  | salesman | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager  | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager  | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7876 | adams  | clerk    | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james  | clerk    | 7698 | 1981-12-03 |  950 | null |     30 |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
7 rows in set

[^…]模式: 匹配未包含的任意字符

----------->>>>>>>案例5:查找员工名字首字母不含有abcdefg的员工的详细信息。

原始数据
mysql> select * from emp;
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
| empno | ename  | job       | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
|  7369 | smith  | clerk     | 7902 | 1980-12-17 |  800 | null |     20 |
|  7499 | allen  | salesman  | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman  | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7566 | jones  | manager   | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7654 | martin | salesman  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager   | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager   | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7788 | scott  | analyst   | 7566 | 1987-04-19 | 3000 | null |     20 |
|  7839 | king   | president | null | 1981-11-17 | 5000 | null |     10 |
|  7844 | turner | salesman  | 7698 | 1981-09-08 | 1500 |    0 |     30 |
|  7876 | adams  | clerk     | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james  | clerk     | 7698 | 1981-12-03 |  950 | null |     30 |
|  7902 | ford   | analyst   | 7566 | 1981-12-03 | 3000 | null |     20 |
|  7934 | miller | clerk     | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
14 rows in set
mysql> select * from emp where ename regexp '^[^abcdefg]';
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
| empno | ename  | job       | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
|  7369 | smith  | clerk     | 7902 | 1980-12-17 |  800 | null |     20 |
|  7521 | ward   | salesman  | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7566 | jones  | manager   | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7654 | martin | salesman  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7788 | scott  | analyst   | 7566 | 1987-04-19 | 3000 | null |     20 |
|  7839 | king   | president | null | 1981-11-17 | 5000 | null |     10 |
|  7844 | turner | salesman  | 7698 | 1981-09-08 | 1500 |    0 |     30 |
|  7900 | james  | clerk     | 7698 | 1981-12-03 |  950 | null |     30 |
|  7934 | miller | clerk     | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
9 rows in set

*模式: 匹配前面的子表达式零次或多次

----------->>>>>>>案例6:查找员工名字中l连着出现的员工的详细信息。

mysql> select * from emp where ename regexp 'l*';
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
| empno | ename  | job       | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
|  7369 | smith  | clerk     | 7902 | 1980-12-17 |  800 | null |     20 |
|  7499 | allen  | salesman  | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman  | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7566 | jones  | manager   | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7654 | martin | salesman  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager   | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager   | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7788 | scott  | analyst   | 7566 | 1987-04-19 | 3000 | null |     20 |
|  7839 | king   | president | null | 1981-11-17 | 5000 | null |     10 |
|  7844 | turner | salesman  | 7698 | 1981-09-08 | 1500 |    0 |     30 |
|  7876 | adams  | clerk     | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james  | clerk     | 7698 | 1981-12-03 |  950 | null |     30 |
|  7902 | ford   | analyst   | 7566 | 1981-12-03 | 3000 | null |     20 |
|  7934 | miller | clerk     | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
14 rows in set

模式: 匹配前面的子表达式一次或多次

----------->>>>>>>案例7:查找员工名字中 l 连着出现的员工的详细信息。

mysql> select * from emp where ename regexp 'l ';
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
| empno | ename  | job      | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
|  7499 | allen  | salesman | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7698 | blake  | manager  | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager  | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7934 | miller | clerk    | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
4 rows in set

p1|p2|p3模式: 能够匹p1 或p2 或p3

----------->>>>>>>案例8:查找员工名字中 (m|e)s的员工的详细信息。

mysql> select * from emp where ename regexp '(m|e)s';
 ------- ------- --------- ------ ------------ ------ ------ -------- 
| empno | ename | job     | mgr  | hiredate   | sal  | comm | deptno |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
|  7566 | jones | manager | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7876 | adams | clerk   | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james | clerk   | 7698 | 1981-12-03 |  950 | null |     30 |
 ------- ------- --------- ------ ------------ ------ ------ -------- 
3 rows in set

{n}模式: 匹配确定的次数。

----------->>>>>>>案例9:查找员工名字中 l出现2次的员工的详细信息。

mysql> select * from emp where ename regexp 'l{2}';
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
| empno | ename  | job      | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
|  7499 | allen  | salesman | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7934 | miller | clerk    | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
2 rows in set

{n,m}模式: 匹配确定的次数。这里说的次数是一个区间,其中n<=m

----------->>>>>>>案例10:查找管理员名字出a出现4-5的管理员的详细信息。

create table `admin` (
  `id` int(14) not null auto_increment,
  `name` varchar(28) not null,
  `pwd` int(20) not null,
  primary key (`id`)
) engine=innodb auto_increment=4 default charset=latin1
insert into admin values(1,'aaaaavvvff',123456),(2,'aaasdfvg',123456),(3,'aasdfvg',123456);
mysql> select * from admin;
 ---- ------------ -------- 
| id | name       | pwd    |
 ---- ------------ -------- 
|  1 | aaaaavvvff | 123456 |
|  2 | aaasdfvg   | 123456 |
|  3 | aasdfvg    | 123456 |
 ---- ------------ -------- 
3 rows in set
mysql> select * from admin where name regexp 'a{4,5}';
 ---- ------------ -------- 
| id | name       | pwd    |
 ---- ------------ -------- 
|  1 | aaaaavvvff | 123456 |
 ---- ------------ -------- 
1 row in set

limit(分页查询)是mysql中特有的,其他数据库不能用,虽然现在有许多的分页插件,比如pagehelp、mybatis自带的以及mybatis-plus自带的分页插件等,分页时会比较方便,但分页插件的底层实现代码任然离不来limit。分页就是去结果集中的部分数据,一般在sql语句的最后部分。它有两个重要的参数, startindex:起始位置,从0开始,pagesize:取得个数,即页面的大小一旦确定下来就不会再变

具体语法:

select table_name1.column_name,table_name2.column_name
from table_name1
inner join table_name2
on  table_name1.column_name = table_name2.column_name 
where 条件
group by column_name;
hving column_name;
order by column_name asc/desc;
limit startindex,pagesize;

startindex = pagesize(startindex - 1)*

---------->>>>>>>>案例1:查询前6个员工的信息

mysql> select * from emp limit 6;
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
| empno | ename  | job      | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
|  7369 | smith  | clerk    | 7902 | 1980-12-17 |  800 | null |     20 |
|  7499 | allen  | salesman | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7566 | jones  | manager  | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7654 | martin | salesman | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager  | 7839 | 1981-05-01 | 2850 | null |     30 |
 ------- -------- ---------- ------ ------------ ------ ------ -------- 
6 rows in set

---------->>>>>>>>案例2:查询后三个员工的信息

原始数据:
mysql> select * from emp;
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
| empno | ename  | job       | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
|  7369 | smith  | clerk     | 7902 | 1980-12-17 |  800 | null |     20 |
|  7499 | allen  | salesman  | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | ward   | salesman  | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7566 | jones  | manager   | 7839 | 1981-04-02 | 2975 | null |     20 |
|  7654 | martin | salesman  | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7698 | blake  | manager   | 7839 | 1981-05-01 | 2850 | null |     30 |
|  7782 | clark  | manager   | 7839 | 1981-06-09 | 2450 | null |     10 |
|  7788 | scott  | analyst   | 7566 | 1987-04-19 | 3000 | null |     20 |
|  7839 | king   | president | null | 1981-11-17 | 5000 | null |     10 |
|  7844 | turner | salesman  | 7698 | 1981-09-08 | 1500 |    0 |     30 |
|  7876 | adams  | clerk     | 7788 | 1987-05-23 | 1100 | null |     20 |
|  7900 | james  | clerk     | 7698 | 1981-12-03 |  950 | null |     30 |
|  7902 | ford   | analyst   | 7566 | 1981-12-03 | 3000 | null |     20 |
|  7934 | miller | clerk     | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- ----------- ------ ------------ ------ ------ -------- 
14 rows in set
查询结果:
mysql> select * from emp  limit 11,3;
 ------- -------- --------- ------ ------------ ------ ------ -------- 
| empno | ename  | job     | mgr  | hiredate   | sal  | comm | deptno |
 ------- -------- --------- ------ ------------ ------ ------ -------- 
|  7900 | james  | clerk   | 7698 | 1981-12-03 |  950 | null |     30 |
|  7902 | ford   | analyst | 7566 | 1981-12-03 | 3000 | null |     20 |
|  7934 | miller | clerk   | 7782 | 1982-01-23 | 1300 | null |     10 |
 ------- -------- --------- ------ ------------ ------ ------ -------- 
3 rows in set
网站地图