一、連接查詢
mysql的連接查詢,通常都是將來自兩個或多個表的記錄行結合起來,基于這些表之間的共同字段,進行數據的拼接
首先,要確定一個主表作為結果集,然后將其它表的行有選擇性的連接到選定的主表結果上,使用較多的 連接查詢包括:內連接(子查詢)、左連接和右鏈接(外連)。
下面的實驗,均以下兩個表進行實驗
1、內連查詢
mysql中的內連接就是兩張或多張中同時符合某種條件的數據記錄的組合,通常在from子句中使用關鍵字inner join 來連接多張表,并使用on子句設置連接條件,內連接是系統(tǒng)默認的表連接,所以在from子句后可以省略inner 關鍵字,值使用關鍵字join。
同時有多個表時,也可以聯(lián)系使用inner join來實現多表的內連接,不過為了更好的性能,建議最好不要超過三個表。
語法格式:select 表名1.字段1 表名2.字段2 from 表名1 inner join 表名2 on 表名1.字段=表名2.字段;
select info.name,info.score from info inner join info2 on info.name=info2,name;
#查詢info表和info2表中name相同的行,只顯示,info表中的name和score字段數據
2、左連接
左連接也可以被稱為左外連接,?在from子句中使用left join 或者 left outer join 關鍵字來表示。
左連接以左側表為基礎表,接收左表的所有行,并用這些行與右側參考中的記錄進行匹配,也就是說?匹配左表的所有行以及右表中符合條件的行。
select * from info left join info2 on info.name=info2.name;
#左表的內容將全部顯示,右表只會顯示與左表共同字段的記錄,當右表沒有數據將與null顯示
3、右鏈接
右連接也稱為右外連接,在from子句中使用right join 或者right outer join 關鍵字來表示。右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中所有行,并用這些記錄與左表中的行進行匹配。
select * from info right join info2 on info.name=info2.name;
#右表全部的內容顯示,左表只顯示相同字段的記錄,左表不足的地方以null顯示
二、存儲過程
1、存儲過程簡介
存儲過程與函數的直接效果類似,只不過存儲過程,封裝的是一組sql語句。
mysql數據庫過程是一組為了完成特定功能的sql語句的集合。
存儲過程這個功能時從5.0版本才開始支持的,它可以加快數據庫的處理速度,增強數據庫在實際應用中的靈活性。
存儲過程在使用過程中是將常用或復雜的工作預先使用sql語句寫好,并用一個指定的名稱存儲起來,這個過程編譯和優(yōu)化后存儲在數據庫服務器中,當需要使用該存儲過程時,只需要調用它即可。
操作數據庫的傳統(tǒng)sql語句在執(zhí)行時,需要先編譯,然后再去執(zhí)行,跟存儲過程一對比,明顯存儲過程在執(zhí)行速度更快,效率更高。存儲過程在數據庫中創(chuàng)建并保存。它不僅僅是sql了語句的集合,還可以加入一些特殊的控制結構,也可以控制數據的訪問方式。
2、存儲過程的優(yōu)點
執(zhí)行一次后,會將生成的二進制代碼駐留緩沖區(qū),提高執(zhí)行效率
sql語句加上控制語句的集合,靈活性高
在服務器端存儲,客戶端調用時,降低網絡負載
可多次重復被調用,可隨時修改,不影響客戶端調用。
可完成所有的數據庫操作,也可控制數據庫的信息訪問權限
3、語法
create procedure ?<過程名> ([過程參數....]) <過程體>
[過程參數....] 格式
<過程名>:盡量避免與內置的函數或字段重名
<過程體>:語句
[in|out|inout] <參數名><類型>
3.1 參數分類
存儲過程的主題部分,即過程體
以begin 開始,end結束,若只有一條sql語句,可省略begin 和end
以delimiter 開始和結束
3.2 不加參數的存儲過程
delimiter @@ ##將語句的結束符號從分號臨時修改為@@,以防出問題,可以自定義
create proceduer ydq() #創(chuàng)建存儲過程,過程自定義,()可帶參數
begin #過程體以關鍵字begin開始
select * from info; #過程體語句(可有多條)
end @@ #過程體以關鍵字end結尾
delimiter ; #將語句的結束符號恢復為分號
show create proceduer ydq\G
#查看存儲過程信息
call ydq(); #調用存儲過程
以下面兩個表,寫出內連查詢的存儲過程
3.3 帶參數的存儲過程
in輸入參數: in 表示調用者向過程傳入值(傳入值可以是字面量或變量)
out輸出參數: out表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
inout輸入/輸出參數: inout,即表示調用者向過程傳入值,又表示過程向調用者傳入值(只能是變量)
delimiter $$
create procedure ydq01(in inname varchar(40))
begin
create table if not exists ydq(id int(4),name varchar(40),score decimal(5,2));
insert into ydq values(1,'zhangsan',100),(2,'lisi',99);
select * from ydq where name=inname;
end $$
delimiter ;
call ydq01('lisi')
3.4刪除存儲過程
drop procedure if exists ydq;
#刪除ydq存儲過程
3.5 事務和存儲過程有什么區(qū)別?
事務
實際而言,是存儲引擎的特性
目的性: 事務,是為了保證數據的一致性、完整性、原子性、持久性(ACID)
存儲過程
存儲過程中,包含了事務。(要看具體的存儲引擎,因為myisam不支持事務)
存儲過程的目的性: 簡化復雜性操作
? 減少數據庫資源消耗
? 可以通過傳參,方便、靈活的進行sql查詢類操作
三、總結
1、連接查詢
連接查詢分為內連查詢和左查詢、右查詢。
內連接:使用inner join 連接不同的表,顯示的數據為左右表都同時滿足的條件
左連接: 使用left join 連接不同的表,以左表為基礎顯示,去匹配右表顯示滿足條件的記錄
右連接: 使用 right joi 連接不同的表,以右表為基礎顯示,去匹配左表顯示滿足條件的記錄
2、存儲過程
存儲過程是將一些sql語句存儲在集合里面,當需要執(zhí)行這些語句的時候,就可進行call調用這個存儲過程,整體邏輯跟shell中函數一致。文章來源:http://www.zghlxwxcb.cn/news/detail-700697.html
主要可避免提高執(zhí)行sql語句的效率、提高靈活率。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-700697.html
到了這里,關于MySQL 連接查詢和存儲過程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!