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