本文地址:http://www.cnblogs.com/maplefighting/p/7825313.html html
mysql:mysql
一、登陸:mysql -u root -psql
二、建立數據庫:mysqladmin -u root -p create xx;數據庫
三、刪除數據庫: drop xx;緩存
四、選擇數據庫:use xx安全
五、建立數據庫:create table if not exist '.....' (性能優化
'id' INT UNSIGNED AUTO_INCREMENT,服務器
....... 網絡
)併發
PRIMARY KEY('.....','........') 主鍵
六、刪除數據庫:DROP TABLE xx;
七、插入數據:INSERT INTO TABLE ( , ) VALUE ( , )
八、查詢:SELECT col_name,col_id
FORM table_name
[ where .......]
[ OFFSET M ] [ LIMIT N ]
偏移量 返回記錄數
where BINARY ..... 區分大小寫
九、UPDATE:UPDATE table_name SET .....=......
[ where .....]
十、DELETE:DELETE FROM table_name [ WHERE .....]
十一、LIKE:SELECT ......FROM ...... WHERE ....LIKE '%COM';
十二、排序:ORDER BY ....ASC/DESC
1三、GROUP BY:SELECT coalesce(name,'總數'),sum( ) as ....
FROM .....
GROUP BY .......
coalesce(a,b,c) a==null,選b --->b==null時,選c
1四、鏈接:SELECT a.xx,b.xx FROM tb1 a INNER JOIN tb2 b ON a.k = b.k 內鏈接,取交集
LEFT JOIN 左鏈接,讀取左邊所有數據
RIGHT JOIN 右鏈接
1五、事務:BEGIN;開始
COMMIT;提交事務
ROLLBACK;回滾
1六、ALTER:ALTER TABLE tb1 DROP i;
ADD i INT;
MODIFY c char(10);
CHANGE i j BIGINT;
ALTER TABLE tb1 ALTER i SET DEFAULT 100; 修改默認值
ALTER TABLE tb1 RENAME TO tb2; 修改表名
1七、臨時表 關閉客戶端程序時銷燬 temporary
1八、索引:CREATE INDEX index ON mytable(username(length))
1九、外鍵:FOREIGN KEY (parent_id) REFERENCES parents(id)
20、WHERE子句中不能以彙集函數(SUM,AVG....) 爲條件
2一、完整性約束:CONSTRAINT c CHECK(Sno Between......) NOT NULL
2二、IF(ex1, ex2, ex3 ) ex1爲TRUE時,返回ex2,不然返回ex3
IF condition THEN .......
ELSEIF con THEN ....
ELSE .......
END IF
2三、CREATE FUNCTION "sp" (n INT,......)
RETURNS text
BEGIN
DECLARE i INT DEFAULT 0;
SET i = 1;
while i < 11 do
insert ........
set i = i + 1;
end while;
RETURN s;
END $$
repeat
insert......;
set i = i + 1;
util i >= 5
end repeat
-----------
2四、數據庫完整性:實體完整性,參照完整性,用戶定義的完整性
2五、完整性約束:非空約束,惟一約束,主鍵約束,外鍵約束
2六、規範化理論:(1) 清除不合適的數據依賴
(2) 減小重複 (3) 消除冗餘 (4) 解決操做異常
2七、範式:(1) 2NF 消除部分函數依賴
(Sno, Cno ) ----> Sdept, Sno ---> Sdept 存在部分函數依賴
(2) 3NF 不存在部分函數依賴,沒有傳遞依賴
(3) BCNF:只有一個候選碼的3NF
有多個候選碼的3NF,討論剩下屬性有沒依賴關係
(S, J ) --> T , (S, T ) --> J, T--> J 不是BCNF
分解爲 ST(S, T) TJ(T, J )
(4) 4NF 消除非平凡且非函數依賴的多值依賴
2八、數據庫設計:一、需求分析階段 二、概念結構設計階段 三、邏輯結構設計階段 四、物理結構設計階段 五、數據庫實施階段 六、數據庫運行和維護階段
2九、事務是用戶定義的一個數據庫操做序列,要麼全作,要麼全不作
4個特性:原子性,一致性,隔離性,持久性 (ACID)
30、併發控制:封鎖
排他鎖 -->寫鎖 共享鎖-->讀鎖
3一、樂觀鎖:每次拿到數據都認爲別人不會修改,不上鎖,更新時會判斷期間別人有沒去更新數據 使用版本號等機制 cas,mvcc 指定版本號
悲觀鎖:每次都上鎖 表鎖,讀鎖,寫鎖
select ......... for update
3二、查找表中多餘記錄記錄
SELECT * FROM people where peopleid in (
SELECT peopleid FROM people GROUP BY peopleid
HAVING count(peopleid) > 1
)
3三、事務的隔離性:(1) 未提交讀:事務中的修改,即便沒提交,其餘事務也可見,會引發髒讀
(2) 提交讀:一個事務從開始到提交以前,所作的修改對其餘事務不可見,會引發不可重複讀
(3) 可重複讀 (mysql默認) :解決髒讀的問題,也保證可屢次讀取相同的數據。但會出現幻讀
(4) 可串行化:每一行數據都加鎖
幻讀:當某個事務讀取範圍內記錄時。另外一個事務插入,而後再讀取 (2)(3)纔會發生
提交讀的讀鎖是讀完釋放,可重複讀是事務完釋放 (--這個不知道正確與否)
3四、併發操做帶來的數據不一致包括:(1) 幻讀 (新增,刪除) (2) 不可重複讀 (修改) (3)讀髒數據
3五、MVCC 多版本併發控制
SELECT:a、InnoDB 只檢查版本早於當前版本的數據行
b、行的刪除版本要麼未定義,要麼大於當前事務版本號
INSERT:保留當前系統版本號爲行版本號
DELETE:保存行刪除標識
3六、B-樹 (讀作b樹):爲了減小磁盤I/O,把高瘦的二叉查找樹變成矮胖的 每一個節點都帶有具體數據(關鍵字)
m階段B-樹特徵:
(1) 根節點至少有兩個子女
(2) 每一箇中間節點包含 k - 1 個元素和 k 個孩子 m/2 <= k <= m
(3) 每一個葉子節點都包含 k - 1 個元素
(4) 全部葉子節點都位於同一層
InnoDB 使用 B+樹
B+樹
(1) 有k個子樹的中間節點包含有 k 個元素,每一個元素只使用索引,全部數據保存在葉子節點
(2) 全部葉子包含所有元素信息 及指針,自己以關鍵字從小到大排序
(3) 全部中間節點元素同時存在於子節點,在子節點中是最大(或最小的) 元素
區別:單個查詢 B+ 樹比B-樹優勢:
a、中間節點沒有具體數據,能夠容納更多節點元素,即在數據量相同時,能夠更加矮胖,使 I/O次數更少
b、穩定,每次都要查詢到葉子節點
範圍查詢:B-樹須要查詢每一個節點,即一個一個查詢。B+樹能夠經過葉子鏈表查詢 (具體兩種樹的形狀可google或百度搜索)
3七、聚簇索引就是數據的物理存儲順序,一個表只能有一個 ------葉子節點 數據
非聚簇索引的索引順序與數據物理排列順序無關 ----索引
3八、數據庫引擎 :MyISAM,InnoDB (詳細結構可上網查詢)
MyISAM是指向物理塊的指針
InnoDB是聚簇索引,二級索引包含主鍵
InnoDB主索引樹存全部數據,輔助索引存主鍵
MyISAM存數據地址
3九、MyISAM和InnoDB的區別
InnoDB支持事務,MyISAM不支持
MyISAM只支持表鎖,InnoDB 行級鎖
MyISAM 適合執行大量SELECT,InnoDB 支持大量SELECT或UPDATE
MyISAM以文件形式存儲,備份和恢復可對某個表操做,能夠備份覆蓋恢復
40、MySQL性能優化
(1) 查詢緩存 (2) 建立索引 (3) 避免SELECT * (4) 拆分大的DELETE或INSERT語句 (5) 要一行數據時加上limit 1
MySQL客戶端和服務器之間的通訊是半雙工的
4一、執行順序:from --> where --> group by --> having --> select --> order by
4二、statement 和 preparedStatement 的區別
(1) 代碼的可讀性和可維護性
(2) preparedStatement 是預編譯的,屢次執行相同 sql 語句,會直接使用數據庫緩衝區
(3) 安全性, preparedStatement 使用存儲過程執行全部操做,可防止 sql 注入
4三、事務的實現:鏡像拷貝和事務日誌
InnoDB經過 undo log 和 redo log 實現
事務中,每執行SQL語句對數據產生影響,就會記錄相反操做到 undo log 中。每執行一條 SQL,會將操做記錄到 redo log 中,一旦提交,持久化到磁盤
4四、Mysql存儲過程
存儲過程是預編譯的,較快執行速度
能減小網絡流量
數據庫專業人員能夠隨時修改存儲過程,不用修改源程序
create procedure proc1 (OUT s int)
BEGIN
.........
END
存儲過程和函數區別
存儲過程能夠返回多個,函數只能返回一個值
存儲過程只能call調用,函數能夠sql調用
4五、mysql表水平拆分和垂直拆分
水平拆分爲行的拆分,垂直拆分爲列的拆分
分區只是爲了存放數據的區塊,仍是一張表
分表:單表的併發能力提升了,磁盤 I/O 也提升
分區:突破磁盤的讀寫能力
4六、hash 索引
(1) 僅僅知足 「=」 ,「IN」 和 「<=>」 查詢。不能使用範圍查詢
(2) 沒辦法利用索引完成排序
(3) 不能利用部分索引查詢
(4) 在大量重複鍵值狀況下,哈希索引效率低。由於碰撞多。若是是等值查詢,哈希索引相對 B-Tree 等有絕對優點
參考書籍:數據庫系統概論(第5版) 王珊 薩師煊 編著
--------------------------------------------------------------------------------------------------------------
以上爲maplefighting我的筆記整理,若有出錯,歡迎指正