日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)...

發布時間:2025/3/15 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、高級查詢

(1)了解笛卡爾積:笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X?×?Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員,笛卡爾積在SQL中的實現方式既是交叉連接(Cross Join)。所有連接方式都會先生成臨時笛卡爾積表,笛卡爾積是關系代數里的一個概念,表示兩個表中的每一-行數據任意組合。

(2) 關聯查詢(連接查詢)

(a)內連接:內連接與連接順序無關

關聯表中都出現的字段值最終才能出現再結果集中

SELECT * FROM app_order_base a,app_order_details b WHERE a.id=b.goods_id

SELECT * FROM app_order_base a INNER JOIN app_order_details b on a.id=b.goods_id

#通用列字段名稱必須一致,可以去掉重復字段

SELECT * FROM app_order_base a INNER JOIN app_order_details USING(id)

(b)外連接:有主從表之分,與連接順序有關

依次遍歷主表中記錄,與從表中記錄進行匹配;如果匹配到則連接展 示,否則以null填充。

左外連接:left[outer] join on

SELECT * FROM app_order_base a LEFT JOIN app_order_details b on a.id=b.goods_id

右外連接:right[outer] join on

SELECT * FROM app_order_base a RIGHT JOIN app_order_details b on a.id=b.goods_id

自然連接(特殊連接):

自然連接肯定是等值連接,但是等值連接不一定是自然連接

SELECT * FROM app_order_base NATURAL JOIN app_order_details;

查看數據庫編碼

#查看數據庫編碼

SHOW VARIABLES LIKE '%char%'

(3)子查詢(嵌套查詢):

嵌套查詢:將一個查詢的結果當作另一個查詢的條件或者結果集。

子查詢比較接近思考方式,最自然的查詢。

分類

(a)單行子查詢:子查詢的結果有一條

(b)多行子查詢:子查詢的結果有多條

in: in(value,value)

any: =any 相當于in

>any 大于最小值

all: >all 大于最大值

#in和exists的區別:

in 先執行子查詢,將結果返回給主查詢,主查詢繼續執行

exists 先執行主查詢,將主查詢的值依次在子查詢中進行匹配,根據是否匹配返回true和false,如果是true值連接展示,否則不展示

#多表和子查詢

子查詢 --->查詢條件和結果放在一張表中。

查詢結果分布于多張表

關聯查詢

(4)聯合查詢:

關鍵字:union/union all union可以去除重復

2、存儲引擎和事務

(1)存儲引擎(show ENGINES):數據庫底層軟件組織,dbms通過存儲引擎實現對數據的操作,MySQL核心就是存儲引擎。

MySQL中可以設置多種存儲引擎,不同的存儲引擎在索引,存儲,以及策略上是不同的。

數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。不同的存儲引擎提供不同的存儲機制、素引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。Mysql 的核心就是存儲引擎。

InnoDB是事務型數據庫的首選,執行安全性數據庫,行鎖定和外鍵。mysql5.5 之后默認使用。

MyISAM插入速度和查詢效率較高,但不支持事務。

MEMORY將表中的數據存儲在內存中,速度較快。

各個存儲引擎的不同之處:

功能

MyISAM

MEMORY

InnoDB

Archive

存儲限制

256TB

RAM

64TB

None

支持事務

N

N

Y

N

支持全文索引

Y

N

N

N

支持數索引

Y

Y

Y

N

支持哈希索引

N

Y

N

N

支持數據緩存

N

N/A

Y

N

支持外鍵

N

N

Y

N

mysql5.5以前默認存儲引擎為MyISAM:支持全文搜索,不支持事務。

mysql5.5+默認存儲引擎為INNODB:支持事務、行級鎖。

(2)事務:保持數據一致性,一組DML操作要么同時成功,要么同時失敗。

(a)事務的acid特性:

原子性:放在同一事務的一組操作時不可分割的;

一致性:在事務的執行前后整體的狀態保持不變;

隔離性:并發事務之間相互不干擾;

持久性:事務執行之后將永久化到數據庫;

(b) 事務語法(數據庫中):MySQL默認采用事務自動提交。

#查看MySQL的事務自動提交

show variables like 'autocommit'

#修改自動提交

set autocommit = 0; #手動提交事務

set autocommit = 1; #自動提交事務

#顯示開啟事務(begin):

start transaction;

#手動提交事務或回滾

commit; #提交

rollback #回滾

(c)并發事務產生的問題

臟讀:一個事務執行范圍內讀到了另一條未提交的數據;

不可重復讀:一個事務在只讀范圍內,被另一事務修改并提交事務,導致多次讀取事務不一致的問題。

幻讀(虛讀):一個事務只讀范圍內,被另一事務刪除或者添加數據,導致讀取數據不一致問題。

(d)事務隔離級別:

讀未提交:不能處理任何問題;

讀已提交:解決臟讀問題;

可重復讀:解決臟讀和不可重復讀問題;

串行化:解決所有問題,效率較低;

#查看事務隔離級別

SELECT @@tx_isolation

#修改事務隔離級別

set session transaction isolation level

3、存儲程序

(1)、運行于服務器端程序

(2)、優點:

簡化開發,執行效率較高,

(3)缺點:

程序保存在服務器端,占用服務器資源

數據遷移的時候考慮遷移所有的存儲程序

調試編寫程序不方便

(4)、分類

存儲過程:服務器端運行的可重復調用的sql代碼塊,包含名稱,輸入輸出參數,一組sql。

#修改結束標志

delimiter //;

#創建存儲過程

create procedure sel_emp()

begin

#sql

select * from student;

end;

#存儲過程調用

call sel_emp();

#參數的傳入

delimiter //;

create procedure findEmpByNo(in eno int)

begin

selete * from emp where deptno = dno;

end;

call findEmpByNo(20);

#參數的輸出

delimiter //;

create procedure findNameByNo(in eno int,out v_name varchar(20))

begin

select ename into v_name from emp where empno = eno;

end;

call findNameByNo(7788,@v_name);

select @v_name;

存儲函數:存儲在服務器端,有返回值,函數作為sql一部分使用。

delimiter //;

create function findNameByNo(eno int)

returns varchar(20) #返回值類型

DETERMINISTIC #確定的

begin

declare v_name varchar(20);#與上邊定義的一致

select ename from where empon=eno;

return v_name;

end;

#調用

select findNameByNo(7788);

函數和存儲過程的區別:

關鍵字不同

存儲過程三種參數模式實現數據輸入輸出,函數有返回值返回數據

存儲過程可以作為單獨個體執行,函數只能作為sql的一部分執行

觸發器

存儲程序,存儲再服務器端

由事件(增刪改)調用,不能傳參

不要添加過多的觸發器(降低效率)

存儲程序中不能使用事務控制

#創建觸發器

delimiter //;

create trigger tri_user

after delete

on userinfo for each row

begin

#old new

insert into user_bak values(old.uid,old.uname,old.password)

end;

4、清除表中數據的方式:

(1)、清空全部數據,不寫日志,不可恢復,速度很快

truncate table 表名;·

(2)、清空全部數據,寫日志,可恢復,速度很慢

delete from 表名;

本文地址:https://blog.csdn.net/Java_xiaoxinxin/article/details/107319331

如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!

總結

以上是生活随笔為你收集整理的mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。