摘要:代表數(shù)據(jù)管理系統(tǒng),是一種系統(tǒng)軟件,提供操作數(shù)據(jù)庫的環(huán)境,如,可以通過數(shù)據(jù)庫管理系統(tǒng)對數(shù)據(jù)進(jìn)行增刪改查。命令服務(wù)啟動(dòng)和停止連接和退出數(shù)據(jù)庫代表主機(jī)名,代表端口號,和分別代表當(dāng)前服務(wù)的賬號和密碼。添加默認(rèn)約束將表列的默認(rèn)值設(shè)置為北京。
MySQL 是目前使用最廣泛的關(guān)系型數(shù)據(jù)庫,是在軟件開發(fā)中所必備的技能之一,這是關(guān)于 MySQL 的系列文章,將從 MySQL 的基本概念、基本使用、SQL 語句、函數(shù)、聚合函數(shù)、表連接以及表設(shè)計(jì)等多方面對 MySQL 進(jìn)行總結(jié),而本篇是數(shù)據(jù)庫基礎(chǔ)部分,大多都是一些概念性的內(nèi)容和表的創(chuàng)建,數(shù)據(jù)庫博大精深,本系列文章內(nèi)容較淺,適合于前端的同學(xué)們對 MySQL 的入門,當(dāng)然這也是我的學(xué)習(xí)筆記,希望可以幫助大家。
MySQL 的特點(diǎn):開源免費(fèi)、性能高、安裝使用簡單。
MySQL 的作用:
存儲大量數(shù)據(jù),方便檢索和訪問;
保持?jǐn)?shù)據(jù)信息的一致、完整;
實(shí)現(xiàn)數(shù)據(jù)的共享和安全;
通過組合分析產(chǎn)生新的有用信息。
實(shí)體:只要是客觀存在,能夠被描述出來的都是實(shí)體,每一條數(shù)據(jù)都是一個(gè)實(shí)體。
DB:是數(shù)據(jù)庫的意思,就是存儲數(shù)據(jù)的倉庫,可以存放結(jié)構(gòu)化的數(shù)據(jù)。
DBMS:代表數(shù)據(jù)管理系統(tǒng),是一種系統(tǒng)軟件,提供操作數(shù)據(jù)庫的環(huán)境,如 Navicat for MySQL,可以通過數(shù)據(jù)庫管理系統(tǒng)對數(shù)據(jù)進(jìn)行增、刪、改、查。
SQL:結(jié)構(gòu)化查詢語言,專門用來和數(shù)據(jù)庫進(jìn)行交流的語言,幾乎所有的 DBMS 都支持 SQL。
數(shù)據(jù)表:
表是數(shù)據(jù)庫中包含所有數(shù)據(jù)的數(shù)據(jù)庫對象,也是其他對象的基礎(chǔ);
表定義是一個(gè)集合,數(shù)據(jù)在表中是按行和列的格式組織的,用來存放數(shù)據(jù);
行被稱為記錄,用來存放一個(gè)實(shí)體,列稱為字段用來描述實(shí)體的某一個(gè)屬性。
在 MySQL 的默認(rèn)安裝目錄中 my.ini 文件是專門用來配置的,常用配置項(xiàng)如下:
port:端口號;
basedir:安裝目錄;
datadir:數(shù)據(jù)存放目錄
charcter-set-server:字符集;
default-storage-engine:存儲引擎;
sql-mode:語法模式;
max-connections:最大連接數(shù)。
2、MySQL 命令MySQL 服務(wù)啟動(dòng)和停止:
net start MySQL net stop MySQL
連接和退出數(shù)據(jù)庫:
mysql -h 127.0.0.1 -P 3306 -uroot -p123456 exit
-h 代表主機(jī)名,-p 代表端口號,-u 和 -p 分別代表當(dāng)前 MySQL 服務(wù)的賬號和密碼。
查看當(dāng)前 MySQL 中的數(shù)據(jù)庫:
show dbs; show database;
切換數(shù)據(jù)庫:
use dataname;
查看數(shù)據(jù)庫的表:
show tables; show tables from mysql;
查看當(dāng)前所在的數(shù)據(jù)庫:
select database();
查詢表結(jié)構(gòu):
desc tablename;
數(shù)據(jù)完整性是指,數(shù)據(jù)庫種所有數(shù)據(jù)值均為正確狀態(tài),如果數(shù)據(jù)存儲有不正確的的數(shù)據(jù)值,則該數(shù)據(jù)庫喪失數(shù)據(jù)完整性,為了實(shí)現(xiàn)數(shù)據(jù)完整性,需要檢驗(yàn)數(shù)據(jù)庫表中每行每列的數(shù)據(jù)是否符合要求,在創(chuàng)建表時(shí),應(yīng)該保證以后輸入的數(shù)據(jù)都是正確的,錯(cuò)誤的數(shù)據(jù)不允許輸入。
1、域(列)完整性域完整性是對數(shù)據(jù)表中字段屬性的約束,通常指數(shù)據(jù)的有效性,它包括字段的值域、字段的類型及字段的有效規(guī)則等約束,它是由確定關(guān)系結(jié)構(gòu)時(shí)所定義的字段的屬性決定的,如關(guān)于年齡的字段,數(shù)據(jù)類型應(yīng)為 int,關(guān)于普通的字符串值得類型應(yīng)該為 varchar 等等,并在規(guī)定值類型時(shí)相應(yīng)得規(guī)定值的長度,即所占的字節(jié)數(shù)。
數(shù)據(jù)類型圖如下:
數(shù)值類型整數(shù)型:
tinyint:存儲所占 1 字節(jié),無符號可以存儲 0 ~ 255,有符號可以存儲 -128 ~ 127;
smallint:存儲所占 2 字節(jié),無符號可以存儲 0 ~ 65535,有符號可以存儲 -32768 ~ 32767;
mediumint:存儲所占 3 字節(jié),無符號可以存儲 0 ~ 16777215,有符號可以存儲 -8388608 ~ 8388607;
int:存儲所占 4 字節(jié),無符號可以存儲 0 ~ 4294967295,有符號可以存儲 -2147483648 ~ 2147483647;
bigint:存儲所占 8 字節(jié),無符號可以存儲 0 ~ 18446744073709551615,有符號可以存儲 -9223372036854775808 ~ 9223372036854775807。
上面的整數(shù)型用來規(guī)定字段存儲的數(shù)據(jù)必須為整數(shù),從上到下需要占用的空間越來越多,能表示的數(shù)字也越來越大,定義字段時(shí)選擇滿足需求的數(shù)字范圍即可。
數(shù)值類型小數(shù)型:
float:單精度浮點(diǎn)型,存儲所占 4 字節(jié),數(shù)值范圍為 -3.4E38 ~ 3.4E38,7 個(gè)有效位;
double:雙精度浮點(diǎn)型,存儲所占 8 字節(jié),數(shù)值范圍為 -1.7E308~1.7E308,15 個(gè)有效位;
decimal:定點(diǎn)型,存儲所占 16 字節(jié),28 個(gè)有效位,不存在精度損失,常用于銀行賬目計(jì)算。
數(shù)值存儲范圍越小,精度越高,范圍越大,精度越不準(zhǔn)確,既要求精度,又固定小數(shù)點(diǎn)位數(shù)的數(shù)值存儲,建議使用 decimal,優(yōu)點(diǎn)在于可以自定義小數(shù)點(diǎn)位數(shù),精度高,特殊情況,數(shù)值范圍巨大,只能使用 float 類型,該類型一般不建議使用。
字符串類型:
set:存儲字符串對象,最多包含 64 個(gè)元素,并且可以取到集合中任意元素;
enum:存儲字符串對象,最多包含 65536 個(gè)元素,只能取到集合中一個(gè)元素;
blob:用于存儲二進(jìn)制字符串,有子類型;
text:用于存儲大文本,有子類型;
char:定長,最大 255 字節(jié),存儲空間未滿,會在數(shù)據(jù)右側(cè)填充空格;
varchar:不定長,最大 65536 字節(jié),當(dāng)長度小于 4 時(shí),會自動(dòng)轉(zhuǎn)換成 char。
上面類型中最常用的為 varchar 可以根據(jù)字段內(nèi)容的自定義長度。
時(shí)間類型:
year:yyyy 格式表示的年份值;
timestamp:yyyymmddhhmmss 格式表示的時(shí)間戳;
time:hh:mm:ss 格式表示的時(shí)間值;
date:yyyy-mm-dd 格式表示的日期值;
datetime:yyyy-mm-dd hh:mm:ss 格式表示的日期和時(shí)間。
默認(rèn)值:默認(rèn)值是指如果某個(gè)字段沒有指定值的情況下,會為該字段指定一個(gè)預(yù)先設(shè)定的值。
非空約束:我們可以指定某個(gè)字段不能不輸入,必須提供一個(gè)非空的值,即不能為 null。
2、實(shí)體(行)完整性實(shí)體完整性是對關(guān)系中的記錄唯一性,也就是主鍵的約束,準(zhǔn)確地說,實(shí)體完整性是指關(guān)系中的主屬性值不能為 null 且不能有相同值,定義表中的所有行唯一的標(biāo)識,一般用主鍵。
主鍵:表中一列或者幾列組合的值能用來唯一標(biāo)識表中的每一行,這樣的列或者列組合稱為表的主鍵,主鍵表的數(shù)據(jù)不能重復(fù),如果兩列或者多列組合起來唯一標(biāo)識表中的每一行,則該主鍵又稱為 “組合主鍵”。
主鍵的選擇標(biāo)準(zhǔn):
最少性:盡量選擇單個(gè)鍵作為主鍵;
穩(wěn)定性:由于主鍵是用來在兩個(gè)表之間建立關(guān)聯(lián)的,不能經(jīng)常更新或者說一般不更新,所以最好選擇無意義的列作為主鍵,如各種 id 值。
3、引用完整性引用完整性意思是對關(guān)系型數(shù)據(jù)庫中建立關(guān)聯(lián)關(guān)系的數(shù)據(jù)表之間數(shù)據(jù)參照引用的約束,也就是對外鍵的約束,準(zhǔn)確地說,是指關(guān)系中的外鍵必須是另一個(gè)關(guān)系的主鍵有效值,或者是 null,參考完整性,維護(hù)表間數(shù)據(jù)的有效性,完整性,通常通過建立外部鍵聯(lián)系另一張關(guān)聯(lián)表的主鍵實(shí)現(xiàn)。
外鍵:用于連接兩張表的字段稱為外鍵,屬于外鍵表,通常要關(guān)聯(lián)的主鍵表的字段作為外鍵,保證了引用完整性。
外鍵約束:外鍵表的外鍵必須引用主鍵表的主鍵,主表沒有記錄。
如果一個(gè)表的外鍵引用了一個(gè)表的主鍵會有以下限制:
在外鍵表里不能添加主鍵表里沒有的數(shù)據(jù),外鍵表的數(shù)據(jù)與主鍵表的數(shù)據(jù)必須通過外鍵一一對應(yīng);
要想刪除主鍵表的數(shù)據(jù)必須刪除所有外鍵表的數(shù)據(jù)。
唯一約束:唯一約束是指某個(gè)字段值是唯一的,在所有的記錄中不能有重復(fù)的值,如某個(gè)人的身份證號,需將外鍵的索引類型設(shè)置為 Unique。
標(biāo)識列:當(dāng)表中沒有適合做主鍵的列時(shí),此時(shí)創(chuàng)建作為主鍵的無意義列稱為標(biāo)識列,標(biāo)識列的值是自動(dòng)生成的,不能輸入修改,且是自增的,可以設(shè)置每次的增量,具有 “斷號保留” 的特性,當(dāng)某一個(gè)實(shí)體被刪除時(shí),該標(biāo)識列的值是永久保存的,其他新增實(shí)體會在這個(gè)標(biāo)識列的基礎(chǔ)上繼續(xù)自增。
我們可以通過兩種方式創(chuàng)建表,可以使用 DDL(data defintion language)數(shù)據(jù)定義語言來創(chuàng)建,也可以使用 DBMS 數(shù)據(jù)管理系統(tǒng)來創(chuàng)建,使用 DBMS 還是很方便的,而且也是最常用的方式,但 DDL 創(chuàng)建方式我們不得不說,就是通過代碼的方式來實(shí)現(xiàn)表的創(chuàng)建和操作,因?yàn)檫@是最原始的方式,即使圖形化的操作會更方便,我們也應(yīng)該了解。
1、SQL 規(guī)范SQL 語句的規(guī)范如下:
SQL 語句不區(qū)分大小寫,建議 SQL 關(guān)鍵字大寫,表名和列表小寫;
命令用分號結(jié)尾;
命令可以縮進(jìn)和換行,一種類型的關(guān)鍵字放在一行;
可以寫單行和多行注釋 , # 和 -- 是單行注釋, /*/ 是多行注釋。
2、使用 DDL 操作表在 DBMS 中的查詢編輯器可以代替命令行實(shí)現(xiàn)命令的編寫,為了視覺效果,我們都使用 Navicat for MySQL 的查詢編輯器,操作界面如下圖。
(1) 創(chuàng)建表創(chuàng)建表 student,創(chuàng)建一個(gè)標(biāo)識列 id 不為空,設(shè)為主鍵并自增,創(chuàng)建 name 列,varchar 類型,64 位,不為空,創(chuàng)建 age 列,int 類型,不為空,創(chuàng)建 city 列,varchar 類型,32 位,默認(rèn)值為 “北京”。
CREATE TABLE `student` ( `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, `age` INT NOT NULL, `city` VARCHAR(32) DEFAULT "北京" );(2) 操作表的列
給上面的表 student 增加 idcard 列,值為空,將 idcard 列類型大小修改為 32 位,添加 province 列,插入到 city 列前面,查詢表結(jié)構(gòu),刪除 idcard 列,刪除表 student。
ALTER TABLE `student` ADD COLUMN `idcard` VARCHAR(18) NULL; ALTER TABLE `student` MODIFY COLUMN `idcard` VARCHAR(32) NULL; ALTER TABLE `student` ADD COLUMN `province` VARCHAR(32) AFTER `age`; DESC `student`; ALTER TABLE `student` DROP COLUMN `idcard`; DROP TABLE `student`;(3) 添加主鍵約束
重新創(chuàng)建上面的 student 表,city 不設(shè)置默認(rèn)值,不添加主鍵約束和標(biāo)識列,再通過命令添加主鍵約束。
CREATE TABLE `student` ( `id` INT NOT NULL, `name` VARCHAR(64) NOT NULL, `age` INT NOT NULL, `city` VARCHAR(32) ); ALTER TABLE `student` ADD PRIMARY KEY(id);(4) 添加唯一約束
將上面我們 student 表中的 idcard 列再加回來,給 idcard 列添加唯一約束,外鍵名為 uq_idcard。
ALTER TABLE `student` ADD COLUMN `idcard` VARCHAR(18) NULL; ALTER TABLE `student` ADD UNIQUE INDEX uq_idcard(`idcard`);(5) 添加默認(rèn)約束
將 student 表 city 列的默認(rèn)值設(shè)置為 “北京”。
ALTER TABLE `student` MODIFY COLUMN `city` VARCHAR(64) DEFAULT "北京";(6) 添加外鍵約束
創(chuàng)建一個(gè)子表 score,添加 student_id 列,添加外鍵 fk_student_id,將 student_id 與 student 表的主鍵 id 相關(guān)聯(lián),此時(shí) student 為主表(主鍵表),score 為子表(外鍵表)。
CREATE TABLE `score` ( `student_id` INT ); ALTER TABLE `score` ADD CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`);
注意:在項(xiàng)目中一般不會添加這個(gè)約束,因?yàn)樵陂_發(fā)時(shí)會頻繁操作表和修改數(shù)據(jù),會經(jīng)常報(bào)錯(cuò),非常麻煩,不添加這個(gè)約束并不影響數(shù)據(jù)的檢索和修改。
(7) 刪除約束刪除 score 表與 student 表的外鍵約束,即刪除外鍵 fk_student_id。
ALTER TABLE `score` DROP FOREIGN KEY `fk_student_id`;3、使用 DDL 創(chuàng)建一個(gè)完整的表關(guān)系
完整的表關(guān)系圖如下:
DDL 命令如下:
-- 創(chuàng)建表 student CREATE TABLE `student` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `idcard` VARCHAR(18) DEFAULT NULL, `age` INT(11) DEFAULT NULL, `city` VARCHAR(50) DEFAULT "北京", PRIMARY KEY (`id`) ); -- 創(chuàng)建表 course CREATE TABLE `course` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) DEFAULT NULL, PRIMARY KEY (`id`) ); -- 創(chuàng)建表 score,并添加外鍵約束 CREATE TABLE `score` ( `student_id` INT(11) NOT NULL DEFAULT "0", `course_id` INT(11) NOT NULL DEFAULT "0", `grade` FLOAT DEFAULT NULL, PRIMARY KEY (`student_id`, `course_id`), KEY `fk_courseid` (`course_id`), CONSTRAINT `fk_courseid` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`), CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在實(shí)際開發(fā)當(dāng)中使用 DDL 對表的編輯并不多,因?yàn)槊罘爆?,在效率上,使?DBMS 效率更高,但是 DDL 是學(xué)習(xí) MySQL 數(shù)據(jù)庫的根本之一,應(yīng)該會寫。
到此 MySQL 系列文章的第一篇就結(jié)束了,里面大部分內(nèi)容都是關(guān)于 MySQL 數(shù)據(jù)庫的概念以及表的創(chuàng)建,非??菰?,但又是初學(xué) MySQL 所必須要懂的知識點(diǎn),相信大家通過本節(jié)已經(jīng)對 MySQL 有了一定的認(rèn)識,那么下一篇將是重中之重,是在開發(fā)中經(jīng)常使用的 DML 數(shù)據(jù)庫操作語言,也就是我們平時(shí)所說的 SQL 語句,在此期待我們的下一篇 《MySQL —— SQL 語句總結(jié)》。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17792.html
摘要:在搭建集群之前,我們需要先修改的數(shù)據(jù)持久化配置為存儲。所以,如果啟動(dòng)多個(gè)默認(rèn)配置下的節(jié)點(diǎn),數(shù)據(jù)存儲是存在一致性問題的。為了解決這個(gè)問題,采用了集中式存儲的方式來支持集群化部署,目前只要支持的存儲。 前情回顧: 《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)》 《Spring Cloud Alibaba基礎(chǔ)教程:支持的幾種服務(wù)消費(fèi)方式》 《Spri...
摘要:數(shù)據(jù)庫數(shù)據(jù)庫入門教程系列工具掘金工具共同編輯,修正錯(cuò)誤,這里點(diǎn)擊進(jìn)去在這里持續(xù)更新由于軟件是基于模式的數(shù)據(jù)庫管理系統(tǒng)一個(gè)客戶機(jī)服務(wù)器,因此在日常各種工作中,可以通過各種客戶端軟件來與數(shù)據(jù)庫管理系統(tǒng)關(guān)聯(lián)。 MySQL入門教程系列-1.5 如何學(xué)習(xí)MySQL - 掘金 在這里持續(xù)更新 MySQL入門教程系列-1.5 如何學(xué)習(xí)MySQL 如何學(xué)習(xí) MySQL 這是一個(gè)偽命題,每個(gè)人都有適合自...
閱讀 1933·2021-11-24 09:39
閱讀 2649·2021-10-14 09:43
閱讀 3364·2021-10-08 10:10
閱讀 2372·2021-09-22 15:54
閱讀 2380·2019-08-29 17:20
閱讀 1601·2019-08-28 18:14
閱讀 2401·2019-08-26 13:28
閱讀 1145·2019-08-26 12:16