数据库入门(二)
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 TO'eric'@'localhost' IDENTIFIED BY '123456';
????????GRANT DELETE ON day15.employee TO'eric'@'localhost' IDENTIFIED BY '123456';
????????SHOW TABLES;
轉載于:https://blog.51cto.com/12925070/1933581
總結
 
                            
                        - 上一篇: Debian 项目不再提供 CD 格式的
- 下一篇: 关于Unity中Shader的内置值
