SQL正則表達(dá)式和約束使用詳解
主要內(nèi)容
- 正則表達(dá)式
- 約束
一.正則表達(dá)式
正則表達(dá)式是一種用來描述字符串模式的工具,它可以用于匹配、查找、替換等操作。正則表達(dá)式由字符和特殊字符組成,可以使用這些字符來定義匹配規(guī)則。
常用的正則表達(dá)式字符和特殊字符有:
- 普通字符:表示匹配該字符本身,如
a
表示匹配字母"a"。 - 元字符:具有特殊含義的字符,如
.
表示匹配除換行符以外的任意字符。 - 字符類:用
[]
表示,表示匹配括號內(nèi)的任意一個字符,如[abc]
表示匹配字符"a"、“b"或"c”。 - 反義字符類:用
[^]
表示,表示匹配除括號內(nèi)字符以外的任意字符,如[^abc]
表示匹配除"a"、“b”、"c"以外的任意字符。 - 重復(fù)字符:用
*
、+
、?
表示,分別表示匹配前一個字符0次或多次、1次或多次、0次或1次。 - 邊界匹配:用
^
、$
表示,分別表示匹配字符串的開頭和結(jié)尾。 - 分組:用
()
表示,可以將多個字符組合為一個整體,如(ab)+
表示匹配"ab"、“abab”、"ababab"等。 - 轉(zhuǎn)義字符:用
\
表示,可以將特殊字符轉(zhuǎn)義為普通字符,如\.
表示匹配字符"."。
正則表達(dá)式的用法有:
- 匹配:使用
match()
函數(shù)可以在字符串中查找匹配正則表達(dá)式的部分,并返回一個包含匹配結(jié)果的數(shù)組。 - 查找:使用
search()
函數(shù)可以在字符串中查找匹配正則表達(dá)式的部分,并返回第一個匹配的位置。 - 替換:使用
replace()
函數(shù)可以將字符串中匹配正則表達(dá)式的部分替換為指定的內(nèi)容。 - 分割:使用
split()
函數(shù)可以根據(jù)正則表達(dá)式將字符串分割為多個部分,并返回一個數(shù)組。
其他用法
量詞:用來指定前面的字符或字符類的重復(fù)次數(shù)。常用的量詞有:
*
:匹配前一個字符0次或多次。+
:匹配前一個字符1次或多次。?
:匹配前一個字符0次或1次。{n}
:匹配前一個字符恰好n次。{n,}
:匹配前一個字符至少n次。{n,m}
:匹配前一個字符至少n次,最多m次。
特殊字符:
.
:匹配除換行符以外的任意字符。\d
:匹配數(shù)字字符。\D
:匹配非數(shù)字字符。\w
:匹配字母、數(shù)字、下劃線字符。\W
:匹配非字母、數(shù)字、下劃線字符。\s
:匹配空白字符(空格、制表符、換行符等)。\S
:匹配非空白字符。\b
:匹配單詞邊界。\B
:匹配非單詞邊界。
分組和引用:
()
:將多個字符組合為一個整體。(?:)
:非捕獲分組,用于只匹配但不捕獲。\1
、\2
、…:引用前面的分組,用于匹配相同的內(nèi)容。
斷言:
(?=...)
:正向肯定前瞻,用于匹配滿足某個條件的位置。(?!...)
:正向否定前瞻,用于匹配不滿足某個條件的位置。(?<=...)
:反向肯定后顧,用于匹配位于某個條件之后的位置。(?<!...)
:反向否定后顧,用于匹配不位于某個條件之后的位置。
正則表達(dá)式的用法非常靈活,可以根據(jù)具體的需求來選擇合適的字符、特殊字符、量詞、分組等來構(gòu)建匹配規(guī)則。同時,正則表達(dá)式還支持一些高級的特性,如貪婪模式、非貪婪模式、修飾符等,可以進一步擴展正則表達(dá)式的功能。
正則表達(dá)式的詳細(xì)用法還有很多,可以根據(jù)具體的需求來選擇合適的正則表達(dá)式和相應(yīng)的函數(shù)來進行操作。
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.'; -- [...] 匹配括號內(nèi)的任意單個字符 SELECT 'abc' REGEXP '[xyz]'; SELECT 'abc' REGEXP '[xaz]';
2.操作2
代碼如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 內(nèi)才是取反的意思,在別的地方都是表示開始處匹配 SELECT 'a' REGEXP '[^abc]'; SELECT 'x' REGEXP '[^abc]'; SELECT 'abc' REGEXP '[^a]'; -- a* 匹配 0 個或多個 a, 包括空字符串。 可以作為占位符使用 . 有沒有指定字符都可以匹配 到數(shù)據(jù) 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
代碼如下(示例):
-- [^...] 注意 ^ 符合只有在 [] 內(nèi)才是取反的意思,在別的地方都是表示開始處匹配 SELECT 'a' REGEXP '[^abc]'; SELECT 'x' REGEXP '[^abc]'; SELECT 'abc' REGEXP '[^a]'; -- a* 匹配 0 個或多個 a, 包括空字符串。 可以作為占位符使用 . 有沒有指定字符都可以匹配 到數(shù)據(jù) 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約束是用于限制數(shù)據(jù)庫表中數(shù)據(jù)的完整性和一致性的規(guī)則。它們定義了對表中數(shù)據(jù)的操作所允許的條件和限制。約束可以應(yīng)用于表的列或整個表。
約束的分類:
- 主鍵約束(Primary Key Constraint):用于標(biāo)識表中的唯一記錄。主鍵約束要求列中的值是唯一的且不為空。
- 外鍵約束(Foreign Key Constraint):用于建立表之間的關(guān)系。外鍵約束要求一個表的列的值必須是另一個表的主鍵值。
- 唯一約束(Unique Constraint):用于確保列中的值是唯一的。唯一約束要求列中的值不能重復(fù)。
- 非空約束(Not Null Constraint):用于確保列中的值不為空。非空約束要求列中的值不能為NULL。
- 檢查約束(Check Constraint):用于定義列中值的范圍或條件。檢查約束要求列中的值必須滿足指定的條件。
約束的作用:
- 數(shù)據(jù)完整性:約束可以確保表中的數(shù)據(jù)滿足特定的條件和規(guī)則,防止無效或不一致的數(shù)據(jù)進入數(shù)據(jù)庫。
- 數(shù)據(jù)一致性:約束可以確保表之間的關(guān)系是正確的,避免了數(shù)據(jù)冗余和不一致。
- 數(shù)據(jù)安全性:約束可以防止對表中數(shù)據(jù)的非法操作,保護數(shù)據(jù)的安全性。
約束的用法:
- 創(chuàng)建約束:在創(chuàng)建表時,可以使用CREATE TABLE語句來定義約束。例如,可以使用PRIMARY KEY關(guān)鍵字定義主鍵約束,使用UNIQUE關(guān)鍵字定義唯一約束,使用FOREIGN KEY關(guān)鍵字定義外鍵約束等。
- 修改約束:可以使用ALTER TABLE語句來修改表的約束。例如,可以使用ADD CONSTRAINT關(guān)鍵字來添加新的約束,使用DROP CONSTRAINT關(guān)鍵字來刪除約束等。
- 禁用約束:可以使用ALTER TABLE語句來禁用約束。例如,可以使用DISABLE CONSTRAINT關(guān)鍵字來禁用約束,以便在需要時可以繞過約束進行操作。
- 啟用約束:可以使用ALTER TABLE語句來啟用約束。例如,可以使用ENABLE CONSTRAINT關(guān)鍵字來啟用約束,以便在禁用后重新啟用約束。
總結(jié)起來,SQL約束是用于限制數(shù)據(jù)庫表中數(shù)據(jù)的完整性和一致性的規(guī)則。它們可以應(yīng)用于表的列或整個表,通過定義特定的條件和規(guī)則來確保數(shù)據(jù)的有效性和安全性。
1.主鍵約束
添加單列主鍵
方法1: --在create table語句時,通過primary key -- 在定義字段的同時指定主鍵,語法格式如下: create table 表名 ( ... < 字段名 > < 數(shù)據(jù)類型 > primary key ... ) 方式 1- 實現(xiàn): create table emp1( eid int primay key, name VARCHAR(20), deptId int, salary double ); 方法2: -- 在定義字段之后再指定主鍵,語法格式如下: create table 表名 ( ... [constraint < 約束名 >] primary key [ 字段名] ); 方式 2- 實現(xiàn): create table emp2( eid INT, name VARCHAR(20), deptId INT, salary double, constraint pk1 primary key(id) );
添加多列主鍵(聯(lián)合主鍵)
語法: create table 表名( ... primary key (字段1,字段2,...,字段n) ); 實現(xiàn): create table emp3( name varchar(20), deptId int, salary double, primary key(name,deptId) );
通過修改表結(jié)構(gòu)添加主鍵
主鍵約束不僅可以在創(chuàng)建表的同時創(chuàng)建,也可以在修改表時添加。 語法; create table 表名 ( ... ); alter table < 表名 > add primary key (字段列表 ); 實現(xiàn): -- 添加單列主鍵 create table emp4( eid int, name varchar(20), deptId int, salary double, ); alter table emp4 add primary key ( eid);
刪除主鍵約束
格式: alter table <數(shù)據(jù)表名> drop primary key; 實現(xiàn): -- 刪除單列主鍵 alter table emp1 drop primary key; -- 刪除聯(lián)合主鍵 alter table emp5 drop primary key;
2.自增長約束
在 MySQL中,當(dāng)主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進行增長。
通過給字段添加 auto_increment 屬性來實現(xiàn)主鍵自增長
語法: 字段名 數(shù)據(jù)類型 auto_increment 實現(xiàn): create table t_user1( id int primary key auto_increment, name varchar(20) );
特點:
- 默認(rèn)情況下, auto_increment 的初始值是 1 ,每新增一條記錄,字段值自動加 1 。
- 一個表中只能有一個字段使用auto_increment 約束,且該字段必須有唯一索引,以避免序號重復(fù)(即為主鍵或 主鍵的一部分)。
- auto_increment約束的字段必須具備 NOT NULL 屬性。 auto_increment 約束的字段只能是整數(shù)類型( TINYINT 、SMALLINT 、 INT 、 BIGINT 等。
- auto_increment 約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達(dá)到上限, auto_increment 就會失效。
指定自增字段初始值
-- 方式 1 ,創(chuàng)建表時指定 create table t_user2 ( id int primary key auto_increment, name varchar(20) )auto_increment=100; --方式2,創(chuàng)建表之后指定 create table t_user3 ( id int primary key auto_increment, name varchar(20) ); alter table t_user2 auto_increment=100;
delete 和 truncate 在刪除后自增列的變化:
delete:數(shù)據(jù)之后自動增長從斷點開始
truncate:數(shù)據(jù)之后自動增長從默認(rèn)起始值開始
3.非空約束
語法: 方式 1 : < 字段名 >< 數(shù)據(jù)類型 > not null; 方式 2 : alter table 表名 modify 字段 類型 not null; 添加非空約束 --方法1,創(chuàng)建表時指定 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 : < 字段名 > < 數(shù)據(jù)類型 > unique 方式 2 : alter table 表名 add constraint 約束名 unique( 列 ); 添加唯一約束 - 方式 1 -- 創(chuàng)建表時指定 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.默認(rèn)約束
語法 方式 1 : < 字段名 > < 數(shù)據(jù)類型 > default < 默認(rèn)值 >; 方式 2: alter table 表名 modify 列名 類型 default 默認(rèn)值 ; 添加默認(rèn)約束 - 方式 1 create table t_user10 ( id int , name varchar(20) , address varchar(20) default ‘ 北京' -- 指定默認(rèn)約束 ); 添加默認(rèn)約束 - 方式 2 --alter table 表名 modify 列名 類型 default 默認(rèn)值 create table t_user11 ( id int , name varchar(20) , address varchar(20) ); alter table t_user11 modify address varchar(20) default ‘ 北京' ; 刪除默認(rèn)約束 -- alter table < 表名 > modify column < 字段名 > < 類型 > default null; alter table t_user11 modify column address varchar(20) default null;
6.零填充約束
- 插入數(shù)據(jù)時,當(dāng)該字段的值的長度小于定義的長度時,會在該值的前面補上相應(yīng)的 0
- zerofill 默認(rèn)為 int(10)
- 當(dāng)使用 zerofill 時,默認(rèn)會自動加 unsigned (無符號)屬性,使用 unsigned 屬性后,數(shù)值范圍 是原值的 2 倍,例如,有符號為 -128~+127 ,無符號為 0~256 。
代碼如下(示例):
create table t_user12 ( id int zerofill , -- 零填充約束 name varchar(20) ); 刪除 alter table t_user12 modify id int;
總結(jié)
以上是今天要講的內(nèi)容,學(xué)到了正則表達(dá)式和約束,包括正則表達(dá)式的字符和特殊字符,約束的分類,約束的作用,約束的用法。
到此這篇關(guān)于SQL正則表達(dá)式和約束使用的文章就介紹到這了,更多相關(guān)SQL正則表達(dá)式和約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript正則表達(dá)式下之相關(guān)方法
這篇文章主要介紹了JavaScript正則表達(dá)式下之相關(guān)方法 的相關(guān)資料,需要的朋友可以參考下2016-05-05js中exec、test、match、search、replace、split用法
exec、test、match、search、replace、split在JS中用的很頻繁,在網(wǎng)上看到對這些方法的總結(jié),就轉(zhuǎn)過來了,作個記錄2012-08-08用正則表達(dá)式判斷字符串是漢字還是拼音的js函數(shù)代碼
用正則表達(dá)式判斷字符串是漢字還是拼音的js函數(shù)代碼,需要的朋友可以參考下。2011-07-07日期校驗?/?時間校驗正則表達(dá)式深入解析(超實用!)
正則表達(dá)式可用于匹配各種模式,下面這篇文章主要給大家介紹了關(guān)于日期校驗/時間校驗正則表達(dá)式深入解析的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05