SQL-正则表达式和约束
文章目录
主要内容
- 正则表达式
- 约束
一.正则表达式
正则表达式是一种用来描述字符串模式的工具,它可以用于匹配、查找、替换等操作。正则表达式由字符和特殊字符组成,可以使用这些字符来定义匹配规则。
常用的正则表达式字符和特殊字符有:
- 普通字符:表示匹配该字符本身,如
a表示匹配字母"a"。 - 元字符:具有特殊含义的字符,如
.表示匹配除换行符以外的任意字符。 - 字符类:用
[]表示,表示匹配括号内的任意一个字符,如[abc]表示匹配字符"a"、“b"或"c”。 - 反义字符类:用
[^]表示,表示匹配除括号内字符以外的任意字符,如[^abc]表示匹配除"a"、“b”、"c"以外的任意字符。 - 重复字符:用
*、+、?表示,分别表示匹配前一个字符0次或多次、1次或多次、0次或1次。 - 边界匹配:用
^、$表示,分别表示匹配字符串的开头和结尾。 - 分组:用
()表示,可以将多个字符组合为一个整体,如(ab)+表示匹配"ab"、“abab”、"ababab"等。 - 转义字符:用
\表示,可以将特殊字符转义为普通字符,如\.表示匹配字符"."。
正则表达式的用法有:
- 匹配:使用
match()函数可以在字符串中查找匹配正则表达式的部分,并返回一个包含匹配结果的数组。 - 查找:使用
search()函数可以在字符串中查找匹配正则表达式的部分,并返回第一个匹配的位置。 - 替换:使用
replace()函数可以将字符串中匹配正则表达式的部分替换为指定的内容。 - 分割:使用
split()函数可以根据正则表达式将字符串分割为多个部分,并返回一个数组。
其他用法
-
量词:用来指定前面的字符或字符类的重复次数。常用的量词有:
*:匹配前一个字符0次或多次。+:匹配前一个字符1次或多次。?:匹配前一个字符0次或1次。{n}:匹配前一个字符恰好n次。{n,}:匹配前一个字符至少n次。{n,m}:匹配前一个字符至少n次,最多m次。
-
特殊字符:
.:匹配除换行符以外的任意字符。\d:匹配数字字符。\D:匹配非数字字符。\w:匹配字母、数字、下划线字符。\W:匹配非字母、数字、下划线字符。\s:匹配空白字符(空格、制表符、换行符等)。\S:匹配非空白字符。\b:匹配单词边界。\B:匹配非单词边界。
-
分组和引用:
():将多个字符组合为一个整体。(?:):非捕获分组,用于只匹配但不捕获。\1、\2、…:引用前面的分组,用于匹配相同的内容。
-
断言:
(?=...):正向肯定前瞻,用于匹配满足某个条件的位置。(?!...):正向否定前瞻,用于匹配不满足某个条件的位置。(?<=...):反向肯定后顾,用于匹配位于某个条件之后的位置。(?<!...):反向否定后顾,用于匹配不位于某个条件之后的位置。


正则表达式的用法非常灵活,可以根据具体的需求来选择合适的字符、特殊字符、量词、分组等来构建匹配规则。同时,正则表达式还支持一些高级的特性,如贪婪模式、非贪婪模式、修饰符等,可以进一步扩展正则表达式的功能。
正则表达式的详细用法还有很多,可以根据具体的需求来选择合适的正则表达式和相应的函数来进行操作。
1.操作1
代码如下(示例):
-- ^ 在字符串开始处进行匹配
SELECT 'abc' REGEXP '^a';
-- $ 在字符串末尾开始匹配
SELECT 'abc' REGEXP 'a$';
SELECT 'abc' REGEXP 'c$’;
-- . 匹配任意字符
SELECT 'abc' REGEXP '.b';
SELECT 'abc' REGEXP '.c';
SELECT 'abc' REGEXP 'a.';
-- [...] 匹配括号内的任意单个字符
SELECT 'abc' REGEXP '[xyz]';
SELECT 'abc' REGEXP '[xaz]';
2.操作2
代码如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]';
-- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*';
-- a+ 匹配 1 个或者多个 a, 但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
3.操作3
代码如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 内才是取反的意思,在别的地方都是表示开始处匹配
SELECT 'a' REGEXP '[^abc]';
SELECT 'x' REGEXP '[^abc]';
SELECT 'abc' REGEXP '[^a]';
-- a* 匹配 0 个或多个 a, 包括空字符串。 可以作为占位符使用 . 有没有指定字符都可以匹配
到数据
SELECT 'stab' REGEXP '.ta*b';
SELECT 'stb' REGEXP '.ta*b';
SELECT '' REGEXP 'a*';
-- a+ 匹配 1 个或者多个 a, 但是不包括空字符
SELECT 'stab' REGEXP '.ta+b';
SELECT 'stb' REGEXP '.ta+b';
4.操作4
代码如下(示例):
-- a{m,n} 匹配 m 到 n 个 a, 包含 m 和 n
SELECT 'auuuuc' REGEXP 'au{3,5}c';
SELECT 'auuuuc' REGEXP 'au{4,5}c';
SELECT 'auuuuc' REGEXP 'au{5,10}c';
-- (abc) abc 作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符
作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy' REGEXP 'x(abab)y';
SELECT 'xababy' REGEXP 'x(ab)*y';
SELECT 'xababy' REGEXP 'x(ab){1,2}y';
二.约束
SQL约束是用于限制数据库表中数据的完整性和一致性的规则。它们定义了对表中数据的操作所允许的条件和限制。约束可以应用于表的列或整个表。
约束的分类:
- 主键约束(Primary Key Constraint):用于标识表中的唯一记录。主键约束要求列中的值是唯一的且不为空。
- 外键约束(Foreign Key Constraint):用于建立表之间的关系。外键约束要求一个表的列的值必须是另一个表的主键值。
- 唯一约束(Unique Constraint):用于确保列中的值是唯一的。唯一约束要求列中的值不能重复。
- 非空约束(Not Null Constraint):用于确保列中的值不为空。非空约束要求列中的值不能为NULL。
- 检查约束(Check Constraint):用于定义列中值的范围或条件。检查约束要求列中的值必须满足指定的条件。
约束的作用:
- 数据完整性:约束可以确保表中的数据满足特定的条件和规则,防止无效或不一致的数据进入数据库。
- 数据一致性:约束可以确保表之间的关系是正确的,避免了数据冗余和不一致。
- 数据安全性:约束可以防止对表中数据的非法操作,保护数据的安全性。
约束的用法:
- 创建约束:在创建表时,可以使用CREATE TABLE语句来定义约束。例如,可以使用PRIMARY KEY关键字定义主键约束,使用UNIQUE关键字定义唯一约束,使用FOREIGN KEY关键字定义外键约束等。
- 修改约束:可以使用ALTER TABLE语句来修改表的约束。例如,可以使用ADD CONSTRAINT关键字来添加新的约束,使用DROP CONSTRAINT关键字来删除约束等。
- 禁用约束:可以使用ALTER TABLE语句来禁用约束。例如,可以使用DISABLE CONSTRAINT关键字来禁用约束,以便在需要时可以绕过约束进行操作。
- 启用约束:可以使用ALTER TABLE语句来启用约束。例如,可以使用ENABLE CONSTRAINT关键字来启用约束,以便在禁用后重新启用约束。
总结起来,SQL约束是用于限制数据库表中数据的完整性和一致性的规则。它们可以应用于表的列或整个表,通过定义特定的条件和规则来确保数据的有效性和安全性。
1.主键约束
添加单列主键
方法1:
--在create table语句时,通过primary key
-- 在定义字段的同时指定主键,语法格式如下:
create table 表名 (...< 字段名 > < 数据类型 > primary key...
)方式 1- 实现:
create table emp1(eid int primay key,name VARCHAR(20),deptId int,salary double
);方法2:
-- 在定义字段之后再指定主键,语法格式如下:
create table 表名 (...[constraint < 约束名 >] primary key [ 字段名]
);方式 2- 实现:
create table emp2(eid INT,name VARCHAR(20),deptId INT,salary double,constraint pk1 primary key(id)
);
添加多列主键(联合主键)
语法:
create table 表名(...primary key (字段1,字段2,...,字段n)
);实现:
create table emp3(name varchar(20),deptId int,salary double,primary key(name,deptId)
);
通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。语法;
create table 表名 (...
);
alter table < 表名 > add primary key (字段列表 );实现:
-- 添加单列主键
create table emp4(eid int,name varchar(20),deptId int,salary double,
);
alter table emp4 add primary key ( eid);
删除主键约束
格式:
alter table <数据表名> drop primary key;实现:
-- 删除单列主键
alter table emp1 drop primary key;
-- 删除联合主键
alter table emp5 drop primary key;
2.自增长约束
在 MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长
语法:
字段名 数据类型 auto_increment实现:
create table t_user1(id int primary key auto_increment,name varchar(20)
);
特点:
- 默认情况下, auto_increment 的初始值是 1 ,每新增一条记录,字段值自动加 1 。
- 一个表中只能有一个字段使用auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或 主键的一部分)。
- auto_increment约束的字段必须具备 NOT NULL 属性。 auto_increment 约束的字段只能是整数类型( TINYINT 、SMALLINT 、 INT 、 BIGINT 等。
- auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限, auto_increment 就会失效。
指定自增字段初始值
-- 方式 1 ,创建表时指定
create table t_user2 (id int primary key auto_increment,name varchar(20)
)auto_increment=100;--方式2,创建表之后指定
create table t_user3 (id int primary key auto_increment,name varchar(20)
);
alter table t_user2 auto_increment=100;
delete 和 truncate 在删除后自增列的变化:
delete:数据之后自动增长从断点开始
truncate:数据之后自动增长从默认起始值开始
3.非空约束
语法:
方式 1 : < 字段名 >< 数据类型 > not null;
方式 2 : alter table 表名 modify 字段 类型 not null;添加非空约束
--方法1,创建表时指定
create table t_user6 (id int ,name varchar(20) not null,address varchar(20) not null
);--方法2,之后指定
create table t_user7 (id int ,name varchar(20) , -- 指定非空约束address varchar(20) -- 指定非空约束
);
alter table t_user7 modify name varchar(20) not null;
alter table t_user7 modify address varchar(20) not null;删除非空约束:
-- alter table 表名 modify 字段 类型
alter table t_user7 modify name varchar(20) ;
alter table t_user7 modify address varchar(20) ;
4.唯一约束
代码如下(示例):
语法:
方式 1 : < 字段名 > < 数据类型 > unique
方式 2 : alter table 表名 add constraint 约束名 unique( 列 );添加唯一约束 - 方式 1
-- 创建表时指定
create table t_user8 (id int ,name varchar(20) ,phone_number varchar(20) unique -- 指定唯一约束
);添加唯一约束 - 方式 2
create table t_user9 (id int ,name varchar(20) ,phone_number varchar(20) -- 指定唯一约束
);
alter table t_user9 add constraint unique_ph unique(phone_number);删除唯一约束
-- alter table < 表名 > drop index < 唯一约束名 >;
alter table t_user9 drop index unique_ph;
5.默认约束
语法
方式 1 : < 字段名 > < 数据类型 > default < 默认值 >;
方式 2: alter table 表名 modify 列名 类型 default 默认值 ;添加默认约束 - 方式 1create table t_user10 (
id int ,
name varchar(20) ,
address varchar(20) default ‘ 北京’ -- 指定默认约束
);添加默认约束 - 方式 2
--alter table 表名 modify 列名 类型 default 默认值
create table t_user11 (id int ,name varchar(20) ,address varchar(20)
);
alter table t_user11 modify address varchar(20) default ‘ 北京’ ;删除默认约束
-- alter table < 表名 > modify column < 字段名 > < 类型 > default null;
alter table t_user11 modify column address varchar(20) default null;
6.零填充约束
- 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的 0
- zerofill 默认为 int(10)
- 当使用 zerofill 时,默认会自动加 unsigned (无符号)属性,使用 unsigned 属性后,数值范围 是原值的 2 倍,例如,有符号为 -128~+127 ,无符号为 0~256 。
代码如下(示例):
create table t_user12 (id int zerofill , -- 零填充约束name varchar(20)
);删除
alter table t_user12 modify id int;
总结
MySQL的视图
以上是今天要讲的内容,学到了正则表达式和约束,包括正则表达式的字符和特殊字符,约束的分类,约束的作用,约束的用法。
相关文章:
SQL-正则表达式和约束
文章目录 主要内容一.正则表达式1.操作1代码如下(示例): 2.操作2代码如下(示例): 3.操作3代码如下(示例): 4.操作4代码如下(示例): 二.约束1.主键约束 2.自增长约束3.非空约束4.唯一…...
“人类高质量数据”如何训练计算机视觉模型?
人类的视觉系统可以复制吗? 答案是肯定的。 计算机视觉 (Computer Vision) 技术的不断普及,让机器识别和处理图像就像人的大脑一样,且速度更快、更准确。 机器像人类一样去“思考” 计算机视觉 (Computer Vision) 是近年来人工智能增长最快…...
ListenableFuture和countdownlatch使用example
ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行 import com.google.common.util.concurrent.*;import java.util.concurrent.Call…...
C- strtok() strtok_r()
strtok() strtok 是 C 语言库中的一个函数,用于在字符串上执行分词操作。这意味着它可以用于将字符串分解成多个标记或段,这些标记之间由指定的分隔符分隔。 以下是 strtok 函数的原型: char *strtok(char *str, const char *delim);参数&…...
order by数据过多引起的cpu飙升
测试环境 1.目前数据库类型为pg数据库2.目前数据库业务为共享数据库,为减少其他业务对本次测试的影响,故选在业务空闲时间执行3.服务器性能为8C 32GB 500GB硬盘 原程序测试结果 优化后程序结果 出现原因 当数据量大时,order by排序操作会消耗大量的CPU资源&#…...
namespace命名空间
namespace命名空间 什么是命名空间? namespace命名空间 同一个名称在不同的命名空间中所指向的对象是不同的 为什么要使用命名空间? 防止标识符的命名发生冲突 你写的代码中定义了个fun()函数 所使用的类库中也包含了一个fun()函数 当你的代码中调用fun()函数时 程序:?…...
golang中如何配置 sql.DB 以获得更好的性能
有很多很好的教程讨论 Go 的sql.DB类型以及如何使用它来执行 SQL 数据库查询和语句。但它们中的大多数都掩盖了SetMaxOpenConns()、SetMaxIdleConns()和SetConnMaxLifetime()方法——您可以使用它们来配置 的行为sql.DB并改变其性能。 在这篇文章中,我想准确解释这…...
JAVA同城服务智慧养老小程序怎么开发?
随着人口老龄化的加剧,智慧养老成为了社会关注的焦点。智慧养老小程序作为一种便捷、高效的服务工具,为老年人提供了更全面、个性化的服务。本文将介绍如何使用JAVA编程语言开发一款同城服务智慧养老小程序。 一、设计思路 界面设计:小程序…...
Linux防火墙:Firewalld 常用命令
Linux防火墙:Firewalld 常用命令 CentOS 和 Fedora 中默认的防火墙是 Firewalld 查看防火墙状态 firewall-cmd --state 启动防火墙 systemctl start firewalld 重启防火墙 systemctl restart firewalld 暂时关闭防火墙 systemctl stop firewalld 永久关闭防火墙…...
Java BigInteger比Long更大的整数自增转字符串存储
文章目录 前言BigInteger自增BigInteger转化为StringBigInteger阶乘 前言 BigInteger类在Java中可以表示任意大小的整数,没有固定的范围限制。它使用内部的数组来存储整数的位数,并提供了各种方法来执行算术运算和其他操作。 BigInteger类的大小只受限…...
BigDecimal应用——计算费用场景中用到Integer,Double,BigDecimal三种类型出现的意外情况 结合BigDecimal源码分析
引出 在一个计算费用的场景中,用到了Integer,Double,BigDecimal三种类型,在转换为bigdecimal的时候遇到的问题,结合源码进行了分析。 1.在new bigdecimal的时候,最好传入的是字符串;2.double类…...
数据抓取可以应用到哪些行业
随着互联网的发展,数据已经成为人们生活中不可或缺的一部分。数据抓取作为获取数据的重要手段之一,也被广泛应用于各个行业。本文将探讨数据抓取在各个行业中的应用。 首先,让我们来了解一下数据抓取的基本概念。数据抓取是指通过一定的技术…...
目标检测YOLO实战应用案例100讲-面向小目标检测的多尺度特征融合(续)
目录 3.3 实验结果及分析 3.3.1 实验设置 3.3.2 消融实验 3.3.3 在PASCAL VOC2007上的结果...
如何选择适合的美颜SDK?
美摄美颜SDK是一款专门为企业提供美颜技术支持的SDK,可以帮助企业开发出具有高品质美颜效果的移动应用。本文将介绍美摄美颜SDK的技术特点和面向企业提供的技术支持。 一、技术特点 美摄美颜SDK采用了先进的图像处理技术和人工智能算法,能够快速准确地…...
Spring-底层架构核心概念
Spring底层核心组件 BeanDefinition BeanDefinition表示Bean定义,有很多属性用来描述Bean的特点: class,表示Bean类型 scope,表示Bean作用域,单例或原型等 lazyInit:表示Bean是否是懒加载 initMethod…...
RabbitMQ初入门
1、RabbitMQ是什么 RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…...
电脑定时关机
电脑定时关机 1.右键 管理 2. 3. 4. 5. shutdown.exe/s /f /t 06.点击完成就好了 7.这里面可以 看到定时任务和启动 右键有运行 结束 禁用...
【算法】滑动窗口题单——4.不定长滑动窗口(求子数组个数)
文章目录 前言2799. 统计完全子数组的数目解法1——枚举右端点,移动左端点解法2——枚举左端点,扩展右端点 713. 乘积小于 K 的子数组1358. 包含所有三种字符的子字符串数目2302. 统计得分小于 K 的子数组数目2537. 统计好子数组的数目2762. 不间断子数组…...
CMake aux_source_directory 学习
如下,prj是空文件夹; add.h; #include <iostream>using namespace std;int add1(int a, int b); num.h; int num1100; int num2301; add.cpp; #include "add.h"int add1(int i, int j) {return i j; } main.cpp&#x…...
Mybatis中延迟加载~
延迟加载: 等一会加载,在多表关联查询操作的时候可以使用到的一种方案,如果是单表操作就完全没有延迟加载的概念。 多表查询例如,查询用户和部门信息,如果我们仅仅只是需要用户的信息,而不需要用户对应的…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
