數據庫二
1.數據約束
a.默認值約束
默認值(default)
CREATE TABLE test(
NAME VARCHAR(20),
gender VARCHAR(2) DEFAULT ‘男‘
)
註:當前沒有插入默認值字段的時候,默認值才會起作用
b.非空約束
非空(not null)
CREATE TABLE test(
NAME VARCHAR(20) NOT NULL,
gender VARCHAR(2)
)
註:不能不插入值,不能插入null
c.唯一約束
唯一(unique)
CREATE TABLE test(
idINT UNIQUE,
NAMEVARCHAR(20)
)
註:不能插入重復的值,唯一約束不能約束null(可以插入多個null)
d.主鍵約束
唯一+非空(primary key)
CREATE TABLE test(
idINT PRIMARY KEY,
NAMEVARCHAR(20)
)
e.自增長約束
CREATE TABLE test(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(20)
)
註:初始值為0,每次遞增1
f.外鍵約束
外鍵作用:約束兩種表的數據
-- 部門表
CREATE TABLE dept(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(20)
)
-- 雇員表
CREATE TABLE employee(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(20),
deptIdINT,
CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCESdept(id)
-- 外鍵名稱 外鍵字段 參考
)
註:有了外鍵約束之後,當往副表中插入,修改主表不存在的數據時外鍵就會起作用,當刪除與副表 有關的主表數據時,外鍵起作用。當插入和修改數據時,應先向主表中添加;當刪除數據時應該先刪除 副表中的數據。
2.級聯
介紹:當有了外鍵的時候,我們希望修改或刪除數據的時候,修改或刪除了主表的數據,同時能夠影響 副表的數據,這時就可以使用級聯。
CREATE TABLE employee(
idINT PRIMARY KEY AUTO_INCREMENT,
NAMEVARCHAR(20),
deptIdINT,
--添加級聯修改: ON UPDATE CASCADE
--添加級聯刪除: ON DELETE CASCADE
CONSTRAINTemployee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- 外鍵名稱 外鍵字段 參考
)
3.數據庫設計的三大範式
第一範式:要求表的每個字段必須獨立的不可分割的單元。
第二範式:在第一範式的基礎上,要求表的除主鍵以外的字段都和主鍵有依賴關系的。
第三範式:在第二範式基礎上,要求表的除主鍵外的字段都只能和主鍵有直接決定的依賴關系。
4.多表查詢
a.交叉連接查詢(笛卡爾乘積: 4*3=12,產生笛卡爾積的原因是沒有足夠的連接條件)
SELECT employee.name,dept.name FROMemployee,dept;
b.內連接查詢
效果:只有滿足連接條件的數據才會顯示出來
SELECT e.name,d.name
FROMemployee e,dept d
WHEREe.deptId=d.id;
-- 另一種表達
SELECT e.name,d.name
FROMemployee e
INNERJOIN dept d
ON e.deptId=d.id;
c.左外連接查詢
介紹: 右表(部門表)的數據全部顯示,左表(員工)的數據當滿足連接條件的時候,就顯示滿足 條件的數據,但是如果不滿足連接條件,則顯示null
SELECT d.name,e.name
FROMdept d
LEFTOUTER JOIN employee e
ON d.id=e.deptId;
d.自連接查詢
SELECT e.name AS ‘員工‘,b.name AS ‘上司‘
FROMemployee e
LEFTOUTER JOIN employee b
ON e.bossId=b.id;
-- 查詢員工姓名及其上司姓名(沒有上司的員工也顯示
4.MySQL存儲過程
a.特點:
①.存儲過程保存到數據庫服務器端,通過數據庫客戶端工具調用存儲過程
②.存儲過程的效率會非常高,因為存儲過程是在數據庫服務器端執行。
③.存儲過程的移植性非常差的
b.存儲過程語法
創建存儲過程
-- 定義結束符號
DELIMITER 結束符號
CREATE PROCEDURE 存儲過程名稱 (形式參數列表)
BEGIN
多個sql語句
END 結束符號
-- 調用存儲過程
CALL 存儲過程名稱(實際參數列表);
參數類型:
IN: 輸入參數,可以攜帶數據到存儲過程中
OUT: 輸出參數,可以攜帶數據到存儲過程外面。
INOUT: 輸入輸出參數。
c.幾種常見存儲過程
①. 帶有輸入參數的存儲過程
-- 傳入員工id查詢對應的員工
DELIMITER $
CREATE PROCEDURE pro_testByIn(IN eidINT) -- 參數類型(IN) 參數名稱 數據類型(int)
BEGIN
SELECT* FROM employee WHERE id=eid;
END $
-- 調用
CALL pro_testByIn(2);
②.帶有輸出參數的存儲過程
DELIMITER $
CREATE PROCEDURE pro_testByOut(OUT nVARCHAR(20))
BEGIN
--修改變量n
SETn = ‘輸出參數‘;
END $
③.帶有輸入輸出參數的存儲過程
DELIMITER $
CREATE PROCEDURE pro_testByInOut(INOUT nVARCHAR(20))
BEGIN
--查看n變量
SELECTn;
--修改n變量
SETn = ‘500‘;
END $
-- 定義會話變量調用存儲過程
SET @n=‘100‘;
CALL pro_testByInOut(@n);
-- 查看n
SELECT @n;
④.帶有判斷條件的存儲過程
-- 輸入一個num整數,num=1 ,輸出‘星期一’,num=2,輸出‘星期二’,num=3,輸出‘星期
-- 三’,否則,輸出‘錯誤參數’
DELIMITER $
CREATE PROCEDURE pro_testByIf(IN numINT,OUT str VARCHAR(20))
BEGIN
IFnum=1 THEN
SETstr = ‘星期一‘;
ELSEIFnum= 2 THEN
SETstr =‘星期二‘;
ELSEIFnum=3 THEN
SETstr = ‘星期三‘;
ELSE
SETstr = ‘錯誤參數‘;
ENDIF;
END $
CALL pro_testByIf(5,@str);
SELECT @str;
⑤.帶有循環條件的存儲過程
-- 輸入一個num,計算從1到num的總和。
DELIMITER $
CREATE PROCEDURE pro_testByWhile(IN numINT,OUT score INT)
BEGIN
-- 定義局部變量
DECLARE i INT DEFAULT 1;
DECLAREresult INT DEFAULT 0;
WHILEi<=num DO
SETresult = result + i;
SETi = i+1;
ENDWHILE;
SETscore = result;
END $
CALL pro_testByWhile(200,@score);
SELECT @score;
⑥.攜帶數據庫的數據給輸出參數(INTO)
-- 需求: 傳入員工id,查詢對應的員工,輸出員工姓名
DELIMITER $
CREATE PROCEDURE pro_testByData(IN eidINT,OUT sname VARCHAR(20))
BEGIN
SELECTNAME INTO sname FROM employee WHERE id=eid;
END $
CALL pro_testByData(2,@sname);
SELECT @sname;
d.mysql數據庫三種變量:
①.全局變量。mysql內置的變量,mysql程序關閉的時候全局變量才會失效。
show variables:查看全局變量
character_set_client: mysql接收的客戶端的數據編碼
character_set_results: mysql使用什麽編碼輸出給客戶端數據
查看某個全局變量:select @@變量名
修改某個全局變量:set @@變量名=值
②.會話變量。變量只在某次登錄的會話中有效!退出連接,會話變量數據失效。
查看某個會話變量: select @變量名
修改/定義某個會話變量: set @變量名=值
③. 局部變量:在存儲過程中定義的變量。存儲過程結束局部變量失效。
查看某個局部變量: select 變量名
修改某個局部變量: set 變量名=值
5.觸發器
定義:當往員工表插入/修改/刪除一條數據的時候,同時往日誌表記錄下來,這時就要使用觸發器完 成。
觸發器語法
-- 當往員工表插入一條數據時,往員工日誌插入一條記錄。
-- 員工日誌表
CREATE TABLE emp_log(
idINT PRIMARY KEY AUTO_INCREMENT,
contentVARCHAR(20)
)
-- 創建增加觸發器
CREATE TRIGGER tri_empAdd AFTER INSERT ONemployee FOR EACH ROW
INSERTINTO emp_log(content) VALUES(‘員工被插入了一條記錄‘);
-- 創建修改觸發器
CREATE TRIGGER tri_empUpd AFTER UPDATE ONemployee FOR EACH ROW
INSERTINTO emp_log(content) VALUES(‘員工被修改了一條記錄‘);
-- 創建刪除觸發器
CREATE TRIGGER tri_empDel AFTER DELETE ONemployee FOR EACH ROW
INSERTINTO emp_log(content) VALUES(‘員工被刪除了一條記錄‘);
DROP TRIGGER tri_empAdd;
SELECT * FROM employee;
SELECT * FROM emp_log;
INSERT INTO employee(NAME,deptId,bossId)VALUES(‘李四‘,5,1);
UPDATE employee SET NAME=‘張三‘ WHERE id=10;
DELETE FROM employee WHERE id=10;
6.mysql權限問題
root用戶: 超級管理員。 權限:增刪改查(數據庫,表,數據)
給mysql數據庫分配不同權限的不同用戶
mysql數據庫:存放mysql配置信息,包括用戶信息
USE mysql;
-- 用戶表
SELECT * FROM USER;
-- 加密函數(md5算法--單向加密)
SELECT PASSWORD(‘root‘);
-- 修改用戶密碼
UPDATE USER SET PASSWORD=PASSWORD(‘123456‘)WHERE USER=‘root‘;
-- 分配權限給不同的用戶
-- 分配查詢day15數據庫的employee表的權限給eric用戶,密碼為‘123456’
GRANT SELECT ON day15.employee [email protected] IDENTIFIED BY ‘123456‘;
GRANT DELETE ON day15.employee [email protected] IDENTIFIED BY ‘123456‘;
SHOW TABLES;
數據庫二