Msql入門實戰之下
前面一章主要解說了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(20) 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(20) not null comment ‘商品名‘,#設置不能為空
goods_price float not null comment ‘商品價格‘
);
3.演示操作:
##插入:
insert into goods values(001,‘餅幹1‘,‘2.3‘);
insert into goods values(001,‘餅幹2‘,2.5);##報錯 Error Code: 1062. Duplicate entry ‘1‘ for key ‘goods_id‘ 0.00022 sec
insert into goods values(002,‘餅幹2‘,2.5);
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(20) not null comment ‘商品名‘,#設置不能為空
goods_price float not null comment ‘商品價格‘
);
3.演示操作:
##插入:
insert into goods values(001,‘餅幹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(20) not null comment ‘商品名‘,#設置不能為空
gooods_price float not null comment ‘商品價格‘,
goods_maker varchar(20) default null comment ‘生產商‘,#morning為空
index(goods_id)#建立外鍵關系的域必須為索引類型
)engine=innodb character set utf8 collate utf8_general_ci auto_increment=1;#設置引擎以及字符集
#創建訂單表
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(001,1,2);
insert into detil values(002,2,2);
insert into detil values(003,3,2);
insert into detil values(004,4,2);
insert into detil values(005,1,2);
insert into detil values(006,1,2);
insert into detil values(007,1,2);
insert into detil values(008,1,2);
#insert into detil values(008,30,2);#30外鍵不存在會報錯。
#2.刪除演示:
##刪除goods中的一行。detil相應的外鍵等於2的列也會被刪去。
delete from goods where goods_id=2;
#3.查詢演示:從訂單表中查詢相應的商品。
select * from goods where goods_id=(select goods from detil where customer_id=001)
#4.刪除外鍵約束:
alter table tableName drop foreign key 外鍵名;
4.一個樣例:
-- 解決數據冗余高的問題:給冗余的字段放到一張獨立表中
-- 獨立設計一張部門表
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
);
-- 加入員工表
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
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(1,‘軟件開發部‘);
INSERT INTO dept(id,deptName) VALUES(2,‘應用維護部‘);
INSERT INTO dept(id,deptName) VALUES(3,‘秘書部‘);
INSERT INTO employee VALUES(1,‘張三‘,1);
INSERT INTO employee VALUES(2,‘李四‘,1);
INSERT INTO employee VALUES(3,‘王五‘,2);
INSERT INTO employee VALUES(4,‘陳六‘,3);
-- 1)當有了外鍵約束,加入數據的順序: 先加入主表。再加入副表數據
-- 2)當有了外鍵約束。改動數據的順序: 先改動副表,再改動主表數據
-- 3)當有了外鍵約束,刪除數據的順序: 先刪除副表。再刪除主表數據
-- ON CASCADE UPDATE :級聯改動
UPDATE dept SET id=4 WHERE id=3;
2.存儲過程:這裏僅僅進行簡介
存儲過程是一種存儲在書庫庫中的程序(就像正規語言裏的子程序一樣),準確的來說,MySQL 支持的“ routines (例程)”有兩種:一是我們說的存儲過程, 二是在其它 SQL 語句中能夠返回值的函數(使用起來和 Mysql 預裝載的函數一樣,如 pi() )。
2.1存儲過程入門:
出現的緣由:
存儲過程是可復用的組件
存儲過程將被保存
存儲過程能夠 移植
存儲過程會使系統運行更快
語法:
DELIMITER $ /*定義分隔符*/
CREATE PROCEDURE procedure1/* name 存儲過程名 */
(IN parameter1 INTEGER) /* parameters 參數 */
BEGIN /* start of block 語句塊頭 */
DECLARE variable1 CHAR(10); /* 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(5,1);
END $
````
4.存儲過程的操作:
````
-- 運行存儲過程--
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(4);
<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(20), out sid int)-- 定義兩個輸出參數,str存儲員工名字,id存儲最小的員工編號
begin
select min(id) into sid from employee;-- 使用into。給輸出變量賦值
select empName from employee where id=3 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: mysqlserver的接收數據的編碼
character_set_results:mysqlserver輸出數據的編碼
查看某個全局變量:
select @@變量名
select @@character_set_client;輸出:utf8
改動全局變量:
set 變量名=新值
- 會話變量: 輸出參數屬於會話變量
僅僅存在於當前客戶端與數據庫server端的一次連接其中。假設連接斷開,那麽會話變量全部丟失!
定義會話變量:
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 =500;-- 改動變量
END $
<div class="se-preview-section-delimiter"></div>
2.簡單調用:
-- 調用
SET @n=10;
CALL pro_testInOut(@n);
SELECT @n;#顯示改動後的值
<div class="se-preview-section-delimiter"></div>
2.6,帶條件循環的存儲過程:
Mysql的存儲過程中能夠使用if。while,case等語句:
- 帶if的存儲過程:
-- 帶有條件推斷的存儲過程
-- 需求:輸入一個整數。假設1。則返回“星期一”,假設2。返回“星期二”,假設3,返回“星期三”。其它數字,返回“錯誤輸入”;
DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str=‘星期一‘;
ELSEIF num=2 THEN
SET str=‘星期二‘;
ELSEIF num=3 THEN
SET str=‘星期三‘;
ELSE
SET str=‘輸入錯誤‘;
END IF;
END $
CALL pro_testIf(4,@str);
SELECT @str;
drop procedure pro_testIf;
<div class="se-preview-section-delimiter"></div>
2.帶有while的存儲過程
-- 帶有循環功能的存儲過程
-- 需求: 輸入一個整數,求和。比如,輸入100,統計1-100的和
DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)
BEGIN
-- 定義局部變量
DECLARE i INT DEFAULT 1;
DECLARE vsum INT DEFAULT 0;
WHILE i<=num DO
SET vsum = vsum+i;
SET i=i+1;
END WHILE;
SET result=vsum;
END $
<div class="se-preview-section-delimiter"></div>
#調用
CALL pro_testWhile(100,@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 + 1;
CASE variable1
WHEN 0 THEN INSERT INTO t VALUES (17);
WHEN 1 THEN INSERT INTO t VALUES (18);
ELSE INSERT INTO t VALUES (19);
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(20)
);
-- 需求: 當向員工表插入一條記錄時,希望mysql自己主動同一時候往日誌表插入數據
-- 1.創建觸發器(加入)After
create trigger tri_empAdd After insert on employee for each row
insert into test_log(content) values(‘員工插入了一條記錄‘);
-- 插入數據;
insert into employee values(7,‘peace3‘,1,3);
<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=7;
<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=7;
<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;
-- 設置與更改username--
set password for peace = password(‘123456‘);
-- 撤銷用戶權限--
-- 命令:
revoke insert on day01.student from peace;
-- 展示權限--
show grants for peace;
-- 刪除用戶--
drop user peace;
本章介紹到這裏:
來自伊豚wpeace(rlovep.com)
Msql入門實戰之下