想起來什麼寫什麼比較隨意。
一、連表查詢方式(仔細品味,想想其實超級簡單)
Left join
1、左連接的定義:是以左表爲基礎,根據ON後給出的兩表的條件將兩表連接起來。結果會將左表所有的查詢信息列出,而右表只列出ON後條件與左表滿足的部分。左連接全稱爲左外連接,是外連接的一種。
right join
2、右連接的定義,是以右表爲基礎,根據ON後給出的兩表的條件將兩表連接起來。結果會將右表所有的查詢信息列出,而左表只列出ON後條件與右表滿足的部分。右連接全稱爲右外連接,是外連接的一種。
inner join
3、內連接:使用比較運算符根據每個表共有的列的值匹配兩個表中的行。
二、mysql的索引(看情況使用,也是超級簡單)
mysql的索引分爲單列索引(主鍵索引,唯一索引,普通索引)和組合索引.
關於MySQL索引的好處,如果正確合理設計並且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引的表,單表查詢可能幾十萬數據就是瓶頸,而通常大型網站單日就可能會產生幾十萬甚至幾百萬的數據,沒有索引查詢會變的非常緩慢。還是以WordPress來說,其多個數據表都會對經常被查詢的字段添加索引,比如wp_comments表中針對5個字段設計了BTREE索引。
1、 普通的索引
目的很簡單就是爲了提高訪問的速度。
-直接添加
CREATE INDEX IndexName ON `TableName`(`字段名`(length))
–修改表結構的方式添加索引
ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))
第一種方式 :
CREATE INDEX account_Index ON award(account(10));
第二種方式:
ALTER TABLE award ADD INDEX account_Index(account(10))
2、 唯一索引
創建唯一索引的目的不是爲了提高訪問速度,而只是爲了避免數據出現重複。唯一索引可以有多個但索引列的值必須唯一,索引列的值允許有空值。如果能確定某個數據列將只包含彼此各不相同的值,在爲這個數據列創建索引的時候就應該使用關鍵字UNIQUE,把它定義爲一個唯一索引。
第一種方式 :
CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));
第二種方式:
ALTER TABLE TableName ADD UNIQUE (column_list)
CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(account(10));
3、主鍵索引
不允許有空值,(在B+TREE中的InnoDB引擎中,主鍵索引起到了至關重要的地位)
主鍵索引建立的規則是 int優於varchar,一般在建表的時候創建,最好是與表的其他字段不相關的列或者是業務不相關的列.一般會設爲 int 而且是 AUTO_INCREMENT自增類型的。
4、組合索引
需要加索引的字段,要在where條件中
數據量少的字段不需要加索引
如果where條件中是OR關係,加索引不起作用
符合最左原則
一個表中含有多個單列索引不代表是組合索引,通俗一點講 組合索引是:包含多個字段但是隻有索引名稱
其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);
CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);
個人理解就是一個一個建立普通索引的話太麻煩,不如以一下子就建立一個組合索引。.
注意事項:(組合索引無效的時候)組合和複合一個概念。
對於複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。
所以說創建複合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜索或僅對前幾列執行搜索時,複合索引非常有用;僅對後面的任意列執行搜索時,複合索引則沒有用處。
三、視圖(很有用,但是經常被忽略)
總而言之,使用視圖的大部分情況是爲了保障數據安全性,提高查詢效率。
使用show create view語句查看視圖信息
視圖的更改:
create or replace view view_name as select語句;
在視圖存在的情況下可對視圖進行修改,視圖不在的情況下可創建視圖
刪除:
drop view 視圖名稱;
視圖的作用實在是太強大了,以下是我體驗過的好處:
作用一:
提高了重用性,就像一個函數。如果要頻繁獲取user的name和goods的name。就應該使用以下sql語言。示例:
select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
但有了視圖就不一樣了,創建視圖other。示例
create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
創建好視圖後,就可以這樣獲取user的name和goods的name。示例:
select * from other;
以上sql語句,就能獲取user的name和goods的name了。
作用二:
對數據庫重構,卻不影響程序的運行。假如因爲某種需求,需要將user拆房表usera和表userb,該兩張表的結構如下:
測試表:usera有id,name,age字段
測試表:userb有id,name,sex字段
這時如果php端使用sql語句:select * from user;那就會提示該表不存在,這時該如何解決呢。解決方案:創建視圖。以下sql語句創建視圖:
create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
以上假設name都是唯一的。此時php端使用sql語句:select * from user;就不會報錯什麼的。這就實現了更改數據庫結構,不更改腳本程序的功能了。
作用三:
提高了安全性能。可以對不同的用戶,設定不同的視圖。例如:某用戶只能獲取user表的name和age數據,不能獲取sex數據。則可以這樣創建視圖。示例如下:
create view other as select a.name, a.age from user as a;
這樣的話,使用sql語句:select * from other; 最多就只能獲取name和age的數據,其他的數據就獲取不了了。
作用四:
讓數據更加清晰。想要什麼樣的數據,就創建什麼樣的視圖。經過以上三條作用的解析,這條作用應該很容易理解了吧