1. 程式人生 > >《深入淺出mysql》學習筆記

《深入淺出mysql》學習筆記

一:sql分類及語法

1.sql分類:
(1)DDL:資料庫定義語言,用於定義表,列,索引等資料庫物件. create,drop,alter等
(2)DML:資料庫操縱語言,增刪改查資料庫的記錄insert,delete,update,select等
(3)DCL:資料庫控制語言,定義了資料庫的表,欄位,使用者的訪問許可權和安全級別 grant,revoke等
2.DDL語句
(1)建立資料庫:create database test1;
(2)刪除資料庫:drop database test1;
(3)建立表:create table user(name varchar(10),age int(2));
(4)刪除表:drop table user;
(5)修改表:

        alter table user modify name varchar(20);
        alter table user add column sex varchar(10);
        alter table user drop column age;
        Alter table user change age age1 int(4);
        Alter table user rename user1;

3.DML語句
(1)插入記錄insert into user(name,age)values(‘zhangsan’,18);
(2)刪除記錄:delete from user where name=’張三’
(3)更新記錄:update user set age=1 where name=’ 張三’
(4)查詢記錄:select * from user;
(5)查詢不重複的記錄j:select distinct name from user;
(6)排序查詢:select from user order by age desc;
(7)限制排序:select * from user order by age limit 1,30;
(8)聚合:select name,age from user group by age;
(9)聚合後條件:select name,age from user group by age having age > 18;
(having和where的區別:having是聚合後條件,where是聚合前條件)
(10)表連線: 
①內連線:
Select ename,deptname from emp,dept where emp.deptno=dept.deptno;
②外連線:

左連線:(查詢 emp 中所有使用者名稱和所在部門名稱:)        
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;

右連線: 
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;

· 左連線:包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄
· 右連線:包含所有的右邊表中的記錄甚至是左邊表中沒有和它匹配的記錄

(11)子查詢:需要的條件是另一個select的結果
(子查詢的關鍵字主要包括in, not in,=,!=,exists,not exists )
(如果查詢結果數唯一,可用=代替in)
select * from emp where deptno in(select deptno from dept);
select * from emp where deptno = (select deptno from dept limit 1);

(12)記錄聯合:

                select * from t1 union select * from t2
               select * from t1 union all select * from t2

(union和union all的區別:union是將union all查詢出來的結果進行了一次distinct,去除重複後的結果)

4.DCL語句

(1)授權:建立一個數據庫使用者 z1,具有對 sakila 資料庫中所有表的 SELECT/INSERT 許可權:
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';

(2)收回許可權:由於許可權變更,需要將 z1 的許可權變更,收回 INSERT,只能對資料進行 SELECT 操作:
revoke insert on sakila.* from 'z1'@'localhost';

二:mysql支援的資料型別

數字型別,字串型別,日期和時間型別
1.數值型別

clipboard.png

2.字串型別

clipboard.png

3.日期型別

clipboard.png

三.mysdql中的運算子

(1)算數運算子

clipboard.png

(2)比較運算子

clipboard.png

(3)邏輯運算子

clipboard.png

(4)位運算子

clipboard.png

四.mysql中常用的函式

1.字串函式

clipboard.png

2.數值函式

clipboard.png

3.日期時間函式

clipboard.png

4.其它常用函式

clipboard.png

五.表型別(儲存引擎的選擇)

1.查詢當前資料庫支援的儲存引擎

Show engines \G

2.Mysql常見儲存引擎對比

    (Mysql在V5.1之前預設儲存引擎是MyISAM;在此之後預設儲存引擎是InnoDB)

clipboard.png

(1)Myisam

Mysql在V5.1之前預設儲存引擎是MyISAM;在此之後預設儲存引擎是InnoDB
Myisam不支援事務和外來鍵
優勢是訪問速度快

(2)Innodb

Innodb提供事務和外來鍵
佔用磁碟空間保留索引,寫的效率比innodb差

(3)Memory

資料存放在記憶體中
訪問速度非常快(使用hash索引)
但服務一旦關閉,表中的資料丟失

五.選擇合適的資料型別

1.char與varchar?

Char屬於固定長度的字元型別,varchar屬於可變長度的字元型別
所以char處理速度比varchar快得多,但是浪費儲存空間
(但隨著mysql版本的升級varchar的效能也在不斷的提升,所以目前varchar被更多的使用)

2.text與blob?
(1)兩者都能儲存大文字資料
Blob能用來儲存二進位制資料,比如照片
Text只能儲存文字資料,如文章
(2)text和bolo 欄位在進行刪除操作時會出現“空洞”現象(表資料檔案的大小並沒有因為刪除資料而減小),可以使用OPTIMIZE TABLE t; 進行優化操作
(3)採用的優化操作一般是把blob或text列放到一個單獨的表中

3.浮點數與定點數?
(1)定點數:小數點固定在某個位置上的資料。 就好像 0.0000001 ,0.0001111;
(2)浮點數:小數點位置可以浮動的資料。就像數學中的 1222.210^3也可以表示為1.222210^6;
(3)在java中,我們知道System.out.print("7.22-7.0=" + (7.22f-7.0f));的結果並不是0.22而是0.219999,因此在程式中儘量避免浮點數的比較,運算。而是通過定點數進行比較和運算
BigDecimal b1 = new BigDecimal(Double.toString(v1));
(4)資料庫中,float,double表示浮點數
用decimal或numberic表示定點數
所以對於貨幣等敏感資料,用定點數儲存

4.日期型別的選擇?
如果只記錄年份,用year
如果還要記錄時分秒,用datetime
如果考慮不同時區,用timestamp

六.字符集

(1)第一個字符集ASCII
(2)為了處理不同的文字,又出現了幾百種字符集。如iso-8859,GBK,GB2312等
(3)為了統一編碼,國際標準化組織iso制定了國際字符集標準UCS,這種標準採用四位元組編碼,將程式碼空間劃分位組,面,行,格
(4)這種UCS編碼遭到了很多美國計算機協會的反對(sun,apple,ibm等)它們組成了unicode的協會,並推出了unicode1.0(二位元組)
(5)後來為了編碼格式的統一,雙方展開談判,將unicode編碼併入UCS的0組0字面。把它稱作基本多語言文字面(BMP),剩下的兩個位元組做輔助字面和專用字面
(6)其實人們常用到的還是unicode裡的字元(99%),但是要用unicode裡沒有而ucs有的怎麼辦呢?所以制定了UTF-16,後來UTF-16在使用過程中出現了一系列的問題,所以出現了UTF-8(1至4位元組編碼)

七.索引的設計和使用

0.什麼是索引?
系統根據某種演算法,將已有的資料(和未來新增的資料)單獨建立一個檔案,檔案能夠實現快速的匹配資料,並能夠快速的找到對應表中的記錄
1.每種儲存引擎(innodb,myidsam等)對每個表至少支援16個索引,myisam和innodb預設建立的都是BTREE索引,memory儲存引擎預設使用hash索引
2.建立索引:
create index 索引名 on 表名 列命
3.刪除索引
drop index 索引名 on 表名
4.mysql中提供的索引型別?
(1)主鍵索引
(2)唯一索引
(3)全文索引:根據文章內部的關鍵字進行索引
(4)普通索引

八.檢視

1.什麼是檢視?
檢視是一種虛擬存在的表。通俗的講,檢視就是一條SELECT語句執行後返回的結果集。
2.什麼時候用到檢視?
(1)經常用到的查詢或複雜的聯合查詢
(2)涉及到許可權管理(比如表中某部分欄位含有機密資訊,不讓低許可權的使用者看到,可以提供給他們一個適合他們許可權的檢視
3.語句
(1)建立:Create or replace view 檢視名 as + 查詢語句
(2)檢視:show create view 檢視名
(3)刪除:drop view 檢視名
4.檢視的意義
(1)可以節省sql語句(將一條複雜的查詢結果通過檢視儲存)
(2)檢視操作是怎對查詢出來的結果,不會對原資料產生影響,相對安全
(3)更好的進行許可權控制

九.函式

1.什麼是函式?
將一段程式碼封裝到一個結構中,在需要執行程式碼的時候呼叫函式即可(實現了複用)(任何函式都有返回值,因此函式通過select呼叫)
1.函式的分類?
(1)系統函式:系統呼叫好的函式,直接呼叫即可
Select subString(字串,開始,結束)
Select char_length(字串)
(2)自定義函式:
建立語法:create function 函式名(形參列表)
Begin
函式體
Return 型別
End
呼叫: select 函式名();

十.儲存過程

1.儲存過程是什麼?
儲存過程是沒有返回值的函式

2.建立過程?
Create procedure 過程名字(引數列表)
Begin
---過程
End

3.呼叫過程?
(過程沒有返回值,不能用select呼叫。有一個專門的關鍵字call)
Call 過程名();

4.刪除過程
Drop proceddure pro1;

5.過程引數
過程引數還有自己的型別限定(In out inout)

IN引數:
僅需要將資料傳入儲存過程,並不需要返回計算後的該值。

OUT引數:
不接受外部傳入的資料,僅返回計算之後的值。

十.觸發器

1.什麼是觸發器?
Tigger,監視某種情況並觸發某種操作

十一.正規化

參考上篇博文