mysql必知必會讀書筆記

本文是mysql必知必會讀書筆記,主要記錄書中介紹的sql語句需要注意的點。具體的sql語法及格式可參見:點擊打開鏈接
檢索:
select 得到的結果是未排序的 除非明確指明排序規則
使用通配符* 檢索數據時,可以檢索到未命名的列,但是檢索效率較低,應儘量在檢索時指定列名。
distinct 作用於所有檢索列,而不是部分列。
檢索出來的行索引從0開始而不是1。
完全限定名是爲了聯合查詢時解決當兩個表有相同列名時列名的二義性

排序:
可以按非檢索字段進行排序。
多字段排序:select * from table order by A desc,B,C desc;

通配符效率低儘量不用,用其他語句替代
% 匹配任意字符任意次數 _ 匹配任意字符一次

正則表達式:
mysql只實現了部分正則表達式。
regexp ‘1000’ like ‘1000’ 將返回不同的值,因爲regexp是部分匹配,而like是全部匹配。當前regexp可以使用定位符^ &完成全部匹配。

聚合函數:運行在多個行,返回單個值。聚合函數以列名做參數(coun可以使用*做參數)
除了count 其他只能運行在單列上。

分組:但個聚合函數,是將這個查詢出來的數據進行處理,沒辦法針對每個部分數據進行處理。而分組將數據分爲多個邏輯組,對每個組進行處理(聚合函數直接作用在每個組)。
having 和 where 用法相同,having 在group by 之後是過濾分組(一次過濾多行),而 where 是過濾行(一次過濾單行)。也可以裏理解爲 where 是分組前進行過濾,而having 是分組後進行過濾。
不要依賴與分組排序。

語句順序:select from where group by order by limit

子查詢:通常用於過濾和計算字段。
過濾 :select * from table where custid in (select custid from tableB)
計算字段:select custid,(select count(xxx) from tableB where cust = custid) from table 每檢索出一行 都會執行一次子查詢

外鍵:字段不是表的主鍵,是其他表的主鍵
外鍵約束:
cascade:主表中刪除,副表的記錄也刪除
restrict:主表刪除時 附表正在使用該外鍵,那麼刪除失敗報錯
set null:主表刪除 副表中使用該外鍵的記錄設置爲null

聯合:where inner join on 聯合越多的表效率越差 (on 後邊的條件 其實是限定 A表的行 對應 B表的哪個行 是限定行和行之間的對應關係)
其實就是多張表做笛卡爾積形成一張表,然後再用where進行過濾
自然聯合:就是手動聲明顯示的列,去除了相同的列名
內部聯合:只檢索出兩邊都存在的行
外部連接:可以檢索出某一側不存在的行 left outer join right outer join

組合:union 聯合是將多個表的列組合起來,組合是將多個查詢結果的行組合起來。union 大部分情況下是 將where 的多個條件 拆分到多個查詢中,只有union all 是where完成不了的(包含了重複行)
限制:多個查詢必須有相同列、聚合函數、列的類型必須相同(或可以進行類型轉換)
組合會自動去除重複的行,不想去除用 union all
如果在union 使用order by 則order by 必須放在最後一個查詢後 。排序針對所有查詢而不是最後一個查詢

全文索引:索引相對於正則表達式和like效率更高。對結果進行了排序,匹配度較高的優先輸出。
步驟:
索引程序從數據庫中讀取數據
索引程序對數據進行分詞處理
索引程序根據分詞建立索引文件
match(字段) agaist(“值”)
查詢擴展:
兩次搜索
第一次:找到匹配行,保存有用的詞
第二次:利用第一次搜索的結果和所有的詞進行匹配
可以按優先級匹配,過濾不匹配的行。

插入:
insert into table(l列名) values(值) values(值)
插入時,忽略的列,必須支持默認值。
insert 插入效率較低,頻繁的插入可能會影響查詢性能,可以一次插入多行,或者insert low_priority into 降低插入的優先級。
將從表中檢索出的數據插入到另一張表:insert into table(l列名) select ......

更新:
update <ignore> table set field = value where condition
如果沒有條件,則更新所有行。ignore如果更新中出現錯誤,則整個操作被取消,恢復到更新前值。可通過set null 刪除某列值

刪除:
delete from table where condition
刪除所有行:更快的方法是使用truncate table,truncate 重新構造一個表刪除原表,delete是逐行刪除。


創建表:
create table tableName
{
fieldName type 是否允許null值 <default> <auto_increment>,
..........
primary_key(fieldName)
}
primary_key:指定主鍵 auto_increment:指定列值自增 default:默認值(不支持函數,只支持常量)
每個表最多隻有一個auto_increment域,並且他必須被索引(如做主鍵)。
外鍵不能跨引擎。
刪除表:drop table tableName
重命名錶名:rename table OldtableName to NewtableName

更改表結構:
添加列: alter table tableName add fieldName
刪除列: alter table tableName drop fieldName

視圖:
語法: create view drop view 更新 = drop + create
視圖是一張虛擬表,是一份動態數據,這份數據是用創建視圖的檢索語句檢索出來的。所以當視圖的源表數據發生更改時,視圖的數據也同步發生改變,而改變視圖的數據,也會對相應的源表進行修改。
視圖的好處:重用檢索語句 賦予用戶某個表的部分列操作權限而不是整個表
特殊性:
(1)若創建視圖時有order by ,則使用視圖時order by會失效
(2)若創建視圖時有where ,則使用視圖時where 會和創建時的where 合併
當視圖中存在 聯合 子查詢 分組 去重 等是不可以更新視圖的數據的。

存儲過程:類似於函數,將多條sql語句封裝在一起,比分開執行sql效率更高。
語法:
調用:call proName(@paramer1,....)
創建:
create procedure proName( [out,in] paramerName type,.............) -- out in 分別代表傳出 傳入
begin

end;
刪除:drop procedure

遊標:針對查詢出的結果集進行逐行操作,只能存在與存儲過程和函數中。
語法:
定義:declare 遊標名 cursor for 檢索語句;
打開:open 遊標名
關閉:close 遊標名 -- 超出作用域會自動關閉
使用:fetch  next from mycursor into id,pname,pprice,pdescription;

觸發器:類似於事件通知
語法:
創建:
CREATE TRIGGER trigger_nametrigger_time -- trigger_time [BEFORE 或 AFTER]
trigger_event ON tbl_name         -- trigger_event [INSERT、UPDATE、DELETE]
FOR EACH ROWtrigger_stmt -- 一個查詢語句或者 begin end的多條語句
刪除:DROP TRIGGER

old new 解釋:old就是表中已有的數據 new就是更改時用戶傳進去的數據
Insert:new是插入的數據
Update:new是更新數據 old是被更新的數據
Delete:old 是刪除的數據


若SQL語句或觸發器執行失敗,MySQL 會回滾事務,有:
①如果 BEFORE 觸發器執行失敗,SQL 無法正確執行。
②SQL 執行失敗時,AFTER 型觸發器不會觸發。
③AFTER 類型的觸發器執行失敗,SQL 會回滾。

詳細語法參見:點擊打開鏈接


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