1. 程式人生 > >Linux資料庫管理——day3——儲存引擎、匹配條件、select完整命令

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
執行順序,也是從左往右,一個一個執行,前一個成功才會進行下一個。