1. 程式人生 > >Msql入門實戰之下

Msql入門實戰之下

limit 保存 esc 演示 lock print ica 軟件開發 外鍵約束

前面一章主要解說了mysql的select的使用方法。將select的大部分使用方法進行分別解說。本章主要解說Msql約束表的建立,以及存儲過程的實現,附帶其它介紹。臨時就算入門了,Mysql索引之後另開章節。

解說不到位的地方歡迎大家指正:聯系方式rlovep.com

全部代碼下載(csdn):鏈接

Github鏈接:鏈接https://github.com/wpeace1212/Mysql

寫文章不易,歡迎大家採我的文章。以及給出實用的評論,當然大家也能夠關註一下我的github。多謝;

1.約束表的建立和插入

數據類型告訴我們須要存儲什麽樣子的數據,而約束告訴我們這些數據具體須要滿足的規則。如:age int, 我們能夠存儲負整數,price float。我們能夠存儲負小數,可是負數是不滿足實際規則的,因此我們須要約束。

常見約束:

  1. 非空約束:not null

  2. 唯一約束:unique

  3. 主鍵約束:primary key

  4. 外鍵約束: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存儲過程入門:

  1. 出現的緣由:

    1. 存儲過程是可復用的組件

    2. 存儲過程將被保存

    3. 存儲過程能夠 移植

    4. 存儲過程會使系統運行更快

  2. 語法:


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. 簡單實例:

#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變量介紹:

  1. 全局變量(內置變量):

    mysql數據庫內置的變量 (全部連接都起作用)

    1. 查看全部全局變量: show variables

如: character_set_client: mysqlserver的接收數據的編碼

character_set_results:mysqlserver輸出數據的編碼

  1. 查看某個全局變量:

    select @@變量名

    select @@character_set_client;輸出:utf8

  2. 改動全局變量:

    set 變量名=新值

    1. 會話變量: 輸出參數屬於會話變量

    僅僅存在於當前客戶端與數據庫server端的一次連接其中。假設連接斷開,那麽會話變量全部丟失!

  3. 定義會話變量:

    set @變量=值

  4. 查看會話變量:

    select @變量

    1. 局部變量:

在存儲過程中使用的變量就叫局部變量。僅僅要存儲過程運行完成,局部變量就丟失!

  1. 定義局部變量:

    DECLARE 變量名 INT DEFAULT 1;#默認值為1

    DECLARE i INT DEFAULT 1;

  2. 查看局部變量:

    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等語句:

  1. 帶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入門實戰之下