數據庫學習——04—Mysql高級(視圖、事務、索引)

1、視圖
對於複雜的查詢,往往是有多個數據表進行關聯查詢而得到,如果數據庫因爲需求等原因發生了改變,爲了保證查詢出來的數據與之前相同,則需要在多個地方進行修改,維護起來非常麻煩。
解決辦法:定義視圖

2、視圖是什麼
通俗的講,視圖就是一條SELECT語句執行後返回的結果集。
視圖是對若干張基本表的引用,一張虛表(相當於一張虛擬表),查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟着改變);
方便操作,特別是查詢操作減少複雜的SQL語句,增強可讀性

# 下面寫的是sql的語句


# 視圖知識點
# 通俗的講,視圖是一條select語句執行後的返回的結果集

# 視圖的作用
'''
1、提高了重用性,就像一個函數,方便調用        複雜查詢語句時候創建視圖,簡化代碼
2、對數據庫重構,卻不能影響程序的運行          數據表的改變,卻不影響程序
3、提高了安全性,對不同用戶可以交付不同的權限
4、讓數據更清晰

'''
'''
# 定義視圖
create view 視圖名稱 as select語句;
#舉例:create view v_pro_city as select p.id,p.`province`,c.`city` from provinces as p inner join cities as c on p.`provinceid` = c.provinceid having p.`province`='黑龍江省';

# 當改變原始數據庫中的信息時候,視圖也會跟着改變,這是它的特性。
# 包含以下內容的,視圖不能修改
select子句中包含distinct
select子句中包含組函數
select語句中包含group by 子句
select語句中包含order by 子句
select語句中包含unionunion all等集合運算符
where子句中包含相關子查詢
from子句中包含多個表
如果視圖中有計算列,則不能更新
如果基表中有某個具有非空約束的列未出現在視圖定義中,則不能做insert操作


# 查看視圖
show tables;

# 使用視圖
select * from 視圖名字;

# 刪除視圖
drop view 視圖名稱;        # 注意這裏的view和刪除table不一樣

'''

1、事務
事務廣泛的運用於訂單系統、銀行系統等多種場景

事務命令:表的引擎類型必須是innodb類型纔可以使用事務,這是mysql表的默認引擎


'''
事務:它是一個操作序列,這些操作要麼都執行成功,要麼都不執行,是一個不可分割的工作單位。   廣泛應用於銀行轉賬和訂單信息

事務四大特性:(重要)
1、原子性(Atomicity):一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。
2、一致性(consistency):數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。
3、隔離性(isolation):一個事務所做的修改在最終提交以前,對其他事務是不可見的。在當前客戶端修改數據,在其他客戶端也在修改數據,會發生阻塞的情況,只有當第一個客戶端提交了之後才執行。
4、持久性(durability):一旦事務提交,則其所做的修改會永久保存到數據庫。


# 開啓事務
start transactionselect * from a where name ='juran';
select * from b where name ='lg';
update a set money = money - 200 where id=1;
update b set money = money + 200 where id=1;
commit;

# 事務命令
開啓事務:begin;或者是start transaction#開啓事務後執行修改命令,變更會維護到本地緩存中,而不維護到物理表中
提交事務:commit#將緩存中的數據變更維護到物理表中
回滾事務:rollback#放棄緩存中變更的數據

'''

'''
# 模擬銀行轉賬
create table money (id int unsigned not null primary key auto_increment,num int unsigned not null);
desc money;
insert into money values(1,100),(2,200),(3,0);                    # 創建三個對象
select * from money;
begin;
update money set num =num-100 where id=1;
select * from money;
update money set num =num+100 where id=2;
select * from money;
update money set num =num+100 where id=3;
select * from money;

commit;

'''

注意:修改數據的命令會自動的觸發事務,包括insert、update、delete
而在SQL語句中有手動開啓事務的原因是:可以進行多次數據的修改,如果成功一起成功,否則一起會滾到之前的數據

2、索引
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。
更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度

索引的目的在於提高查詢效率,可以類比字典,如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。


'''
索引的目的:提高查詢效率,類比於查字典

索引是一個特殊的文件,也需要佔用空間
1、主鍵自動建立索引
2、頻繁作爲查詢條件的字段應該建立索引;
3、查詢中與其他的表關聯的字段,外鍵關係建立索引;
4、在高併發的情況下創建複合索引
5、查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序順序(建立索引的順序和排序的順序保持一致)

不適合建立索引的情況:
1、頻繁更新的字段不是和建立索引
2where 條件裏面用不到的字段不創建索引
3、表的記錄太少,表中數據高於300萬條數據的,考慮建立索引
4、數據重複且平均的表字段,比如性別,國籍


查詢效率提高後,插入和修改數據就會變得困難一點
# Index_type 類型主要有兩種BTREE和哈希
mysql> show index from students;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| students |          0 | PRIMARY  |            1 | id          | A         |           8 |     NULL |   NULL |      | BTREE      |         |               | YES     |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
1 row in set (0.07 sec)

mysql> select * from students;
+----+------+------+--------+--------+--------+------------+-----------+
| id | name | age  | high   | gender | cls_id | birth      | is_delete |
+----+------+------+--------+--------+--------+------------+-----------+
|  1 ||   23 | 175.88 ||      1 | NULL       |         0 |
|  3 | 2    |   18 | 188.00 ||      1 | 1997-01-01 |         0 |
|  4 | 3    |    4 | 178.00 ||      1 | 1997-01-01 |         0 |
|  5 | 4    |   20 | 168.00 ||      1 | 1997-01-01 |         0 |
|  6 | 5    |   19 | 178.00 ||      1 | 1997-01-01 |         1 |
|  7 | 小喬 |   18 |   NULL ||   NULL | 1997-01-01 |         0 |
|  8 | 周瑜 |   21 |   NULL ||   NULL | 1997-01-01 |         0 |
|  9 | 空格 |   22 |   NULL ||   NULL | 1997-01-01 |         0 |
+----+------+------+--------+--------+--------+------------+-----------+
8 rows in set (0.00 sec)
************************************************************************************

查看索引
show index from 表名;

創建索引
create [unique] index 索引名稱 on 表名(字段名稱(長度))

刪除索引
drop index 索引名稱 on 表名;


Key_name
--------
PRIMARY       主鍵索引無法刪除


設置查詢索引所用的時間
mysql> set profiling =1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from test1 where title = 'jr-1111';
+---------+
| title   |
+---------+
| jr-1111 |
+---------+
1 row in set (0.01 sec)

mysql> show profiles;
+----------+------------+---------------------------------------------+
| Query_ID | Duration   | Query                                       |
+----------+------------+---------------------------------------------+
|        1 | 0.01391875 | select * from test1 where title = 'jr-1111' |
+----------+------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)
###############################################################

'''

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