查詢數(shù)據(jù)庫中的存儲過程和函數(shù)
創(chuàng)新互聯(lián)公司于2013年成立,公司以網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶數(shù)千家,涉及國內(nèi)多個(gè)省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗(yàn)。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存儲過程
select `name` from mysql.proc where db = 'xx' and `type` = 'FUNCTION' //函數(shù)
show procedure status; //存儲過程
show function status; //函數(shù)
查看存儲過程或函數(shù)的創(chuàng)建代碼
show create procedure proc_name;
show create function func_name;
查看視圖
SELECT * from information_schema.VIEWS //視圖
SELECT * from information_schema.TABLES //表
查看觸發(fā)器
SHOW TRIGGERS [FROM db_name] [LIKE expr]
SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于Oracle旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。
端口是3306。
表很多時(shí),使用linux腳本,需要根據(jù)需要修改一下:
和創(chuàng)建一樣,可以加上 if exists
可兩篇文章:
如:
用于在已有的表中添加、刪除或修改列。
添加 ADD
或
默認(rèn)是添加到最后,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之后
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。
修改字段名 CHANGE
可以把表2的數(shù)據(jù)復(fù)制到表1中,但 不能復(fù)制約束性條件 。
單行
多行,注意 只有一個(gè)VALUES :
不寫 (行1, 行2...) 這一部分的話,默認(rèn)一一對應(yīng)
除了以上方法外,還可以用SET為每一行附上相應(yīng)的值。
假如沒有篩選的話,就給全部都修改了??梢杂? WHERE 篩選。
假如 沒有篩選的話,就給全部刪除了 。相當(dāng)于清空。
清空
先把表刪除,然后再建一個(gè)。與 DELETE FROM 相比, TRUNCATE 的效率更快,因?yàn)? DELETE FROM 是把記錄逐條刪除的。
查詢執(zhí)行的順序
FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT
注意
當(dāng)數(shù)據(jù)很大,上百萬的時(shí)候,使用LIMIT ... OFFSET ..的方式進(jìn)行分頁十分浪費(fèi)資源且耗時(shí)長。最好是結(jié)合WHERE使用,如:
REGEXP 使用正則表達(dá)進(jìn)行匹配。 查詢時(shí),需要搭配WHERE或HAVING使用 。
兩個(gè)表之間有交集且要用到兩個(gè)表的數(shù)據(jù)時(shí),可以使用內(nèi)連接查詢。
LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。
用法:
RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結(jié)果為 NULL。 把LEFT JOIN的表1、表2調(diào)換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個(gè)表中存在匹配,則返回行. 相當(dāng)于結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個(gè)查詢結(jié)果作為另一個(gè)查詢的條件。 如:
EXISTS 用于判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時(shí)執(zhí)行。 如:
索引的本質(zhì)是一種排好序的數(shù)據(jù)結(jié)構(gòu)。利用索引可以提高查詢速度。
常見的索引有:
MySQL通過外鍵約束來保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級聯(lián)操作。
對已有的兩個(gè)表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個(gè)字段,當(dāng)做外鍵
為子表添加外鍵約束條件
假如刪除記錄報(bào)錯(cuò): [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
這是因?yàn)镸ySQL中設(shè)置了foreign key關(guān)聯(lián),造成無法更新或刪除數(shù)據(jù)??梢酝ㄟ^設(shè)置 FOREIGN_KEY_CHECKS 變量來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當(dāng)前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來組合兩個(gè)查詢,如果第一個(gè)查詢返回 M 行,第二個(gè)查詢返回 N 行,那么組合查詢的結(jié)果一般為 M+N 行。
每個(gè)查詢必須包含相同的列、表達(dá)式和聚集函數(shù)。
默認(rèn)會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個(gè) ORDER BY 子句,并且必須位于語句的最后 。
內(nèi)置函數(shù)很多, 見: MySQL 函數(shù)
我們一般使用 START TRANSACTION 或 BEGIN 開啟事務(wù), COMMIT 提交事務(wù)中的命令, SAVEPOINT : 相當(dāng)于設(shè)置一個(gè)還原點(diǎn), ROLLBACK TO : 回滾到某個(gè)還原點(diǎn)下
一般的使用格式如下:
開啟事務(wù)時(shí), 默認(rèn)加鎖
根據(jù)類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫服務(wù)器實(shí)現(xiàn),行鎖由存儲引擎實(shí)現(xiàn)。
除此之外,我們可以顯示加鎖
加鎖時(shí), 如果沒有索引,會鎖表,如果加了索引,就會鎖行
InnoDB默認(rèn)支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競爭的時(shí)候就會出現(xiàn)死鎖的情況
解決方法:
即ACID特性:
由于并發(fā)事務(wù)會引發(fā)上面這些問題, 我們可以設(shè)置事務(wù)的隔離級別解決上面的問題.
MySQL的默認(rèn)隔離級別(可重復(fù)讀)
查看當(dāng)前會話隔離級別
方式1
方式2
設(shè)置隔離級別
主從集群的示意圖如下:
主要涉及三個(gè)線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由于MySQL主從集群只會從主節(jié)點(diǎn)同步到從節(jié)點(diǎn), 不會反過來同步, 所以需要讀寫分離
讀寫分離需要在業(yè)務(wù)層面實(shí)現(xiàn) , 寫數(shù)據(jù)只能在主節(jié)點(diǎn)上完成, 而讀數(shù)據(jù)可以在主節(jié)點(diǎn)或從節(jié)點(diǎn)上完成
索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)
MySQL的索引有
推薦兩個(gè)在線工具:
簡單來說, B樹是在紅黑樹(一個(gè)平衡二叉樹)的基礎(chǔ)上將一個(gè)節(jié)點(diǎn)存放多個(gè)值, 實(shí)現(xiàn)的, 降低了樹的高度, 每個(gè)節(jié)點(diǎn)都存放索引及對應(yīng)數(shù)據(jù)指針, 同一層的節(jié)點(diǎn)是遞增的
而B+樹在B樹的基礎(chǔ)上進(jìn)行優(yōu)化, 非葉子節(jié)點(diǎn)存放 子節(jié)點(diǎn)的開始的索引, 葉子節(jié)點(diǎn)存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點(diǎn)之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見的 MyISAM 和 InnoDB
MyISAM 的B+樹葉子節(jié)點(diǎn)存放表數(shù)據(jù)的指針, InnoDB 的B+樹葉子節(jié)點(diǎn)存放處主鍵外的數(shù)據(jù)
其他的:
即多個(gè)列組成一個(gè)索引, 語法:
由于聯(lián)合索引的B+樹的結(jié)構(gòu), 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會全表掃描
如果你對列進(jìn)行了 (+,-,*,/,!) , 那么都將不會走索引。
OR 引起的索引失效
OR 導(dǎo)致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個(gè)字段,那么索引 不會失效 , 反之索引失效 。
這個(gè)我相信大家都明白,模糊搜索如果你前綴也進(jìn)行模糊搜索,那么不會走索引。
這兩種用法,也將使索引失效。另 IN 會走索引,但是當(dāng)IN的取值范圍較大時(shí)會導(dǎo)致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引
不走索引。
走索引。
所以設(shè)計(jì)表的時(shí)候, 建議不可為空, 而是將默認(rèn)值設(shè)置為 "" ( NOT NULL DEFAULT "" )
1.字符串函數(shù)
char_lengt()
concat()
instr()
lcase()
left()
ltrim()
mid()
2.時(shí)間函數(shù)
now()
curdate()
curtime()
datediff()
date_add()
數(shù)學(xué)函數(shù)
abs()
ceiling()
floor()
pow()
rand()
round()
其他函數(shù)
md5()
version()
database()
UUID()
同一使用select 函數(shù)名(參數(shù)列表)
一、關(guān)鍵字執(zhí)行順序
1、查詢中用到的關(guān)鍵詞主要包含六個(gè),并且他們的順序依次為 :
select--from--where--group by--having--order by 其中select和from是必須的,其他關(guān)鍵詞是可選的。
這六個(gè)關(guān)鍵詞的執(zhí)行順序,與sql語句的書寫順序并不是一樣的,而是按照下面的順序來執(zhí)行
from--where--group by--having--select--order by。
注意:雖然select在having后執(zhí)行,但是mysql中仍然可以在having中使用select語句定義的別名。
原因分析:mysql在查詢的時(shí)候會產(chǎn)生一個(gè)臨時(shí)表,所有的字段名稱(別名)在臨時(shí)表中已經(jīng)產(chǎn)生,產(chǎn)生了臨時(shí)表之后才會進(jìn)行having操作。也就是說mysql內(nèi)部有一定的解析順序,解析順序select優(yōu)先于having。在這里我個(gè)人認(rèn)為是mysql可能沒有將這一點(diǎn)做規(guī)范。Oracle中having無法使用select語句內(nèi)的別名。
2、insert into 和replace into和merge into
insert into是mysql的基本插入語句。replace into 是mysql中的代替插入語句,可以理解為insert into的升級版。replace into在執(zhí)行的時(shí)候,首先會根據(jù)指定的主鍵或者唯一索引判斷當(dāng)前表中是否存在指定的主鍵或索引,如果主鍵或唯一索引已經(jīng)存在,則先將對應(yīng)的索引的數(shù)據(jù)刪除,然后在索引位置插入replace into中包含的數(shù)據(jù)。如果主鍵和唯一索引沒有存在,則直接在索引位置插入replace into中包含的數(shù)據(jù)。merge into 是oracle數(shù)據(jù)庫中的代替插入語句。實(shí)現(xiàn)方式和replace into類似。執(zhí)行效率:如果指定索引位置沒有數(shù)據(jù),insert into和replace into執(zhí)行效率相差無幾,二者效率相同。如果指定位置索引已經(jīng)存在,insert into語句不能正常執(zhí)行,replace into語句可以正常執(zhí)行。注意:雖然replace into比較好使用,但是也存在一定風(fēng)險(xiǎn):replace每次要重新分配自增id;replace中執(zhí)行delete時(shí), 在有外鍵的情況下會很麻煩;如果delete時(shí)定義的有觸發(fā)器, 則會被執(zhí)行;副作用也會被傳播到replica slave.推薦使用INSERT INTO … ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE是mysql特有的一個(gè)sql關(guān)鍵字,只能在mysql中使用。
在MySQL數(shù)據(jù)庫中,如果在insert語句后面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現(xiàn)有記錄的惟一索引或主鍵中產(chǎn)生重復(fù)值,那么就會發(fā)生舊行的更新;如果插入的行數(shù)據(jù)與現(xiàn)有表中記錄的唯一索引或者主鍵不重復(fù),則執(zhí)行新紀(jì)錄插入操作。
比如有這樣一張表:
create table func(id int primary key,count int,birthday date);
insert into func values(1,1,'1990-09-09');--插入一條數(shù)據(jù)
insert into func values(1,1,'1990-09-09') on duplicate key update count = count+1;--表中有數(shù)據(jù),刪除原表數(shù)據(jù),將新數(shù)據(jù)插入。
提示兩行受到影響,說明先執(zhí)行的刪除操作,然后插入新的數(shù)據(jù)。
觀察到?jīng)]有任何新數(shù)據(jù)插入,count字段被更新。(count字段更新是因?yàn)閯倓偟牟迦胝Z句中書寫了update count = count+1;)
如果不希望任何字段更新,可以寫成如下格式:
insert into func values(1,1,'1990-09-09') on duplicate key update count = values(count);--再次執(zhí)行,沒有新數(shù)據(jù)插入到數(shù)據(jù)庫中。
二、mysql內(nèi)置函數(shù)
內(nèi)置函數(shù)眾多,不需要每一個(gè)都掌握,熟練掌握幾個(gè)在以后使用即可。可以查看mysql官方文檔學(xué)習(xí)內(nèi)置函數(shù)。
三、其它注意事項(xiàng)
1、在已經(jīng)存在的表中添加外鍵。(僅作為了解內(nèi)容)
alter table tb_name add constraint fk_name foreign key (tb_name.id) references tb_stu(id);
例如:alter table emp add constraint forkey foreign key(dept_id) references dept(id);
該語句是在 tb_name表上添加一個(gè)外鍵約束,引用 tb_stu的主鍵,fk_name是約束的名字。
刪除約束:alter table tb_name drop constraint fk_name ;
2、外鍵的使用情景:
在不要求吞吐速度而對數(shù)據(jù)的正確性和安全性要求較高時(shí),推薦使用外鍵。
如果面對高吞吐量,要求優(yōu)先保證讀取效率時(shí),則不推薦使用外鍵。
3、刪除的時(shí)候使用別名:
原句:delete from employee where id = 1;
別名:delete e from employee as e where id =1;
新聞名稱:怎么看mysql內(nèi)置函數(shù),mysql常見函數(shù)
標(biāo)題URL:http://aaarwkj.com/article18/hchjdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、Google、軟件開發(fā)、靜態(tài)網(wǎng)站、企業(yè)建站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)