下文內(nèi)容主要給大家?guī)黻P(guān)于MySQL系列的一些常用知識點,所講到的知識,與書籍不同,都是創(chuàng)新互聯(lián)專業(yè)技術(shù)人員在與用戶接觸過程中,總結(jié)出來的,具有一定的經(jīng)驗分享價值,希望給廣大讀者帶來幫助。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的奉賢網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
DDL數(shù)據(jù)定義語言:create / drop / alter
DML數(shù)據(jù)操作語句:insert / delete /update / truncate
DQL數(shù)據(jù)查詢語言:select / show
對表中的列值數(shù)據(jù)進行約束
作用: 當(dāng)用戶對使用默認值的字段不插入值的時候,就使用默認值。
注意:對默認值字段可以插入null。
CREATE TABLE T_Persons( Id INT, NAME NVARCHAR(20), Gender NVARCHAR(2) DEFAULT '男' )
作用: 限制字段必須賦值
注意:1)非空字符必須賦值;2)非空字符不能賦null。
CREATE TABLE T_Persons( Id INT NOT NULL, NAME NVARCHAR(20), Gender NVARCHAR(2) )
作用: 對字段的值不能重復(fù)
注意:1)唯一字段可以插入null;2)唯一字段可以插入多個null
CREATE TABLE T_Persons( Id INT UNIQUE, NAME NVARCHAR(20), Gender NVARCHAR(2) )
作用: 非空+唯一
注意:
1)通常情況下,每張表都會設(shè)置一個主鍵字段。用于標(biāo)記表中的每條記錄的唯一性。
2)建議不要選擇表的包含業(yè)務(wù)含義的字段作為主鍵,建議給每張表獨立設(shè)計一個非業(yè)務(wù)含義的id字段。
CREATE TABLE T_Persons( Id INT PRIMARY KEY, NAME NVARCHAR(20), Gender NVARCHAR(2) )
作用: 自動遞增
CREATE TABLE T_Persons( Id INT AUTO_INCREMENT, NAME NVARCHAR(20), Gender NVARCHAR(2) ) ------------------------------------------------------------ CREATE TABLE T_Persons( Id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT,-- 自增長,從0開始 ZEROFILL 零填充 NAME NVARCHAR(20), Gender NVARCHAR(2) ) DELETE FROM T_Persons; -- 不能影響自增長約束 TRUNCATE TABLE T_Persons;-- 可以影響自增長約束
作用:約束兩種表的數(shù)據(jù)
語法:CONSTRAINT 外鍵名 FOREIGN KEY(副表的外鍵字段) REFERENCES 主表(主表的主鍵)
-- 部門表(主表) CREATE TABLE T_Department( Id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ) -- 員工表(副表/從表) CREATE TABLE T_Employee( Id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), DepartmentId INT, CONSTRAINT employee_department_fk FOREIGN KEY(DepartmentId) REFERENCES T_Department(Id) )
注意:
1)被約束的表稱為副表,約束別人的表稱為主表,外鍵設(shè)置在副表上的?。?!
2)主表的參考字段通常為主鍵!
3)添加數(shù)據(jù): 先添加主表,再添加副表
4)修改數(shù)據(jù): 先修改副表,再修改主表
5)刪除數(shù)據(jù): 先刪除副表,再刪除主表
級聯(lián)修改: ON UPDATE CASCADE
級聯(lián)刪除: ON DELETE CASCADE
注意: 級聯(lián)操作必須在外鍵基礎(chǔ)上使用
CREATE TABLE T_Employee( Id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), DepartmentId INT, CONSTRAINT employee_department_fk FOREIGN KEY(DepartmentId) REFERENCES T_Department(Id) ON UPDATE CASCADE ON DELETE CASCADE )
設(shè)計原則: 建議設(shè)計的表盡量遵守三大范式。
第一范式: 要求表的每個字段必須是不可分割的獨立單元。
如果在T_Persons表中的name字段中存儲“李東華|李葉蛾”,就會違反第一范式。
如果在T_Persons表中的name字段中存儲“李東華”,在oldname字段中存儲“李葉蛾”,就會符合第一范式。
第二范式: 在第一范式的基礎(chǔ)上,要求每張表只表達一個意思。表的每個字段都和表的主鍵有依賴。
第三范式: 在第二范式基礎(chǔ),要求每張表的主鍵之外的其他字段都只能和主鍵有直接決定依賴關(guān)系。
按照我個人理解:
第一范式,是對“列”進行約束,每個字段是不可分割的獨立單元;
第二范式,是對“表”進行約束,每張表只表達一個意思;
第三范式,是對“表與表之間的關(guān)系”進行約束,副表只能包含主表的primary key。
MySQL變量包括:全局變量、會話變量、局部變量
全局變量(內(nèi)置變量):mysql數(shù)據(jù)庫內(nèi)置的變量 (所有連接都起作用)
查看所有全局變量: show variables
查看某個全局變量: select @@變量名
修改全局變量: set 變量名=新值
全局變量中的兩個值:character_set_client和character_set_results??梢圆樵僑HOW VARIABLES LIKE 'character_%';
character_set_client: mysql服務(wù)器的接收數(shù)據(jù)的編碼
character_set_results:mysql服務(wù)器輸出數(shù)據(jù)的編碼
會話變量: 只存在于當(dāng)前客戶端與數(shù)據(jù)庫服務(wù)器端的一次連接當(dāng)中。如果連接斷開,那么會話變量全部丟失!
定義會話變量: set @變量=值
查看會話變量: select @變量
局部變量: 在存儲過程中使用的變量就叫局部變量。只要存儲過程執(zhí)行完畢,局部變量就丟失?。?/p>
存儲過程,是帶有邏輯的sql語句。
之前的sql沒有條件判斷,沒有循環(huán);存儲過程帶上流程控制語句(if while)。
1)執(zhí)行效率非??欤〈鎯^程是在數(shù)據(jù)庫的服務(wù)器端執(zhí)行的?。?!
2)移植性很差!不同數(shù)據(jù)庫的存儲過程是不能移植。
語法:
刪除存儲過程:DROP PROCEDURE 存儲過程名稱;
參數(shù):
IN: 表示輸入?yún)?shù),可以攜帶數(shù)據(jù)帶存儲過程中
OUT: 表示輸出參數(shù),可以從存儲過程中返回結(jié)果
INOUT: 表示輸入輸出參數(shù),既可以輸入功能,也可以輸出功能
-- 創(chuàng)建存儲過程 DELIMITER $ -- 聲明存儲過程的結(jié)束符 CREATE PROCEDURE sp_findAll() BEGIN SELECT * FROM T_Persons; END $ -- 執(zhí)行存儲過程 CALL sp_findAll(); -- CALL 存儲過程名稱(參數(shù));
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_findById(IN pid INT) BEGIN SELECT * FROM T_Persons WHERE Id=pid; END $ -- 執(zhí)行存儲過程 CALL sp_findById(2);
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_findCount(OUT str VARCHAR(20),OUT num INT) BEGIN SET str = 'hello world'; SELECT COUNT(Id) INTO num FROM T_Persons; END $ -- 執(zhí)行存儲過程 CALL sp_findCount(@str,@num); -- 查看存儲過程的OUT類型的結(jié)果 SELECT @str,@num;
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_testInOut(INOUT n INT) BEGIN SELECT n; SET n = 500; END $ -- 執(zhí)行存儲過程 SET @n = 10; CALL sp_testInOut(@n); SELECT @n;
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_testIf(IN num INT,OUT str VARCHAR(20)) BEGIN IF num = 1 THEN SET str = '星期一'; -- 注意用SET進行賦值 ELSEIF num = 2 THEN SET str = '星期二'; ELSEIF num = 3 THEN SET str = '星期三'; ELSE SET str = '輸入錯誤!'; END IF;-- 注意這里有分號結(jié)尾 END $ -- 執(zhí)行存儲過程 CALL sp_testIf(4,@str); SELECT @str;
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_testWhile(IN num INT,OUT result INT) BEGIN DECLARE i INT DEFAULT 1; DECLARE iResult INT DEFAULT 0; WHILE i <= num DO SET iResult = iResult + i; SET i = i + 1; END WHILE; SET result = iResult; END $ -- 執(zhí)行存儲過程 CALL sp_testWhile(100,@result); SELECT @result;
-- 創(chuàng)建存儲過程 DELIMITER $ CREATE PROCEDURE sp_testINTO(IN pid INT,OUT vname VARCHAR(20)) BEGIN SELECT NAME INTO vname FROM T_Persons WHERE Id=pid; END $ -- 執(zhí)行存儲過程 CALL sp_testINTO(2,@vname); SELECT @vname;
當(dāng)操作了某張表時,希望同時觸發(fā)一些動作/行為,可以使用觸發(fā)器完成??!
語法:
DELIMITER $ CREATE TRIGGER 觸發(fā)器的名字 AFTER INSERT/UPDATE/DELETE ON 表名 FOR EACH ROW BEGIN -- SQL語句 END $
示例:
CREATE TABLE T_Logs( Id INT PRIMARY KEY AUTO_INCREMENT, Content VARCHAR(20) ) DELIMITER $ CREATE TRIGGER tri_Add AFTER INSERT ON T_Persons FOR EACH ROW BEGIN INSERT INTO T_Logs(Content) VALUES('插入了一條數(shù)據(jù)'); END $
MySQL數(shù)據(jù)庫的所有用戶都存儲在mysql.user表內(nèi)
其中,root用戶擁有所有權(quán)限(可以干任何事情);
而權(quán)限賬戶,只擁有部分權(quán)限(CURD)例如,只能操作某個數(shù)據(jù)庫的某張表
1)如何修改mysql用戶的密碼?
UPDATE USER SET PASSWORD=PASSWORD('root') WHERE USER='root';
在mysql中,密碼password是經(jīng)md5加密的(單向加密)
USE mysql; SELECT * FROM USER; SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
2)分配權(quán)限賬戶
GRANT 權(quán)限 ON 數(shù)據(jù)庫名.表名 TO '用戶名'@'IP地址' IDENTIFIED BY '密碼';
如果IP地址處用“%”,則表示本機和遠程都可以。
GRANT SELECT ON testdb.T_Persons TO 'rk'@'localhost' IDENTIFIED BY '123456'; GRANT DELETE ON testdb.T_Persons TO 'rk'@'localhost' IDENTIFIED BY '123456';
mysqldump -u root -p testdb > c:/bak.sql
mysql -u root -p testdb < c:/bak.sql
注意:不需要登錄
對于以上關(guān)于MySQL系列的一些常用知識點,如果大家還有更多需要了解的可以持續(xù)關(guān)注我們創(chuàng)新互聯(lián)的行業(yè)推新,如需獲取專業(yè)解答,可在官網(wǎng)聯(lián)系售前售后的,希望該文章可給大家?guī)硪欢ǖ闹R更新。