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;
更加詳細的解析可以點擊這裏