Linux資料庫管理——day3——儲存引擎、匹配條件、select完整命令
SQL知識點
1. 在查詢中用 % 實現統配,可在所在位置匹配任意多個(包括0個)任意字元
2. 新增一個欄位值為 '' 代表0個字元,不是空
只有 NULL 代表欄位為空
MySQL體系結構的8個元件:
元件 | 介紹 | |
管理工具 | MySQL軟體附帶的諸多管理命令 | |
連線池 | 介面 | 接收命令 |
分析器 | 檢查語法正確性 和 是否擁有訪問許可權 | |
優化器 | 做基本的儲存檢索的優化 | |
查詢快取 | 儲存部分被查詢的資料,當有人訪問的時候把返回給使用者的資料存在記憶體中 | |
如果使用者查詢的資料在記憶體空間的快取中有,就直接從快取中把資料反饋給客戶端 | ||
儲存引擎 | MySQL服務自帶的功能程式,處理表的處理器 | |
不同的儲存引擎有不同的功能和資料儲存方式 | ||
硬碟檔案系統 | 物理儲存部分 |
儲存引擎
檢視mysql可用引擎:
show egins;
檢視某表使用什麼儲存引擎:
show create table 表名\G;
配置預設儲存引擎,修改配置檔案
system vim /etc/my.cnf
# 在[mysqld]後新增一行: default-storage-engine=想修改的儲存引擎
兩個常用儲存引擎的相關檔案 | ||
myisam | 儲存一個表資訊有3個檔案(/var/lib/mysql/表) | 表.frm(表結構)、 表.myd(表資料)、 表.myi(索引資訊) |
innodb | 儲存一個表資訊有2個檔案(/var/lib/mysql/表) | 表.frm(表結構)、 表.ibd(資料和索引) |
啟用該儲存型別的時候就會建立2個事物日誌檔案(/var/lib/mysql) | iblogfile、ibdata(用來儲存回滾時需要的資料) |
兩個常用儲存引擎的特點和適用情況 | ||
myisam | 支援表級鎖定 | 不支援事務、事務回滾、外來鍵 |
innodb | 支援行級鎖定 | 支援事務、事務回滾 |
使用情況分析:
查詢操作多的表適用myisam引擎,可以起到節省系統資源的作用
因為myisam引擎使用的是表級鎖,有人讀的時候,就會全表加讀鎖,一次加鎖就支援多人併發訪問;
但如果寫的操作多就不適合用該引擎,因為一個人寫,就全表加寫鎖,誰都不能讀或者寫了。
相反寫操作多的表適用innodb引擎,可以加大同步訪問量
因為innodb引擎使用的時行級鎖,所以有人寫的時候,只會限制保護一行資料,不影響其他行的讀寫,這樣提高併發量
但是如果讀操作多,每有一行被讀就加個讀鎖,無故浪費資源。
MySQL鎖機制
作用:主要是為了保護表資料的準確性和資料不被同時修改出衝突
鎖粒度 | |
表級鎖 | 一個鎖對整個表加以限制 |
行級鎖 | 只鎖定某一行 |
頁級鎖 |
鎖型別 | ||
讀鎖 | 共享鎖 | 支援併發讀,但不能寫 |
觸發的操作有:select | ||
寫鎖 | 排他鎖、互斥鎖 | 獨佔操作,不能寫和讀 |
觸發的操作有:insert update delete |
檢視鎖狀態:
show status like 'table_lock%';
MySQL事務
可以把一次操作當作是一個事務。
事務特性(ACID) | ||
Atomic | 原子性 | 事物整個操作是一個整體,要不全部成功代表成功,要不一個失敗代表全部失敗 |
Consistency | 一致性 | 事物操作前後,表中記錄沒有變化 |
Isolation | 隔離性 | 事物操作是隔離,相互不受影響 |
Durability | 永續性 | 資料一旦提交不可改變,但是如果引擎支援回滾,資料提交前可以回滾找回資料 |
檢視事務的提交狀態:
show variables like 'autocommit'
# 臨時在當前終端關閉自動提交,如果想永久設定就修改主配置檔案,不過不建議,因為一旦忘記提交,資料有丟失的風險
set autocommit=off
資料回滾
rollback;
提交資料
commit;
附: 可以在mysql下執行系統命令,只需要在正常命令前加上system
例如 在mysql介面使用 system vim /etc/my.cnf 就可以修改主配置檔案
資料匯入
0. 配置搜尋路徑(可以使用預設的路徑)
0.0 檢視當前搜尋路徑
show variables like 'secure_file_priv';
0.1 修改搜尋路徑,就需要修改系統中mysql的配置檔案/etc/my.cnf
system vim /etc/my.cnf
# 在[mysqld]後新增一行: secure_file_priv='新的搜尋目錄'
0.2 建立新的搜尋目錄並且賦權和重啟服務
system mkdir 新的搜尋目錄
system chown mysql 新的搜尋目錄
system systemctl restart mysqld
1. 建立庫和準備儲存資料的表,表結構必須和將被匯入的資料結構完全相同,並且每個資料都支援對應欄位的資料型別
create table 表 (
欄位的各個資訊,
………………
);
2. 匯入資料 (這裡分隔符號必須根據原資料檔案資料的分隔標示進行配置)
load data infile "/必須是系統配置的搜尋目錄/匯入資料的檔名"
into table 已經建立好、每列資料型別相符的表
fields terminated by "列分隔符"
lines terminated by "行分隔符(一般都是 \n 代表換行)";
# 建立好後,我們可以給表中所有行加上序號
# alter table 表 add id int(2) primary key auto_increment first;
資料匯出
0. 配置搜尋路徑(可以使用預設的路徑)
1. 匯出資料 (這裡的分隔符號,根據個人喜好進行定義)
SQL查詢語句 into outfile "/必須是系統配置的搜尋目錄/匯出檔名"
fields terminated by "列分隔符"
lines terminated by "行分隔符(一般都是 \n 代表換行)";
匹配條件
數值比較 | ||||
= | 等於 | != | 不等於 | |
> | 大於 | < | 小於 | |
>= | 大於等於 | <= | 小於等於 | |
可以直接使用兩個欄位比較 a<b 也可以欄位和具體數字比較 a<=0 |
字元比較 | ||||
= | 等於 | != | 不等於 | |
is null | 匹配空值 | is not null | 匹配非空 | |
可以直接兩個欄位比較 a!=b | ||||
也可以欄位和具體字元比較,但是具體字串必須用' '或者" "引起來 a='hello' | ||||
在資料庫中,值為空,是用NULL代表,而不是什麼都不寫,所以 a is null 不等價於 a='' ,也不能用 a = null 來代替。 |
範圍匹配 | |
in (值1,值2) | 匹配這幾個值中的值 |
select 所有想顯示的欄位 from 表 where 欄位 in (值1,值2); | |
not in (值1,值2) | 匹配不在這幾個值的任意值 |
select 所有想顯示的欄位 from 表 where 欄位 not in (值1,值2); | |
between 數字1 and 數字2 | 匹配數字在這範圍內的所有 |
可以等價於: ( 欄位>=數字1 and 欄位<=數字2 ) | |
select 所有想顯示的欄位 from 表 where 欄位 between 數字1 and 數字2; | |
distinct 欄位 | 去除重複顯示 |
select distinct 所有想顯示的欄位 from 表 | |
唯一的一種匹配,只能用於select,其他命令都不能用 | |
不過建議不要多個欄位,因為在去重顯示的時候,為了顯示所有不同資料,可能有些欄位還是會出現重複 |
邏輯匹配(用來連線多個匹配條件) | ||
or | 邏輯或 | 即or前匹配失敗並且or後匹配失敗才算失敗,其他都是算匹配成功 |
and | 邏輯與 | 即and前匹配成功並且and後匹配成功才算成功,其他都是算匹配失敗 |
! 、 not | 邏輯非 | 即讓邏輯符號後的匹配的結果取反,原來匹配成功的當作不成功 |
() | 提高優先順序 | 可以理解為四則運算中的括號,不管任何優先順序,先執行括號內的匹配,如果括號內還有括號,就再先執行括號中的括號內的匹配操作 |
邏輯匹配的優先順序,括號提高優先順序所以這裡面匹配是最先考慮的,總體上是從左往右依次匹配,但是and的優先順序高於or,所以要先執行and兩邊的匹配操作,然後再拿結果和or進行結合。 |
模糊查詢
用法: SQL命令 where 欄位 like '萬用字元'
萬用字元: _ 代表任意的單個字元,可以理解為正則中的 .
% 代表匹配任意多個任意字元,可以理解為正則中的 .*
特殊情況:
1. where 欄位 like '__%' # 兩個_和一個%組成
代表欄位中至少有2個字元的資料會匹配成功
2. where 欄位 like '____' # 4個_組成
代表欄位中有且只有4個字元的資料會匹配成功
3. where 欄位 like 'a%b'
代表欄位中以a開頭b結尾的資料會匹配成功
4. where 欄位 like '%'
代表欄位中所有非NULL值都會匹配成功,詳細分析就是
欄位中 0個字元('') 會匹配成功 (也就是 where 欄位 = ''; 匹配出來的欄位資料)
欄位中為空的資料不會匹配成功 (也就是 where 欄位 is null; 匹配出來的欄位資料)
正則查詢 ( 資料庫中的資料不區分大小寫 )
用法: SQL命令 where 欄位 regexp '正則表示式'
支援擴充套件正則
其使用的含義就是,匹配正則表示式的所有欄位的資料就會判定為滿足匹配條件。
五則運算 ( 加減乘除、取餘)
條件: 欄位的資料型別必須是數值型別中的一種,最好是一種整型
符號分別是 + - * / %
用法:欄位1 = 一個數或者一個欄位 +-*/% 一個數或者一個欄位
聚集函式
用法: select 聚集函式(欄位名) from 表名
聚集函式 | |
avg(欄位名) | 統計欄位平均值 |
sum(欄位名) | 統計欄位和 |
min(欄位名) | 統計欄位最小值 |
max(欄位名) | 統計欄位最大值 |
count(欄位名) | 統計欄位的個數 |
全部的統計操作都是不計算NULL的 | |
因為聚集函式中的欄位必須是數值型別,而只有字元型別的欄位才存在 0字元 的情況,所以聚集函式不需要考慮在個特殊情況 |
拓展:
1. 如何顯示某個欄位最大值的行的所有資訊
select * from 表名 where 欄位 = (select max(欄位) from 表名);
2. 如果聚集函式和組連用,那麼就是對組內資料進行操作
select count(*),欄位 from 表名 group by 欄位;
# 就是按照某個欄位進行分組,然後輸出的就是,每個組內有多少個數據
對查詢結果進行排序
用法: SQL命令 order by 欄位 [ asc|desc ]
這字尾的含義是 | ||
asc | 升序(不寫預設該值) | 欄位資料會按照從小到大排列 |
desc | 降序 | 欄位資料會按照從大到小排列 |
對欄位進行分組
用法:SQL命令 group by 欄位
按照欄位分組,欄位內容一樣的分為一組
對查詢結果過濾
用法:SQL命令 having 條件
限制查詢結果的函式
用法:SQL命令 limit N,M;
解釋:如果沒有N,那就預設N為0,就是從第N+1行開始,共顯示M條,最後一定顯示N+M行。
結合起來,SQL命令順序是
select 欄位 from 表 where 條件 group by 欄位 having 條件 order by 欄位 limit N,M
執行順序,也是從左往右,一個一個執行,前一個成功才會進行下一個。