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)修改表:java
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;
②外鏈接:mysql
左鏈接:(查詢 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);sql
(12)記錄聯合:數據庫
select * from t1 union select * from t2 select * from t1 union all select * from t2
(union和union all的區別:union是將union all查詢出來的結果進行了一次distinct,去除重複後的結果)segmentfault
4.DCL語句安全
(1)受權:建立一個數據庫用戶 z1,具備對 sakila 數據庫中全部表的 SELECT/INSERT 權限:
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';app
(2)收回權限:因爲權限變動,須要將 z1 的權限變動,收回 INSERT,只能對數據進行 SELECT 操做:
revoke insert on sakila.* from 'z1'@'localhost';ide
數字類型,字符串類型,日期和時間類型
1.數值類型函數
2.字符串類型
3.日期類型
(1)算數運算符
(2)比較運算符
(3)邏輯運算符
(4)位運算符
1.字符串函數
2.數值函數
3.日期時間函數
4.其它經常使用函數
1.查詢當前數據庫支持的存儲引擎
Show engines \G
2.Mysql常見存儲引擎對比
(1)Myisam
Mysam是mysql的默認存儲引擎 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參數:
不接受外部傳入的數據,僅返回計算以後的值。
INOUT參數:
須要數據傳入存儲過程通過調用計算後,再傳出返回值。
(具體參考:http://blog.itpub.net/2977396...)
1.什麼是觸發器?
Tigger,監視某種狀況並觸發某種操做