可以,空值和null不等。
冠縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
1、空值是不占用空間的
2、mysql中的NULL其實(shí)是占用空間的,下面是來(lái)自于MYSQL官方的解釋
“NULL columns require additional space in the row to record whether
their values are NULL. For MyISAM tables, each NULL column takes one bit
extra, rounded up to the nearest byte.”
3、NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”
這個(gè)算是我們最常使用的 我們?cè)趧?chuàng)建表的時(shí)候一般會(huì)選用ID做主鍵約束 主鍵約束用于唯一的標(biāo)識(shí)表中的每一行。被標(biāo)識(shí)為主鍵的數(shù)據(jù)在表中是唯一的且其值不能為空。這點(diǎn)類(lèi)似于我們每個(gè)人都有一個(gè)身份證號(hào),并且這個(gè)身份證號(hào)唯一,也就是我們的ID 全部都是不能重復(fù) 也就衍生出很多 主鍵的生成策略 UUID 雪花算法等等
提出問(wèn)題
問(wèn): 如果我們?cè)趧?chuàng)建的時(shí)候沒(méi)有去主動(dòng)設(shè)置一個(gè)主鍵約束怎么辦?MySQL數(shù)據(jù)表使用InnoDB作為存儲(chǔ)引擎的時(shí)候,數(shù)據(jù)結(jié)構(gòu)就是使用B+樹(shù),而數(shù)據(jù)本身存儲(chǔ)在主鍵索引上,也就是通常所說(shuō)的聚簇索引,也就是每個(gè)表都需要有個(gè)聚簇索引樹(shù),但是,在建表的時(shí)候卻發(fā)現(xiàn)可以不用指定主鍵,那么MySQL對(duì)于沒(méi)有指定主鍵的表示如何處理的呢?
回答:
既然InnoDB對(duì)數(shù)據(jù)的存儲(chǔ)必須依賴(lài)于主鍵,那么對(duì)于沒(méi)有創(chuàng)建主鍵的表,該怎么辦?
InnoDB對(duì)聚簇索引處理如下:
如果定義了主鍵,那么InnoDB會(huì)使用主鍵作為聚簇索引
如果沒(méi)有定義主鍵,那么會(huì)使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作為聚簇索引
如果既沒(méi)有主鍵也找不到合適的非空索引,InnoDB會(huì)自動(dòng)幫你創(chuàng)建一個(gè)不可見(jiàn)的、長(zhǎng)度為6字節(jié)的row_id,而且InnoDB 維護(hù)了一個(gè)全局的 dictsys.row_id,所以未定義主鍵的表都共享該row_id,每次插入一條數(shù)據(jù),都把全局row_id當(dāng)成主鍵id,然后全局row_id加1
很明顯,缺少主鍵的表,InnoDB會(huì)內(nèi)置一列用于聚簇索引來(lái)組織數(shù)據(jù)。而沒(méi)有建立主鍵的話就沒(méi)法通過(guò)主鍵來(lái)進(jìn)行索引,查詢(xún)的時(shí)候都是全表掃描,小數(shù)據(jù)量沒(méi)問(wèn)題,大數(shù)據(jù)量就會(huì)出現(xiàn)性能問(wèn)題。
但是,問(wèn)題真的只是查詢(xún)影響嗎?不是的,對(duì)于生成的ROW_ID,其自增的實(shí)現(xiàn)來(lái)源于一個(gè)全局的序列,而所以有ROW_ID的表共享該序列,這也意味著插入的時(shí)候生成需要共享一個(gè)序列,那么高并發(fā)插入的時(shí)候?yàn)榱吮3治ㄒ恍跃捅苊獠涣随i的競(jìng)爭(zhēng),進(jìn)而影響性能。
即便我們沒(méi)有去主動(dòng)創(chuàng)建一個(gè)主鍵約束 MySQL 數(shù)據(jù)庫(kù)也會(huì)創(chuàng)建幫我們?nèi)?chuàng)建一個(gè)
需要用的資料以鏈接的形式給需要的同學(xué)。
我用的mysql版本為: Mysql-5.5.45-win64.msi 密碼是:26zw
圖形化工具 Navicat(前期不推薦用,直接手動(dòng)敲): Navicat 密碼:c7fs
開(kāi)始我的MySQL之旅吧 始于2016.12.04
--WH
一、數(shù)據(jù)庫(kù)的安裝
這個(gè)就不在這里過(guò)多闡述了,因?yàn)榫W(wǎng)上實(shí)在是太多安裝mysql的教程了,有了我給的mysql,在按照這個(gè)安裝教程(MySQL安裝教程)去看,就能夠安裝完好。
安裝好mysql后,如果需要使用windows命令窗口(也就是cmd)來(lái)操作mysql,那么就需要配置環(huán)境變量,在安裝好的mysql下找到bin,將其目錄放到環(huán)境變量path中去,就行了,檢測(cè)成功與否的方法是在cmd命令窗口中輸入mysql,就會(huì)出現(xiàn)一大段英文,就說(shuō)明成功了,反之失敗,如果不會(huì)的話就去百度搜教程。
二、數(shù)據(jù)庫(kù)的基本操作
1、開(kāi)啟mysql服務(wù)命令
net start mysql
2、進(jìn)入mysql的兩種方式
明文進(jìn)入:mysql -uroot -proot格式:mysql -u帳號(hào) -p密碼
密文進(jìn)入:mysql -uroot -p 按enter會(huì)提示你輸入密碼(Enter pssword:),此時(shí)你寫(xiě)的密碼就會(huì)顯示為***這樣。
3、查看mysql中所有的數(shù)據(jù)庫(kù)(一般在固定的單詞命令就會(huì)是用大寫(xiě),這個(gè)要習(xí)慣,看多了敲多了就認(rèn)識(shí)了)
前面四個(gè)數(shù)據(jù)庫(kù)是mysql中自帶的,也就是必須的.
SHOW DATABASES;
4、創(chuàng)建名為test_1的數(shù)據(jù)庫(kù)
格式:CREATE DATABASE 數(shù)據(jù)庫(kù)名
CREATE DATABASE test_1;
5、刪除名為test_1的數(shù)據(jù)庫(kù)
格式:DROP DATABASE 數(shù)據(jù)庫(kù)名
DROP DATABASE test_1;
總結(jié):學(xué)習(xí)了對(duì)數(shù)據(jù)庫(kù)的三個(gè)操作,1、查看所有數(shù)據(jù)庫(kù) 2、創(chuàng)建數(shù)據(jù)庫(kù) 3、刪除數(shù)據(jù)庫(kù)
三、數(shù)據(jù)表的基本操作
數(shù)據(jù)表和數(shù)據(jù)庫(kù)還有Mysql三者的關(guān)系
mysql中保存了很多數(shù)據(jù)庫(kù)、一個(gè)數(shù)據(jù)庫(kù)中可以保存很多表。
對(duì)數(shù)據(jù)表的增(創(chuàng)建表)刪(刪除表)改(修改表字段)查(查詢(xún)表結(jié)構(gòu))。 注意:這里的操作對(duì)象是表,對(duì)表的操作也就是表的結(jié)構(gòu),和表中的字段的操作(字段和記錄要分清楚)
前提:表是在數(shù)據(jù)庫(kù)下的,所以要先確實(shí)使用哪個(gè)數(shù)據(jù)庫(kù)。
USE test_1;
1、創(chuàng)建數(shù)據(jù)表
格式:CREATE TABLE 數(shù)據(jù)表名(
字段名1數(shù)據(jù)類(lèi)型[列級(jí)別約束條件],
字段名2數(shù)據(jù)類(lèi)型[列級(jí)別約束條件],
字段名3數(shù)據(jù)類(lèi)型[列級(jí)別約束條件]
);
注意:格式不一定需要這樣隔著寫(xiě),完全可以全部寫(xiě)成一行。但是那樣寫(xiě)可觀性非常差。我這樣寫(xiě)只是為了可以看的更清晰。
解釋?zhuān)?/p>
1、[]中括號(hào)中的內(nèi)容表示可以有可以沒(méi)有,
2、列級(jí)別這個(gè)“列”一定要搞清楚說(shuō)的是什么,一張表中有行有列,列表示豎,行表示橫
3、約束條件后面會(huì)講到
1.1、創(chuàng)建沒(méi)有約束的student表
CREATE TABLE student( idINT(11), nameVARCHAR(12), ageINT(11) );
注釋?zhuān)篠HOW TABLES 查詢(xún)數(shù)據(jù)庫(kù)底下的所有表。
1.2、創(chuàng)建有約束的student表
六大約束:主鍵約束、外鍵約束、非空約束、唯一約束、默認(rèn)約束、自動(dòng)增加
1.2.1:主鍵約束
PRIMARY KEY(primary key):獨(dú)一無(wú)二(唯一)和不能為空(非空),通俗的講,就是在表中增加記錄時(shí),在該字段下的數(shù)據(jù)不能重復(fù),不能為空,比如以上面創(chuàng)建的表為例子,在表中增加兩條記錄,如果id字段用了主鍵約束。則id不能一樣,并且不能為空。一般每張表中度有一個(gè)字段為主鍵,唯一標(biāo)識(shí)這條記錄。以后需要找到該條記錄也可以同這個(gè)主鍵來(lái)確認(rèn)記錄,因?yàn)橹麈I是唯一的,并且非空,一張表中每個(gè)記錄的主鍵度不一樣,所以根據(jù)主鍵也就能找到對(duì)應(yīng)的記錄。而不是多條重復(fù)的記錄。如果沒(méi)有主鍵,那么表中就會(huì)存在很多重復(fù)的記錄,那么即浪費(fèi)存儲(chǔ)空間,在查詢(xún)時(shí)也消耗更多資源。
一般被主鍵約束了的字段度習(xí)慣性的稱(chēng)該字段為該表的主鍵
單字段主鍵約束
兩種方式都可以
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12),nameVARCHAR(12),
ageINT(11) ageINT(11),
); PRIMARY KEY(id) );
多字段主鍵約束(復(fù)合主鍵)
這個(gè)id和name都市主鍵,說(shuō)明在以后增加的插入的記錄中,id和name不能同時(shí)一樣,比如說(shuō)可以是這樣。一條記錄為id=1,name=yyy、另一條記錄為:id=1,name=zzz。 這樣是可以的。并不是你們所理解的兩個(gè)字段分別度不可以相同。
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12) PRIMARY KEY, nameVARCHAR(12),
ageINT(11) ageINT(11),
);PRIMARY KEY(id,name) );
1.2.2:外鍵約束
什么是外鍵舉個(gè)例子就清楚了,有兩張表,一張表是emp(員工)表,另一張表是dept(部門(mén))表,一個(gè)員工屬于一個(gè)部門(mén),那么如何通過(guò)員工能讓我們自己他在哪個(gè)部門(mén)呢?那就只能在員工表中增加一個(gè)字段,能代表員工所在的部門(mén),那該字段就只能是存儲(chǔ)dept中的主鍵了(因?yàn)橹麈I是唯一的,才能確實(shí)是哪個(gè)部門(mén),進(jìn)而代表員工所在的部門(mén),如果是部門(mén)名稱(chēng),有些部門(mén)的名稱(chēng)可能是同名。就不能區(qū)分了。),像這樣的字段,就符合外鍵的特點(diǎn),就可以使用外鍵約束,使該字段只能夠存儲(chǔ)另一張表的主鍵。如果不被外鍵約束,那么該字段就無(wú)法保證存儲(chǔ)進(jìn)來(lái)的值就一定是另一張表的主鍵值。
外鍵約束的特點(diǎn):
1、外鍵約束可以描述任意一個(gè)字段(包括主鍵),可以為空,并且一個(gè)表中可以有多個(gè)外鍵。但是外鍵字段中的值必須是另一張表中的主鍵。
2、這樣被外鍵關(guān)聯(lián)的兩種表的關(guān)系可以稱(chēng)為父子表或者主從表。子表(從表)擁有外鍵字段的表,父表(主表)被外鍵字段所指向的表。
3、子表被外鍵約束修飾的字段必須和父表的主鍵字段的類(lèi)型一樣。
注意:一個(gè)表中有被外鍵修飾的字段,就稱(chēng)該表有外鍵(是“有外鍵”。而不是“是外鍵”),并會(huì)給該表中的外鍵約束取一個(gè)名稱(chēng),所以我們常說(shuō)的這個(gè)表有沒(méi)有外鍵,指的不是被外鍵約束修飾的字段名,而是指這個(gè)表是否有存在外鍵約束。也就是說(shuō),不能說(shuō)這個(gè)表的外鍵是xxx(該表中被外鍵約束修飾的字段名),這種說(shuō)法是錯(cuò)誤的,但是大多數(shù)人已經(jīng)習(xí)慣了這樣,雖然影響不大,但是在很多時(shí)候需要理解一個(gè)東西時(shí),會(huì)造成一定的困擾。
格式:CONSTRAINT外鍵名稱(chēng)FOREIGN KEY(被外鍵約束的字段名稱(chēng))REFERENCES 主表名(主鍵字段)
英文解釋?zhuān)篊ONSTRAINT:約束REFERENCES:參考
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22),
location VARCHAR(50),
PRIMARY KEY(id)
);
CREATE TABLE tableB
(
id INT(11),
name VARCHAR(22) NOT NULL,
deptId INT(11),
PRIMARY KEY(id),
CONSTRAINT tableA_tableB_1 FOREIGH KEY(deptId) REFERENCES tableA(id)
);
解釋?zhuān)簍ableB中有一個(gè)名為tableA_tableB_1的外鍵關(guān)聯(lián)了tableA和tableB兩個(gè)表,被外鍵約束修飾的字段為tableB中的deptId,主鍵字段為tableA中的id
1.2.3:非空約束
NOT NULL. 被該約束修飾了的字段,就不能為空,主鍵約束中就包括了這個(gè)約束
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) NOT NULL,
location VARCHAR(50),
PRIMARY KEY(id)
);
1.2.4:唯一約束
UNIQUE 被唯一約束修飾了的字段,表示該字段中的值唯一,不能有相同的值,通俗點(diǎn)講,就好比插入兩條記錄,這兩條記錄中處于該字段的值不能是一樣的。
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) UNIQUE,
location VARCHAR(50),
PRIMARY KEY(id)
);
也就是說(shuō)在插入的記錄中,每條記錄的name值不能是一樣的。
1.2.5:默認(rèn)約束
Default 指定這一列的默認(rèn)值為多少,比如,男性同學(xué)比較多,性別就可以設(shè)置為默認(rèn)男,如果插入一行記錄時(shí),性別沒(méi)有填,那么就默認(rèn)加上男
CREATE TABLE table
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
deptId INT(11) DEFAULT 1111,
salary FLOAT
);
1.2.6:自動(dòng)增加
AUTO_INCREMENT 一個(gè)表只能一個(gè)字段使用AUTO_INCREMENT,并且使用這個(gè)約束的字段只能是整數(shù)類(lèi)型(任意的整數(shù)類(lèi)型 TINYINT,SMALLIN,INT,BIGINT),默認(rèn)值是1,也就是說(shuō)從1開(kāi)始增加的。一般就是給主鍵使用的,自動(dòng)增加,使每個(gè)主鍵的值度不一樣,并且不用我們自己管理,讓主鍵自己自動(dòng)生成
CREATE TABLE table ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(22) NOT NULL );
2、查詢(xún)表結(jié)構(gòu)
2.1、查看表基本結(jié)構(gòu)語(yǔ)句
格式1:DESCRIBE 表名/DESC 表名這兩個(gè)的功能是一樣的,簡(jiǎn)寫(xiě)了單詞describe
DESCRIBE student;
2.2、查看創(chuàng)建表的語(yǔ)句
格式:SHOW CREATE TABLE 表名
SHOW CREATE TABLE student;
這樣顯示的格式很不好,看不清楚,所以有了下面這個(gè)語(yǔ)句
格式:SHOW CREATE TABLE 表名\G
SHOW CREATE TABLE student\G;
3、修改數(shù)據(jù)表
修改數(shù)據(jù)表包括:對(duì)表中字段的增加、刪除、修改。 在這個(gè)里面用的關(guān)鍵字為 ALTER
3.1、修改表名
格式:ALTER TABLE舊表名 RENAME[TO]新表名;
將student表名改為student1(改完后在改回來(lái))
ALTER TABLE student RENAME TO student1;
3.2、修改表中的字段名
格式:ALTER TABLE表名 CHANGE舊字段名新字段名新數(shù)據(jù)類(lèi)型
將student表中的name字段名改為 username
ALTER TABLE student CHANGE name username VARCHAR(30);
3.3、修改表中的數(shù)據(jù)類(lèi)型
格式:ALTER TABLE表名 MODIFY字段名數(shù)據(jù)類(lèi)型
ALTER TABLE student MODIFY username VARCHAR(20);
解釋?zhuān)褐荒苄薷淖侄蚊臄?shù)據(jù)類(lèi)型,但是其原理跟上面change做的事情一樣,這里也有修改字段名的過(guò)程,只不過(guò)修改后的字段名和修改前的字段名相同,但是數(shù)據(jù)類(lèi)型不一樣。
3.4、修改字段的排列位置
方式1:ALTER TABLE表名 MODIFY字段1數(shù)據(jù)類(lèi)型 FIRST|AFTER字段2
解釋?zhuān)簩⒆侄?的位置放到第一,或者放到指定字段2的后面
ALTER TABLE student MODIFY username VARCHAR(20) AFTER age;
方式2:ALTER TABLE表名 CHANGE字段1字段2數(shù)據(jù)類(lèi)型 FIRST|AFTER字段3
解釋?zhuān)浩鋵?shí)是一樣的,將是字段2覆蓋字段1,然后在進(jìn)行排序
ALTER TABLE student CHANGE username username VARCHAR(20) AFTER age;
總結(jié)
CHANGE和MODIFY的區(qū)別?
原理都市一樣的,MODIFY只能修改數(shù)據(jù)類(lèi)型,但是CHANGE能夠修改數(shù)據(jù)類(lèi)型和字段名,也就是說(shuō)MODIFY是CHANGE的更具體化的一個(gè)操作??赡苡X(jué)得用CHANGE只改變一個(gè)數(shù)據(jù)類(lèi)型不太爽,就增加了一個(gè)能直接改數(shù)據(jù)類(lèi)型的使用關(guān)鍵字MODIFY來(lái)操作。
3.5、添加字段
格式:ALTER TABLE表名稱(chēng) ADD新字段名數(shù)據(jù)類(lèi)型[約束條件][FIRST|AFTER已存在的表名]
解釋?zhuān)涸谝粋€(gè)特定位置增加一個(gè)新的字段,如果不指定位置,默認(rèn)是最后一個(gè)。
ALTER TABLE student ADD sex VARCHAR(11);
3.6、刪除字段
格式:ALTER TABLE表名稱(chēng) DROP字段名;
ALTER TABLE student DROP sex;
3.7、刪除表的外鍵約束
格式:ALTER TABLE表名稱(chēng) DROP FOREIGN KEY外鍵約束名
注意:外鍵約束名 指的不是被外鍵約束修飾的字段名,切記,而是我們?cè)趧?chuàng)建外鍵約束關(guān)系時(shí)取的名字。
3.8、更改表的存儲(chǔ)引擎
格式:ALTER TABLE表名 ENGINE=更改后的存儲(chǔ)引擎名
這個(gè)存儲(chǔ)引擎目前我自己也不太清楚,雖然知道有哪幾種引擎,但是稍微深入一點(diǎn)就不清楚了,所以打算留到日后在說(shuō)。
4、刪除表
4.1、刪除無(wú)關(guān)聯(lián)表
格式:DROP TABLE表名;
ALTER TABLE student;
4.2、刪除被其他表關(guān)聯(lián)的主表
這個(gè)是比較重要的一點(diǎn),在有外鍵關(guān)聯(lián)關(guān)系的兩張表中,如果刪除主表,那么是刪不掉的,并且會(huì)報(bào)錯(cuò)。因?yàn)橛袕埍硪蕾?lài)于他。那怎么辦呢?針對(duì)這種情況,總共有兩種方法
1、先刪除你子表,然后在刪除父表,這樣就達(dá)到了刪除父表的目的,但是子表也要被刪除
2、先解除外鍵關(guān)系,然后在刪除父表,這樣也能達(dá)到目的,并且保留了子表,只刪除我們不需要的父表。在3.7中就講解了如何刪除外鍵關(guān)系。
ALTER TABLE 銷(xiāo)售商表
CHANGE address address VARCHAR( 64 ) CHARACTER SET utf8 NOT NULL DEFAULT '華中'