帶你瞭解什麼是MySQL數據庫(三)

模糊查詢


可以根據大致提供的內容,找到我們想要的數據,它與=查詢不同,拿char類型數據和varchar類型數據舉例:

create table c1(x char(10));
create table c2(x varchar(10));

insert c1 values('io');
insert c2 values('io');

模糊查詢使用到的是like

select * from c1 where x like 'io';
select * from c2 where x like 'io';

在這裏插入圖片描述
可以發現,c1裏面的x爲char類型,我們通過模糊查詢是否有io這個數據,無法顯示出來,而我們通過=卻可以查詢出來

在這裏插入圖片描述
模糊查詢比較精準,這種方式查詢,必須要輸入這個字段的全部內容,纔可以查詢出來,而這裏char類型存儲的數據,長度不滿10爲,所以使用了空格補充,所以查詢的時候,需要把空格帶上纔可以;
在這裏插入圖片描述
我們也可以使用模糊查詢提供給我們的查詢方式,% 表示任意0個或多個字符。


select * from c1 where x like 'io%';

在這裏插入圖片描述
如果我們只知道第二位是一個o,不知道開頭和結尾,可以使用:_ 表示任意單個字符,再配合%匹配後面的多個字符

select * from c1 where x like '_o%';

在這裏插入圖片描述
SQL模糊查詢的語法爲
“SELECT column FROM table WHERE column LIKE ‘;pattern’;”。

SQL提供了四種匹配模式:

  1. % 表示任意0個或多個bai字符。如下語句:
    SELECT * FROM user WHERE name LIKE ‘;%三%’;
    將會把name爲“張三”,“三腳貓”,“唐三藏”等等有“三”的全找出來;

  2. _ 表示任意單個字符。語句:
    SELECT * FROM user WHERE name LIKE ‘;’;
    只找出“唐三藏”這樣name爲三個字且中間一個字是“三”的;
    SELECT * FROM user WHERE name LIKE ‘;三__’;
    只找出“三腳貓”這樣name爲三個字且第一個字是“三”的;



  3. []表示括號內所列字符中的一個(類似與正則表達式)。語句:
    SELECT * FROM user WHERE name LIKE ‘;[張李王]三’;
    將找出“張三”、“李三”、“王三”(而不是“張李王三”);
    如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫爲“0-4”、“a-e”
    SELECT * FROM user WHERE name LIKE ‘;老[1-9]’;
    將找出“老1”、“老2”、……、“老9”;
    如要找“-”字符請將其放在首位:’;張三[-1-9]’;





  4. [^ ] 表示不在括號所列之內的單個字符。語句:
    SELECT * FROM user WHERE name LIKE ‘;[^張李王]三’;
    將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
    SELECT * FROM user WHERE name LIKE ‘;老[^1-4]’;
    將排除“老1”到“老4”尋找“老5”、“老6”、……、“老9”。




表的約束


介紹:

  • 約束條件與數據類型的寬度一樣,都是可選參數

  • 作用:用於保證數據的完整性和一致性

主要分爲:

PRIMARY KEY (PK)    標識該字段爲該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK)    標識該字段爲該表的外鍵
NOT NULL    標識該字段不能爲空
UNIQUE KEY (UK)    標識該字段的值是唯一的
AUTO_INCREMENT    標識該字段的值自動增長(整數類型,而且爲主鍵)
DEFAULT    爲該字段設置默認值

UNSIGNED 無符號
ZEROFILL 使用0填充

not null:字面意思就說明了,設置後,每次插入值時,必須爲該字段設置值

default:如果沒有爲該字段設置值,則使用我們定義在default後面的一個默認值

UNIQUE KEY:某個字段設置這個約束後,那麼它設置的值,在整個表中這個字段只能存在一個(唯一)

PRIMARY KEY:主鍵primary key是innodb存儲引擎組織數據的依據,innodb稱之爲索引組織表,一張表中必須有且只有一個主鍵。主鍵是能確定一條記錄的唯一標識

AUTO_INCREMENT:當設置以後,每次向表插入值時,這個字段會自動增長一個數字,但是這個字段必須是整數類型,而且還要是主鍵

FOREIGN KEY:外鍵,將該表的某個字段關聯另一張表的某個字段,關聯後這個字段的值必須對應關聯字段的值。

我們創建表,通常會有一個id字段作爲索引標識作用,並且會將它設置爲主鍵和自增。

實例:

create table test(
    id int primary key auto_increment,
    identity varchar(18) not null unique key, --身份證必須唯一
    gender varchar(18) default '男');

insert test(identity) values('123456789012345678');

在這裏插入圖片描述
當身份字段插入相同值,則會報錯,因爲字段設置了唯一值
在這裏插入圖片描述

insert test(identity,gender) values('0123456789012345678','女');

在這裏插入圖片描述
我們會發現,id不對勁啊,那是因爲筆者之前進行兩次插入值操作,但是值並沒有成功插入進去,但是這個自增卻受到了影響.

這個時候,我們進行兩部操作就可以解決這個問題。

alter table test drop id;
alter table test add id int primary key auto_increment first;

刪除id字段,再重新設置。
在這裏插入圖片描述
很神奇是不是,這個MySQL的底層機制。vary 良心

還需要注意的是:我們使用delete刪除一條記錄時,並不會影響自增

delete from test where id = 2;
insert test(identity,gender) values('111111111111111111','男');

在這裏插入圖片描述
關於這個操作,如果我們只是刪除單條記錄的話,可以使用上序提供的方法還調整自增的值,而如果是刪除整個表記錄的話,使用以下方法:

truncate test;

效果演示:delete刪除整個表記錄
在這裏插入圖片描述
效果演示:truncate刪除整個表記錄
在這裏插入圖片描述


聯合主鍵

確保設置爲主鍵的某幾個字段的數據相同

主鍵的一個目的就是確定數據的唯一性,它跟唯一約束的區別就是,唯一約束可以有一個NULL值,但是主鍵不能有NULL值,再說聯合主鍵,聯合主鍵就是說,當一個字段可能存在重複值,無法確定這條數據的唯一性時,再加上一個字,兩個字段聯合起來確定這條數據的唯一性。比如你提到的id和name爲聯合主鍵,在插入數據時,當id相同,name不同,或者id不同,name相同時數據是允許被插入的,但是當id和name都相同時,數據是不允許被插入的。

實例:

create table test(
    id int,
    name varchar(10),
    primary key(id,name));
    
insert test values(1,1);

在這裏插入圖片描述
如果再次插入兩個主鍵相同的數據,則會報錯
在這裏插入圖片描述
只要設置主鍵的兩個字段,在一條記錄內,數據不完全相同就沒有問題。
在這裏插入圖片描述



外鍵的話,我們在表之間的關聯進行演示


表之間的關聯


我們這裏先介紹表之間的關聯,後面再學習聯表查詢

通過某一個字段,或者通過某一張表,將多個表關聯起來。

我們一張表處理好不行嗎,爲什麼要關聯,像這樣?
在這裏插入圖片描述
有沒有發現一個問題,有些員工它們對應的是相同部門,一張表就重複了很多次記錄,隨着員工數量的增加,就會出現越來越多個重複記錄,相對更佔用空間了。

那麼我們需要將部門單獨使用一張表,再將員工這個使用一個字段關聯到另一個表內,我們可以使用外鍵,也可以不使用外鍵,先來演示外鍵的好處吧


多對一關聯


如:多個員工對應一個部門。

員工表,先別急着創建,請向下看

create table emp(
	id int primary key auto_increment,
	name varchar(10) not null,
	dep_id int,
	foreign key(dep_id) references dep(id) 
	on update cascade   # 級聯更新
	on delete cascade); # 級聯刪除

上面外鍵的作用就是:

dep_id字段關聯了dep表的id字段:
當dep表的id字段值修改後,該表的dep_id字段下面如果有和dep表id相同值的則會一起更改。
如果dep表刪除了某一條記錄,當emp表的dep_id與dep表刪除記錄的id值對上以後,emp表這條記錄也會被隨之刪除。

注意:必須是外鍵已存在,所以需要先創建部門表,再創建員工表

部門表

create table dep(
	id int primary key auto_increment,
	name varchar(16) not null unique key,
	task varchar(16) not null);

emp表的dep_id字段設置的數據必須是dep表已存在的id

所以我們需要先向dep表插入記錄

insert dep(name,task) values('IT','技術'),('HR','招聘'),('sale','銷售');

員工表插入記錄

insert emp(name,dep_id) values
	('jack',1),
	('tom',2),
	('jams',1),
	('rouse',3),
	('curry',2);
	# ('go',4) 報錯,在關聯外鍵的id字段中找不到

注意:如果我們emp表的dep_id字段插入的數據,在dep表中的id字段不存在該數據時,就會報錯。

查詢我們創建後的效果
在這裏插入圖片描述
這樣就把這兩個表關聯起來了,目前我們先不瞭解多表查詢,這個先了解的是,表之間的關聯。

我們再來看一下同步更新以及刪除,外鍵的改動被關聯表會受到影響

update dep set id=33333 where id = 3;

在這裏插入圖片描述
再來體驗一下同步刪除

delete from dep where id = 33333;

在這裏插入圖片描述
這就是外鍵帶給我們的效果,有利也有弊:

  • 優點:關聯性強,只能設置已存在的內容,並且同步更新與刪除
  • 缺點:當刪除外鍵表的某一條記錄,關聯表中有關聯性的記錄會被全部刪除

多對多關聯


多張表互相關聯

如:一個作者可以寫多本書,一本書也可以有多個作者,雙向的一對多,即多對多

這時使用外鍵會出現一個弊端,那就是先創建哪張表呢?它們都互相對應,是不是很矛盾呢?解決辦法:第三張表,關聯書的id與作者的id

book表

create table book(
	id int primary key auto_increment,
	name varchar(30));

author表

create table author(
	id int primary key auto_increment,
	name varchar(30));

中間表:負責將兩張表進行關聯

create table authorRbook(
	id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade);

多名作者關聯一本書,或者一名作者關聯多本書,書也要體現出誰關聯了它

book表插入數據:

insert book(name) values
	('鬥破蒼穹'),
	('斗羅大陸'),
	('武動乾坤');

author表插入數據:

insert author(name) values
	('jack'),
	('tom'),
	('jams'),
	('rouse'),
	('curry'),
	('john');

關聯表插入數據:

insert authorRbook(author_id,book_id) values
	(1,1),
	(1,2),
	(1,3),
	(2,1),
	(2,3),
	(3,2),
	(4,1),
	(5,1),
	(5,3),
	(6,2);

目前的對應關係就是:

jack:鬥破蒼穹、斗羅大陸、武動乾坤
tom:鬥破蒼穹、武動乾坤
jams:斗羅大陸
rouse:鬥破蒼穹
curry:鬥破蒼穹、武動乾坤
jhon:斗羅大陸




一個作者可以產於多本書的編寫,同時,每本書都會標明產於的作者


一對一關聯


路人有可能變成某個學校的學生,即一對一關係。

在這之前,路人不屬於學校。

原理就是:學校通過廣告,或者通過電話邀請,將路人變成了學生。

路人表

create table passers_by(
	id int primary key auto_increment,
	name varchar(10),
	age int);
	
insert passers_by(name,age) values
	('jack',18),
	('tom',19),
	('jams',23);

學校表

create table school(
	id int primary key auto_increment,
	class varchar(10),
	student_id int unique key,
	foreign key(student_id) references passers_by(id)
	on update cascade
	on delete cascade
);
insert school(class,student_id) values
	('Mysql入門到放棄',1),
	('Python入門到運維',3),
	('Java從入門到音樂',2);

數據存儲的設計,需要提前設計好表的關聯 關係,將關係全部設計好以後,剩下的只是往裏存數據了,後續我們會了解到聯表查詢相關內容,將有關聯性的內容,以虛擬表的形式查詢出來,查詢出來的數據可能來自多個表。


表的關聯,建議使用以下方式

  • 多對多 > 多對一 > 一對一

技術小白記錄學習過程,有錯誤或不解的地方請指出,如果這篇文章對你有所幫助請點贊 收藏+關注 子夜期待您的關注,謝謝支持!








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章