《深入淺出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.數值型別
2.字串型別
3.日期型別
三.mysdql中的運算子
(1)算數運算子
(2)比較運算子
(3)邏輯運算子
(4)位運算子
四.mysql中常用的函式
1.字串函式
2.數值函式
3.日期時間函式
4.其它常用函式
五.表型別(儲存引擎的選擇)
1.查詢當前資料庫支援的儲存引擎
Show engines \G
2.Mysql常見儲存引擎對比
(Mysql在V5.1之前預設儲存引擎是MyISAM;在此之後預設儲存引擎是InnoDB)
(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,監視某種情況並觸發某種操作
十一.正規化
參考上篇博文