1. 程式人生 > >數據庫二

數據庫二

mysql數據庫

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;


數據庫二