前面一章主要講解了mysql的select的用法,将select的大部分用法進行分别講解。本章主要講解Msql限制表的建立,以及存儲過程的實作,附帶其他介紹。暫時就算入門了,Mysql索引之後另開章節;
講解不到位的地方歡迎大家指正:聯系方式rlovep.com
全部代碼下載下傳(csdn):連結
Github連結:連結https://github.com/wpeace1212/Mysql
寫文章不易,歡迎大家采我的文章,以及給出有用的評論,當然大家也可以關注一下我的github;多謝;
1.限制表的建立和插入
資料類型告訴我們需要存儲什麼樣子的資料,而限制告訴我們這些資料具體需要滿足的規則。如:age int, 我們可以存儲負整數,price float,我們可以存儲負小數,但是負數是不滿足實際規則的,是以我們需要限制。
常見限制:
- 非空限制:not null
- 唯一限制:unique
- 主鍵限制:primary key
- 外鍵限制:foreign key
1.1非空限制:
1.定義:
在建立表的字段時,在後面帶上not null就可,正如字面意思,代表當插入資料時該字段必須有值:
2.示範建立:
#建立一個名為goods的表,有兩個字段商品名和商品價格:
create table if not exists goods(
goods_name varchar() not null comment '商品名',#設定不能為空
goods_price float not null comment '商品價格'
);
3.示範操作:
##插入:
insert into goods values('餅幹1','2.3');
insert into goods(goods_price) values('23.0')##不能執行
1.2唯一限制:
1.定義:
在建立表的字段時,在後面帶上unique就可,正如字面意思,代表當插入資料時該字段不能有重複值
2.示範建立:
#建立一個名為goods的表,有兩個字段商品名和商品價格:
drop table goods;
create table goods(
goods_id int not null unique comment '商品編号',#設定為非空,唯一
goods_name varchar() not null comment '商品名',#設定不能為空
goods_price float not null comment '商品價格'
);
3.示範操作:
##插入:
insert into goods values(,'餅幹1','2.3');
insert into goods values(,'餅幹2',);##報錯 Error Code: 1062. Duplicate entry '1' for key 'goods_id' 0.00022 sec
insert into goods values(,'餅幹2',);
1.3主鍵限制:
1.定義:
在建立表的字段時,在後面帶上primary key就可;主鍵限制:不允許為空,不允許重複,主鍵一般自增長一起使用:auto_increment
2.示範建立:
#建立一個名為goods的表,有兩個字段商品名和商品價格:
drop table goods;
create table if not exists goods(#判斷表是否存在進行建立
goods_id int not null auto_increment primary key comment '商品編号',#設定為主鍵,自動增長
goods_name varchar() not null comment '商品名',#設定不能為空
goods_price float not null comment '商品價格'
);
3.示範操作:
##插入:
insert into goods values(,'餅幹1','2.3');#标号001,沒有用,生成的标号為1;标号按1增長
insert into goods values(null,'餅幹2','2.3');#可以直接這樣插入
insert into goods values('餅幹3','2.3');#這樣報錯,提示值不比對
insert into goods(goods_name,goods_price) values('餅幹3','2.3');##這樣可以正常插入
##删除主鍵:
alter table tablename drop primary key ;
1.3外鍵限制:
1.定義:
在建立表的時候,在後面帶上 foreign key(本表字段) references goods其他表(其他表字段)就可;外建限制是比較有用的,在建立多對一,多對多,一對一,繼承等關系的資料庫時都要用到。
作用:使一個表參考另一個表的字段,使兩表建立關系。比如:商品表中有id号,在商品訂單表中将商品id作為外建,這樣就可以通過查找訂單表中的商品id,進而通過連接配接查詢查詢到商品的詳細資訊;
2.示範建立:
#MySQL建立關聯表可以了解為是兩個表之間有個外鍵關系,但這兩個表必須滿足三個條件
#1.兩個表必須是InnoDB資料引擎
#2.使用在外鍵關系的域必須為索引型(Index)
#3.使用在外鍵關系的域兩者資料類型需要相似
#建立關聯表
#建立商品表:
create table if not exists goods(#判斷表是否存在進行建立
goods_id int not null auto_increment primary key comment '商品編号',#設定為主鍵,自動增長
goods_name varchar() not null comment '商品名',#設定不能為空
gooods_price float not null comment '商品價格',
goods_maker varchar() default null comment '生産商',#morning為空
index(goods_id)#建立外鍵關系的域必須為索引類型
)engine=innodb character set utf8 collate utf8_general_ci auto_increment=;#設定引擎以及字元集
#建立訂單表
create table if not exists detil(
customer_id int not null primary key comment '客戶id',#設定為主鍵
goods int not null comment '商品id',
count int not null comment '數量',
index(goods),#經測試此去的索引可以省去。
foreign key(goods) references goods(goods_id) on delete cascade on update cascade#建立外鍵,使用goods(goods_id)作為外鍵。
#on delete(update) cascade 意思為當goods表有相關記錄删除(修改)時,detil想要的記錄也會被删去(修改)。
)engine=innodb character set utf8 collate utf8_general_ci;#設定引擎以及字元集
3.示範操作:
#1.插入示範:
#向goods表添加資料
insert into goods values(null,'餅幹1','2.3','三無産品');
insert into goods values(null,'餅幹2','2.3','三無産品');
insert into goods values(null,'餅幹3','2.3','三無産品');
insert into goods values(null,'餅幹4','2.3','三無産品');
insert into goods values(null,'餅幹5','2.3','三無産品');
insert into goods values(null,'餅幹6','2.3','三無産品');
insert into goods values(null,'餅幹7','2.3','三無産品');
insert into goods values(null,'餅幹8','2.3','三無産品');
#向detil表添加資料
#必須在goods中有goods_id的編号,能正确插入detil;
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
insert into detil values(,,);
#insert into detil values(,,);#30外鍵不存在會報錯。
#2.删除示範:
##删除goods中的一行,detil對應的外鍵等于2的列也會被删去。
delete from goods where goods_id=;
#3.查詢示範:從訂單表中查詢對應的商品;
select * from goods where goods_id=(select goods from detil where customer_id=)
#删除外鍵限制:
alter table tableName drop foreign key 外鍵名;
4.一個例子:
-- 解決資料備援高的問題:給備援的字段放到一張獨立表中
-- 獨立設計一張部門表
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR()
);
-- 添加員工表
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(),
deptId INT,-- 把部門名稱改為部門ID
-- 聲明一個外鍵限制
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
ON UPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :級聯修改
-- 外鍵名稱 外鍵 參考表(參考字段)
);
INSERT INTO dept(id,deptName) VALUES(,'軟體開發部');
INSERT INTO dept(id,deptName) VALUES(,'應用維護部');
INSERT INTO dept(id,deptName) VALUES(,'秘書部');
INSERT INTO employee VALUES(,'張三',);
INSERT INTO employee VALUES(,'李四',);
INSERT INTO employee VALUES(,'王五',);
INSERT INTO employee VALUES(,'陳六',);
-- 1)當有了外鍵限制,添加資料的順序: 先添加主表,再添加副表資料
-- 2)當有了外鍵限制,修改資料的順序: 先修改副表,再修改主表資料
-- 3)當有了外鍵限制,删除資料的順序: 先删除副表,再删除主表資料
-- ON CASCADE UPDATE :級聯修改
UPDATE dept SET id= WHERE id=;
2.存儲過程:這裡隻進行簡單介紹
存儲過程是一種存儲在書庫庫中的程式(就像正規語言裡的子程式一樣),準确的來說,MySQL 支援的“ routines (例程)”有兩種:一是我們說的存儲過程, 二是在其他 SQL 語句中可以傳回值的函數(使用起來和 Mysql 預裝載的函數一樣,如 pi() )。
2.1存儲過程入門:
- 出現的緣由:
- 存儲過程是可複用的元件
- 存儲過程将被儲存
- 存儲過程可以 移植
- 存儲過程會使系統運作更快
- 文法:
DELIMITER $ /*定義分隔符*/
CREATE PROCEDURE procedure1/* name 存儲過程名 */
(IN parameter1 INTEGER) /* parameters 參數 */
BEGIN /* start of block 語句塊頭 */
DECLARE variable1 CHAR(); /* variables 變量聲明 */
IF parameter1 = 17 THEN /* start of IF IF 條件開始 */
SET variable1 = 'birds'; /* assignment 指派 */
ELSE
SET variable1 = 'beasts'; /* assignment 指派 */
END IF; /* end of IF IF 結束 */
INSERT INTO table1 VALUES (variable1); /* statement SQL 語句 */
END $ /* end of block 語句塊結束 */
- 簡單執行個體:
#1.存儲過程(方法建立)--
-- 建立存儲過程--
DELIMITER $ #-- 聲明結束符為$
create procedure pro_test()
begin
SELECT * FROM employee;
INSERT INTO employee(id,deptId) VALUES(,);
END $
````
存儲過程的操作:
````
-- 執行存儲過程--
CALL pro_test();
drop procedure pro_test;#删除存儲過程
<div class="se-preview-section-delimiter"></div>
2.2建立帶輸入參數的函數(存儲過程) :
前面我們建立的函數,參數清單是空的。Mysql資料庫的存儲過程是可以帶參數的,包括輸入輸出參數,輸入參數的聲明方式:
CREATE PROCEDURE p1
([IN] name data-type) ...
<div class="se-preview-section-delimiter"></div>
1.簡單示範建立:
-- 建立帶輸入參數的函數
delimiter $
create procedure pro_findById(in eid int) -- in:輸入參數 類型為int
begin
select * from employee where id=eid;
end $
<div class="se-preview-section-delimiter"></div>
2.調用:
-- 調用帶輸入參數的方法--
call pro_findById();
<div class="se-preview-section-delimiter"></div>
2.3建立帶輸出參數的函數(存儲過程) :
同樣可以代輸出參數,相當于建立了變量,使得在函數結束後,可以獲得變量的值;輸出參數的聲明方式:
CREATE PROCEDURE p2
([out] name data-type) ...
<div class="se-preview-section-delimiter"></div>
1.簡單示範建立:
-- 建立帶有輸出參數的函數
delimiter $
create procedure pro_testout(out str varchar(), out sid int)-- 定義兩個輸出參數,str存儲員工名字,id存儲最小的員工編号
begin
select min(id) into sid from employee;-- 使用into,給輸出變量指派
select empName from employee where id= into str;
end $
<div class="se-preview-section-delimiter"></div>
2.帶輸出參數的函數調用:
-- 帶輸出參數的函數調用
-- 變量用@name表示
call pro_testout(@str,@sid);
select @str,@sid;#使用輸出變量
<div class="se-preview-section-delimiter"></div>
2.4變量介紹:
-
全局變量(内置變量):
mysql資料庫内置的變量 (所有連接配接都起作用)
- 檢視所有全局變量: show variables
如: character_set_client: mysql伺服器的接收資料的編碼
character_set_results:mysql伺服器輸出資料的編碼
-
檢視某個全局變量:
select @@變量名
select @@character_set_client;輸出:utf8
-
修改全局變量:
set 變量名=新值
- 會話變量: 輸出參數屬于會話變量
-
定義會話變量:
set @變量=值
-
檢視會話變量:
select @變量
- 局部變量:
在存儲過程中使用的變量就叫局部變量。隻要存儲過程執行完畢,局部變量就丢失!!
-
定義局部變量:
DECLARE 變量名 INT DEFAULT 1;#預設值為1
DECLARE i INT DEFAULT 1;
-
檢視局部變量:
select 變量
select i;
2.5帶有輸入輸出參數的存儲過程:
參數既是輸入參數,也是輸出參數,輸出參數的聲明方式:
CREATE PROCEDURE p2
([INTOUT] name data-type) ...
<div class="se-preview-section-delimiter"></div>
1.簡單示範建立:
DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT) -- INOUT: 輸入輸出參數
BEGIN
-- 檢視變量
SELECT n;
SET n =;-- 修改變量
END $
<div class="se-preview-section-delimiter"></div>
2.簡單調用:
-- 調用
SET @n=;
CALL pro_testInOut(@n);
SELECT @n;#顯示修改後的值
<div class="se-preview-section-delimiter"></div>
2.6,帶條件循環的存儲過程:
Mysql的存儲過程中可以使用if,while,case等語句:
- 帶if的存儲過程:
-- 帶有條件判斷的存儲過程
-- 需求:輸入一個整數,如果,則傳回“星期一”,如果,傳回“星期二”,如果,傳回“星期三”。其他數字,傳回“錯誤輸入”;
DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR())
BEGIN
IF num= THEN
SET str='星期一';
ELSEIF num= THEN
SET str='星期二';
ELSEIF num= THEN
SET str='星期三';
ELSE
SET str='輸入錯誤';
END IF;
END $
CALL pro_testIf(,@str);
SELECT @str;
drop procedure pro_testIf;
<div class="se-preview-section-delimiter"></div>
2.帶有while的存儲過程
-- 帶有循環功能的存儲過程
-- 需求: 輸入一個整數,求和。例如,輸入,統計-的和
DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
-- 定義局部變量
DECLARE i INT DEFAULT ;
DECLARE vsum INT DEFAULT ;
WHILE i<=num DO
SET vsum = vsum+i;
SET i=i+;
END WHILE;
SET result=vsum;
END $
<div class="se-preview-section-delimiter"></div>
#調用
CALL pro_testWhile(,@result);
drop procedure pro_testWhile;
SELECT @result;
<div class="se-preview-section-delimiter"></div>
3.帶有case的存儲過程:
CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + ;
CASE variable1
WHEN THEN INSERT INTO t VALUES ();
WHEN THEN INSERT INTO t VALUES ();
ELSE INSERT INTO t VALUES ();
END CASE;
END; $
<div class="se-preview-section-delimiter"></div>
3.其他介紹:
3.1觸發器
-- 當進行 update,insert,delete的前後觸發一個事件;
-- 建立日志表
create table test_log(
id int primary key auto_increment,
content varchar()
);
-- 需求: 當向員工表插入一條記錄時,希望mysql自動同時往日志表插入資料
-- 1.建立觸發器(添加)After
create trigger tri_empAdd After insert on employee for each row
insert into test_log(content) values('員工插入了一條記錄');
-- 插入資料;
insert into employee values(,'peace3',,);
<div class="se-preview-section-delimiter"></div>
##顯示觸發的資料:
select * from test_log;
-- 2.建立觸發器(修改) before
CREATE TRIGGER tri_empUpd before UPDATE ON employee FOR EACH ROW -- 當往員工表修改一條記錄時
INSERT INTO test_log(content) VALUES('員工表修改了一條記錄');
-- 修改
UPDATE employee SET empName='eric' WHERE id=;
<div class="se-preview-section-delimiter"></div>
##顯示觸發的資料:
select * from test_log;
-- 3.建立觸發器(删除)before
CREATE TRIGGER tri_empDel before DELETE ON employee FOR EACH ROW -- 當往員工表删除一條記錄時
INSERT INTO test_log(content) VALUES('員工表删除了一條記錄');
-- 删除
DELETE FROM employee WHERE id=;
<div class="se-preview-section-delimiter"></div>
##顯示觸發的資料:
SELECT * FROM employee;
SELECT * FROM test_log;
<div class="se-preview-section-delimiter"></div>
3.2mysql權限問題
-- ***********mysql權限問題****************
-- mysql資料庫權限問題:root :擁有所有權限(可以幹任何事情)
-- 權限賬戶,隻擁有部分權限(peace)例如,隻能操作某個資料庫的某張表
-- 如何修改mysql的使用者密碼?
-- password: md5加密函數(單向加密)
SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
-- mysql資料庫,使用者配置 : user表
USE mysql;
show tables;
-- 檢視所有使用者
select user from user;
-- 建立使用者賬号
create user peace identified by '1234';
-- 授權 select,insert,其他一樣--
grant select,insert on day01.student to peace;
-- 授權所有:grant all on *.* to peace;
-- 設定與更改使用者名--
set password for peace = password('123456');
-- 撤銷使用者權限--
-- 指令:
revoke insert on day01.student from peace;
-- 展示權限--
show grants for peace;
-- 删除使用者--
drop user peace;
本章介紹到這裡:
來自伊豚wpeace(rlovep.com)