日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
常用數(shù)據(jù)庫(kù) SQL 命令詳解(下)

在上篇《??常用數(shù)據(jù)庫(kù) SQL 命令詳解(上)??》文章中,主要介紹上半部分內(nèi)容,今天我們來介紹下半部分內(nèi)容!

10年積累的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有連城免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、函數(shù)

1.1 常用函數(shù)列表

1.2 自定義函數(shù)語法介紹

(1) 創(chuàng)建函數(shù)

CREATE FUNCTION fn_name(func_parameter[,...])
RETURNS type
[characteristic...]
routine_body

參數(shù)說明:

  • fn_name:自定義函數(shù)名稱
  • func_parameter: param_name type
  • type: 任何mysql支持的類型
  • characteristic: LANGUAGE SQL
  • routine_body: 函數(shù)體

(2) 編輯函數(shù)

ALTER FUNCTION fn_name [characteristic...]

參數(shù)說明:

  • fn_name:自定義函數(shù)名稱
  • func_parameter: param_name type
  • characteristic: LANGUAGE SQL

(3) 刪除函數(shù)

DROP FUNCTION  [IF EXISTS]  fn_name;

參數(shù)說明:

  • fn_name:自定義函數(shù)名稱
  • func_parameter: param_name type

(4) 查看函數(shù)語法

SHOW FUNCTION STATUS [LIKE 'pattern']

參數(shù)說明:

  • pattern:函數(shù)名稱

示例:

SHOW FUNCTION STATUS LIKE 'user_function';

(5) 查看函數(shù)的定義語法

SHOW CREATE FUNCTION fn_name;

參數(shù)說明:

  • fn_name:自定義函數(shù)名稱

1.3 實(shí)例操作介紹

(1) 創(chuàng)建一個(gè)表

CREATE TABLE `t_user` (
`user_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用戶id,作為主鍵',
`user_name` varchar(5) DEFAULT NULL COMMENT '用戶名',
`age` int(3) DEFAULT NULL COMMENT '年齡',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

(2) 插入數(shù)據(jù)

INSERT INTO t_user (user_name, age)
VALUES('張三',24),('李四',25),('王五',26),('趙六',27);

(3) 創(chuàng)建函數(shù)

-- 創(chuàng)建一個(gè)函數(shù)
DELIMITER $$

-- 開始創(chuàng)建函數(shù)
CREATE FUNCTION user_function(v_id INT)
RETURNS VARCHAR(50)
READS SQL DATA
DETERMINISTIC
BEGIN
-- 定義變量
DECLARE userName VARCHAR(50);
-- 給定義的變量賦值
SELECT user_name INTO userName FROM t_user
WHERE user_id = v_id;
-- 返回函數(shù)處理結(jié)果
RETURN userName;
END;

-- 函數(shù)創(chuàng)建定界符
DELIMITER ;

(4) 調(diào)用函數(shù)

//查詢用戶ID為1的信息
SELECT user_function(1);

(5) 刪除函數(shù)

DROP FUNCTION  IF EXISTS  user_function;

二、存儲(chǔ)過程

2.1 創(chuàng)建語法

CREATE PROCEDURE 存儲(chǔ)過程名([[IN |OUT |INOUT ] 參數(shù)名 數(shù)據(jù)類形...])

過程與創(chuàng)建函數(shù)類似,其中的聲明語句結(jié)束符,可以自定義:

DELIMITER $$

DELIMITER //

參數(shù)說明:

  • IN 輸入?yún)?shù):表示該參數(shù)的值必須在調(diào)用存儲(chǔ)過程時(shí)指定,在存儲(chǔ)過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
  • OUT 輸出參數(shù):該值可在存儲(chǔ)過程內(nèi)部被改變,并可返回
  • INOUT 輸入輸出參數(shù):調(diào)用時(shí)指定,并且可被改變和返回

創(chuàng)建一個(gè)查詢用戶信息的存儲(chǔ)過程示例:

DELIMITER $$
CREATE PROCEDURE user_procedure(IN v_id int,OUT userName varchar(255))
BEGIN
SELECT user_name as userName FROM t_user WHERE user_id = v_id;
END $$
DELIMITER ;

2.2 存儲(chǔ)過程調(diào)用

-- @out為輸出參數(shù)
CALL user_procedure(1, @out);

輸出結(jié)果:

張三

2.3 存儲(chǔ)過程刪除

DROP PROCEDURE [IF EXISTS]  proc_name;

刪除示例:

DROP PROCEDURE IF EXISTS  user_procedure;

2.4 存儲(chǔ)過程和函數(shù)的區(qū)別

  • 函數(shù)只能通過return語句返回單個(gè)值或者表對(duì)象。而存儲(chǔ)過程不允許執(zhí)行return,但是通過out參數(shù)返回多個(gè)值。
  • 函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲(chǔ)過程不行。
  • 函數(shù)限制比較多,比如不能用臨時(shí)表,只能用表變量,還有一些函數(shù)都不可用等等,而存儲(chǔ)過程的限制相對(duì)就比較少
  • 一般來說,存儲(chǔ)過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對(duì)性比較強(qiáng)。
  • 當(dāng)存儲(chǔ)過程和函數(shù)被執(zhí)行的時(shí)候,SQL Manager會(huì)到procedure cache中去取相應(yīng)的查詢語句,如果在procedure cache里沒有相應(yīng)的查詢語句,SQL Manager就會(huì)對(duì)存儲(chǔ)過程和函數(shù)進(jìn)行編譯。

三、觸發(fā)器

觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,在滿足定義條件時(shí)觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合。

3.1 創(chuàng)建觸發(fā)器

定義語法:

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

參數(shù)說明:

  • FOR EACH ROW:表示任何一條記錄上的操作滿足觸發(fā)事件都會(huì)觸發(fā)該觸發(fā)器,也就是說觸發(fā)器的觸發(fā)頻率是針對(duì)每一行數(shù)據(jù)觸發(fā)一次。
  • trigger_time:BEFORE和AFTER參數(shù)指定了觸發(fā)執(zhí)行的時(shí)間,在事件之前或是之后。
  • tigger_event詳解:
  • INSERT 型觸發(fā)器:插入某一行時(shí)激活觸發(fā)器,可能通過INSERT、LOAD DATA、REPLACE 語句觸發(fā)(LOAD DAT語句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中,相當(dāng)與一系列的INSERT操作);
  • UPDATE型觸發(fā)器:更改某一行時(shí)激活觸發(fā)器,可能通過UPDATE語句觸發(fā);
  • DELETE型觸發(fā)器:刪除某一行時(shí)激活觸發(fā)器,可能通過DELETE、REPLACE語句觸發(fā)。
  • trigger_order:是MySQL5.7之后的一個(gè)功能,用于定義多個(gè)觸發(fā)器,使用follows(尾隨)或precedes(在…之先)來選擇觸發(fā)器執(zhí)行的先后順序。

示例,創(chuàng)建了一個(gè)名為trig1的觸發(fā)器,一旦在t_user表中有插入動(dòng)作,就會(huì)自動(dòng)往t_time表里插入當(dāng)前時(shí)間。

CREATE TRIGGER trig1 AFTER INSERT
ON t_user FOR EACH ROW
INSERT INTO t_time VALUES(NOW());

創(chuàng)建有多個(gè)執(zhí)行語句的觸發(fā)器語法:

CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
ON 表名 FOR EACH ROW
BEGIN
執(zhí)行語句列表
END;

示例如下:

DELIMITER //
CREATE TRIGGER trig2 AFTER INSERT
ON t_user FOR EACH ROW
BEGIN
INSERT INTO t_time VALUES(NOW());
INSERT INTO t_time VALUES(NOW());
END//
DELIMITER ;

一旦插入成功,就會(huì)執(zhí)行BEGIN ...END語句!

3.2 查詢觸發(fā)器

查詢所有觸發(fā)器:

SHOW TRIGGERS;

查詢指定的觸發(fā)器:

select * from information_schema.triggers where trigger_name='trig1';

所有觸發(fā)器信息都存儲(chǔ)在information_schema數(shù)據(jù)庫(kù)下的triggers表中,可以使用SELECT語句查詢,如果觸發(fā)器信息過多,最好通過TRIGGER_NAME字段指定查詢。

3.3 刪除觸發(fā)器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

示例如下:

DROP TRIGGER IF EXISTS trig1

刪除觸發(fā)器之后最好使用上面的方法查看一遍。

3.4 總結(jié)

觸發(fā)器盡量少的使用,因?yàn)椴还苋绾?,它還是很消耗資源,如果使用的話要謹(jǐn)慎的使用,確定它是非常高效的:觸發(fā)器是針對(duì)每一行的;對(duì)增刪改非常頻繁的表上切記不要使用觸發(fā)器,因?yàn)樗鼤?huì)非常消耗資源。

四、序列

在 MySQL 中,可以有如下幾種途徑實(shí)現(xiàn)唯一值:

  • 自增序列
  • 程序自定義
  • UUID() 函數(shù)
  • UUID_SHORT() 函數(shù)

4.1 自增序列

在mysql中,一般我們可以給某個(gè)主鍵字段設(shè)置為自增模式,例如:

#創(chuàng)建一個(gè)表test_db,字段內(nèi)容為id,name
create table test_db(id int,name char(10));

# 設(shè)置id主鍵
alter table test_db add primary key(id);

# 將id主鍵設(shè)置為自增長(zhǎng)模式
alter table test_db modify id int auto_increment;

這種模式,在單庫(kù)單表的時(shí)候,沒啥問題,但是如果要對(duì)test_db表進(jìn)行分庫(kù)分表,這個(gè)時(shí)候問題就來了,如果水平分庫(kù),這個(gè)時(shí)候向test_db_1、test_db_2中插入數(shù)據(jù),就會(huì)出現(xiàn)相同的ID!

4.2 程序自定義

當(dāng)然,為了避免出現(xiàn)這種情況,有的大神就自己?jiǎn)为?dú)創(chuàng)建了一張自增序列表,單獨(dú)維護(hù),這樣就不會(huì)出現(xiàn)在分表的時(shí)候出現(xiàn)相同的ID!

實(shí)現(xiàn)過程也很簡(jiǎn)單!

創(chuàng)建一個(gè)序列表:

CREATE TABLE `sequence` (
`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',
`current_value` int(11) NOT NULL COMMENT '序列的當(dāng)前值',
`increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

創(chuàng)建–取當(dāng)前值的函數(shù):

BEGIN 
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END

創(chuàng)建–取下一個(gè)值的函數(shù):

DROP FUNCTION IF EXISTS nextval; 
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;

創(chuàng)建–更新當(dāng)前值的函數(shù):

DROP FUNCTION IF EXISTS setval; 
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;

最后,直接通過函數(shù)調(diào)用,測(cè)試如下:

# 添加一個(gè)sequence名稱和初始值,以及自增幅度
INSERT INTO sequence VALUES ('testSeq', 0, 1);

#設(shè)置指定sequence的初始值
SELECT SETVAL('testSeq', 10);

#查詢指定sequence的當(dāng)前值
SELECT CURRVAL('testSeq');

#查詢指定sequence的下一個(gè)值
SELECT NEXTVAL('testSeq');

這方案,某種情況下解決了分表的問題,但是如果分庫(kù)還是會(huì)出現(xiàn)相同的ID!

4.3 UUID() 函數(shù)

UUID 基于 16 進(jìn)制,由 32 位小寫的 16 進(jìn)制數(shù)字組成,如下:

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

比如d0c754a8-178e-11eb-ae3d-2a7bea22ed3d就是一個(gè)典型的 UUID。

在 MySQL 的UUID()函數(shù)中,前三組數(shù)字從時(shí)間戳中生成,第四組數(shù)字暫時(shí)保持時(shí)間戳的唯一性,第五組數(shù)字是一個(gè)IEEE 802節(jié)點(diǎn)標(biāo)點(diǎn)值,保證空間唯一。

使用 UUID() 函數(shù),可以生成時(shí)間、空間上都獨(dú)一無二的值。據(jù)說只要是使用了 UUID,都不可能看到兩個(gè)重復(fù)的 UUID 值。當(dāng)然,這個(gè)只是在理論情況下。

使用方法也很簡(jiǎn)單,在sql可以直接當(dāng)成函數(shù)調(diào)用即可!

select uuid();

4.4 UUID_SHORT() 函數(shù)

在 MySQL 5.1 之后的版本,提供UUID_SHORT()函數(shù),生成一個(gè)64位無符號(hào)整數(shù),在java中可以用Long類型接受。另外,需要注意的是,server_id 的范圍必須為0-255,并且不支持 STATEMENT模式復(fù)制,否則有可能會(huì)產(chǎn)生重復(fù)的ID:

select UUID_SHORT();

同時(shí),需要注意的是,UUID_SHORT()返回的是unsigned long long類型,在字段類型設(shè)置的時(shí)候,一定要勾選無符號(hào)類型,否則有可能生成的ID超過Long類型最大長(zhǎng)度!

五、用戶權(quán)限

5.1 用戶管理

查詢所有用戶:

select * from mysql.user;

創(chuàng)建用戶:

# 格式
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
# 例子,創(chuàng)建一個(gè)用戶名為admin,密碼123456,可以本地訪問的用戶
CREATE USER 'admin'@'localhost' IDENTIFIED BY '123456';

更改用戶密碼:

# 格式
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
# 例子,將用戶名admin,密碼修改為456789,可以本地訪問的用戶
SET PASSWORD FOR 'admin'@'localhost' = PASSWORD("456789");

刪除用戶:

# 格式
DROP USER 'username'@'host';
# 例子,刪除用戶名為admin的用戶
DROP USER 'admin'@'localhost';

最后刷新操作,使操作生效:

#刷新操作使其生效
flush privileges

5.2 用戶權(quán)限管理

查詢用戶權(quán)限:

# 格式
SHOW GRANTS FOR 'username'@'host'
# 查詢用戶名為 'root'@'%'的權(quán)限信息
SHOW GRANTS FOR 'root'@'%'

給用戶授予某種權(quán)限:

# 格式
GRANT privileges ON databasename.tablename TO 'username'@'host'

說明:

  • privileges:用戶的操作權(quán)限,如SELECT,INSERT,UPDATE、DELETE等,如果要授予所的權(quán)限則使用ALL
  • databasename:數(shù)據(jù)庫(kù)名
  • tablename:表名,如果要授予該用戶對(duì)所有數(shù)據(jù)庫(kù)和表的相應(yīng)操作權(quán)限則可用*表示,如*.*
  • username:用戶名
  • host:可以訪問的域名

在給其他授權(quán)前,請(qǐng)先用管理員賬戶登錄!

(1) 設(shè)置用戶訪問數(shù)據(jù)庫(kù)權(quán)限

設(shè)置用戶testuser,只能訪問數(shù)據(jù)庫(kù)test_db,其他數(shù)據(jù)庫(kù)均不能訪問:

grant all privileges on test_db.* to 'testuser'@'localhost';

設(shè)置用戶testuser,可以訪問mysql上的所有數(shù)據(jù)庫(kù):

grant all privileges on test_db.* to 'testuser'@'localhost';

設(shè)置用戶testuser,只能訪問數(shù)據(jù)庫(kù)testuser的表user_info,數(shù)據(jù)庫(kù)中的其他表均不能訪問:

grant all privileges on test_db.user_info to 'testuser'@'localhost';

(2) 設(shè)置用戶操作權(quán)限

設(shè)置用戶testuser,擁有所有的操作權(quán)限,也就是管理員:

grant all privileges on *.* to 'testuser'@'localhost';

設(shè)置用戶testuser,只擁有【查詢】操作權(quán)限:

grant select on *.* to 'testuser'@'localhost';

設(shè)置用戶testuser,只擁有【查詢/插入/修改/刪除】操作權(quán)限:

grant select,insert,update,delete on *.* to 'testuser'@'localhost';

(3) 設(shè)置用戶遠(yuǎn)程訪問權(quán)限

設(shè)置用戶testuser,只能在客戶端IP為192.168.1.100上才能遠(yuǎn)程訪問mysql:

grant all privileges on *.* to 'testuser'@'192.168.1.100';

設(shè)置所有用戶可以遠(yuǎn)程訪問mysql,修改my.cnf配置文件,將bind-address = 127.0.0.1前面加#注釋掉:

# bind-address = 127.0.0.1

注意:用以上命令授權(quán)的用戶不能給其它用戶授權(quán),如果想讓該用戶可以授權(quán),用以下命令!

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

在結(jié)尾加上WITH GRANT OPTION就可以了!

5.3 關(guān)于root用戶的訪問設(shè)置

可以使用如下命令,來一鍵設(shè)置root用戶的密碼,同時(shí)擁有所有的權(quán)限并設(shè)置為遠(yuǎn)程訪問!

grant all privileges on *.* to 'root'@'%'  identified by '123456';

如果想關(guān)閉root用戶遠(yuǎn)程訪問權(quán)限,使用如下命令即可!

grant all privileges on *.* to 'root'@'localhost'  identified by '123456';

最后使用如下命令,使其生效:

flush privileges;

創(chuàng)建用戶并進(jìn)行授權(quán),也可以使用如下快捷命令:

#例如,創(chuàng)建一個(gè)admin用戶,密碼為admin
grant all privileges on *.* to 'admin'@'%' identified by 'admin';

#刷新MySQL的系統(tǒng)權(quán)限相關(guān)表方可生效
flush privileges;

最后需要注意的是:mysql8,使用強(qiáng)校驗(yàn),所以,如果密碼過于簡(jiǎn)單,會(huì)報(bào)錯(cuò),密碼盡量搞復(fù)雜些!

六、總結(jié)

本文主要圍繞 Mysql 中常用的語法進(jìn)行一次梳理和介紹,這些語法大部分也同樣適用于其他的數(shù)據(jù)庫(kù),例如 oracle、sqlserver、postgres 等等,在數(shù)據(jù)操作欄,除了分頁(yè)函數(shù)以外,基本都是通用的!


分享名稱:常用數(shù)據(jù)庫(kù) SQL 命令詳解(下)
文章鏈接:http://m.5511xx.com/article/ccejohh.html