MySQL必知必會收貨

1.未排序的表中順序

如果插入的數據沒有排序,那麼數據一般將以它在底層表中出現的順序顯示。這可能是數據最初添加到表中的順序。但是如果後來數據進行過更新或刪除,則這個順序就會受到MySQL重用回收空間的影響。因此如果沒有排序,那麼這個順序是無用的,並且可能是改變的


2.order by子句

order by + 列名,列名…
作用:是讓輸出結果按照列的順序排序輸出,注意這個子句的位置,一定放在from子句之後,一般是放在最後的,如果有limit,就放在limit之前。


3.like

like在sql語句中表示後面根通配符,MySQL中的通配符就只有兩種,%和_,其實也就是模糊查詢。

如果like後面沒有加通配符,那麼like(value)就等同於=value

詳細可以參考通配符講解博客


4.concat

這是MySQL獨有的關鍵詞,用來將多個字段合併爲一個字段。
舉例如下:

select concat(name, '(', id, ')' from table_test);

5.GROUP BY

GROUP BY是用來數據分組的,但是使用有一下幾個注意點:

  • GROUP BY是用來配合聚集函數時,使用較多
  • GROUP BY後面的列不可以是聚集函數(就是MAX,MIN等五個函數)
  • GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前
  • 如果對GROUP BY中列進行篩選,必須使用having而不是where

注意:如果一個段名在sql語句中出現了,並且這個sql語句中有聚集函數和GROUP BY,那麼這個段名不是在聚集函數中作爲參數,就一定在GROUP BY後面.


6.sql中子句的順序

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ukxr7Uyr-1573438657881)(en-resource://database/695:1)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sgIWlDon-1573438657882)(en-resource://database/697:1)]
從上往下的順序也是子句在sql語句中出現的位置順序。


7.主鍵、外鍵和索引

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WsuDRpTf-1573438657882)(en-resource://database/699:1)]
注意

  • 索引其實就是MySQL底層B+樹的鍵值,而在MySQL中InnoDB不能自動地創建索引。而是MySQL會自動爲所有表的主鍵進行索引,但是外鍵字段必須由用戶進行明確的索引。
  • 主鍵確實只能有一個,但是主鍵並不是只能有一列組成,主鍵可以有多列共同構成。比如在創建表時,可以在最後創建主鍵primary_key(列1,列2…)
  • 創建外鍵的語法如下:
[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]

其中
ON DELETE、ON UPDATE表示事件觸發限制,可設參數(被稱爲級聯參數):
① RESTRICT(限制外表中的外鍵改動,默認值)
② CASCADE(跟隨外鍵改動)
③ SET NULL(設空值)
④ SET DEFAULT(設默認值)
⑤ NO ACTION(無動作,默認的)
程序示例:

create table repo_table(
    repo_id char(13) not null primary key,
    repo_name char(14) not null)
    type=innodb;#創建表1

create table busi_table(
    busi_id char(13) not null primary key,
    busi_name char(13) not null,
    repo_id char(13) not null,
    foreign key(repo_id) references repo_table(repo_id))#沒有CONSTRAINT <外鍵名>,會自動創建一個外鍵名,
                                                                       #並且默認是RESTRICT參數。
    type=innodb;#創建表2

以上的語句中,busi_table表中的列repo_id是repo_table表中repo_id列的外鍵


8.聯結

聯結的定義:用來在一條select語句中,關聯多個表,也就是能夠從多個表中搜索符合要求的值。
總共有四種聯結方式,也就是取的集合不一樣。具體可以參考這篇博客:
四種聯結方式


9.存儲過程

存儲過程就類似於函數,將sql語句封裝到一個變量名下,這樣如果想使用這些被封裝的語句,就可以直接調用變量名即可。
具體使用方法
其中關鍵詞OUT表示返回值,而@表示輸入參數,並且利用CALL來調用

但是MySQL中也可以自定義函數,函數使用方法
使用select來調用

注意函數和存儲過程的不一樣

  • 一般來說,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作;用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。
  • 對於存儲過程來說可以返回參數,如記錄集,而函數只能返回值或者表對象。函數只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN類。存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。
  • 存儲過程一般是作爲一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作爲查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。

10.遊標

在MySQL編程中,其實也使用到了遊標這一個概念。當取得結果集以後,就需要使用遊標將結果集中的數據一行行讀出來。
但是在SQL語句中,同樣有遊標的概念,作用也是一樣的,只不過一個是用SQL語句來操作遊標,一個是使用C++或者python來操作遊標。
舉例如下:

create procedure p1()
begin
    declare id int;
    declare name varchar(15);
    -- 聲明遊標指向(select * from class)的結果集
    declare mc cursor for select * from class;
    -- 打開遊標
    open mc;
    -- 獲取一行的結果
    fetch mc into id,name;
    -- 這裏是爲了顯示獲取結果
    select id,name;
    -- 關閉遊標
    close mc;  
end;

遊標只能使用在存儲過程中。


11、觸發器

觸發器是當某一個條件觸發時,自動執行某一動作。
注意:觸發的條件只有三種,insert,update和delete
MySQL中觸發器的創建格式:

create trigger triggerName                          #triggerName是觸發器的名字
after/before insert/update/delete on 表名
for each row                                            #這句話在mysql是固定的
begin
sql語句;                                                   #觸發器執行內容
end;

更加詳細的解析可以點擊這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章