1. SQL語句分類
- DDL(Data Definition Language):數(shù)據(jù)定義語言,用來定義數(shù)據(jù)庫對(duì)象:庫焦蘑、表、列等盒发。功能:創(chuàng)建例嘱、刪除、修改庫和表結(jié)構(gòu)宁舰。
- DML(Data Manipulation Language):數(shù)據(jù)操作語言拼卵,用來定義數(shù)據(jù)庫記錄:增、刪蛮艰、改表記錄腋腮。
- DCL(Data Control Language):數(shù)據(jù)控制語言,用來定義訪問權(quán)限和安全級(jí)別。
- DQL(Data Query Language):數(shù)據(jù)查詢語言即寡,用來查詢記錄亿絮。也是本章學(xué)習(xí)的重點(diǎn)顶吮。
2. SQL數(shù)據(jù)中的屬性類型
- TINYINT:1字節(jié)横堡,小整數(shù)值玻靡。
- SMALLINT:2字節(jié),大整數(shù)值墩蔓。
- MEDIUMINT:3字節(jié)梢莽,大整數(shù)值。
- INT或INTEGER:4字節(jié)奸披,整型,大整數(shù)值昏名。
- FLOAT:單精度浮點(diǎn)數(shù)值。
- DOUBLE(5,2):雙精度浮點(diǎn)型數(shù)值阵面,參數(shù)表示該浮點(diǎn)型數(shù)值最多有5位轻局,其中必須有2位小數(shù)。
- DECIMAL(M,D):小數(shù)值,參數(shù)表示該數(shù)值最多有M位膜钓,其中必須有D位小數(shù)嗽交。
- CHAR:字符型卿嘲,固定長度字符串類型:char(255)颂斜。你存入一個(gè)a字符,雖然a只占一個(gè)字符拾枣,但是它會(huì)自動(dòng)給你加254個(gè)空格湊成255個(gè)長度沃疮。即數(shù)據(jù)的長度不足指定長度,它會(huì)補(bǔ)足到指定長度梅肤。
- VARCHAR:可變長度字符串類型:- varchar(65535),你存入的數(shù)據(jù)多長它就是多長司蔬。它會(huì)抽出幾個(gè)字節(jié)來記錄數(shù)據(jù)的長度。
- TEXT(CLOB):mysql獨(dú)有的數(shù)據(jù)類型姨蝴,字符串類型俊啼。
- BLOB:字節(jié)類型。
- YEAR:年份值左医,格式為:YYYY
- DATA:日期類型授帕,格式為:yyyy-MM-dd。
- TIME:時(shí)間類型浮梢,格式為:hh:mm:ss跛十。
- TIMESTAMP:時(shí)間戳類型,格式為上面二者的綜合秕硝。
- DATETIME:混合日期和時(shí)間值芥映,格式為:YYYYMMDD HHMMSS.
3. SQL語句詳解
當(dāng)然首先需要再命令行中輸入mysql -uroot -p來進(jìn)入mysql。注意:1.MySQL語法不區(qū)分大小寫,但是建議在寫關(guān)鍵字時(shí)用大寫奈偏。2.每一條語句后面以分號(hào)結(jié)尾坞嘀。
3.1DDL(數(shù)據(jù)定義語言)語法
該語言用來對(duì)數(shù)據(jù)庫和表結(jié)構(gòu)進(jìn)行操作。
對(duì)數(shù)據(jù)庫的操作:
查看所有數(shù)據(jù)庫:SHOW DATABASES;
使用數(shù)據(jù)庫:USE 數(shù)據(jù)庫名;
創(chuàng)建數(shù)據(jù)庫并指定編碼:CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫名 [DEFAULT CHARACTER SET UTF8];
刪除數(shù)據(jù)庫:DROP DATABASE 數(shù)據(jù)庫名;
修改數(shù)據(jù)庫的編碼:ALTER DATABASE 數(shù)據(jù)庫名 CHARACTER SET UTF-8;
對(duì)表結(jié)構(gòu)的操作
創(chuàng)建表:
CREATE TABLE (IF NOT EXISTS)表名(
列名 列類型霎苗,
...姆吭,
列名 列類型,
)
- 查看當(dāng)前數(shù)據(jù)庫中所有表:SHOW TABLES;
- 查看表結(jié)構(gòu):DESC 表名;
- 刪除表:DROP 表名;
- 修改表:修改表有5個(gè)操作唁盏,但前綴都是一樣的:ALTER TABLE 表名...
- 修改表之添加列:ALTER TABLE 表名 add (列名 列類型内狸,...,列名 列類型);
- 修改表之修改列類型:ALTER TABLE 表名 MODIFY 列名 列的新類型;
- 修改表之列名稱列類型一起修改:ALTER TABLE 表名 CHANGE 原列名 新列名 列名類型;
- 修改表之刪除列:ALTER TABLE 表名 DROP 列名;
- 修改表之修改表名:ALTER TABLE 表名 RENAME TO 新表名
3.2DML(數(shù)據(jù)操作語言)語法
該語言用來對(duì)表記錄操作(增厘擂、刪昆淡、改)。
3.2.1插入數(shù)據(jù)(一次插入就是插入一行)
insert into 表名 (列名1刽严,列名2昂灵,列名3) values (列值1,列值2舞萄,列值3)
說明:1.在數(shù)據(jù)庫中所有的字符串類型眨补,必須使用單引號(hào)。2.(列名1倒脓,列名2撑螺,列名3)可省略,表示按照表中的順序插入崎弃。但不建議采取這種寫法甘晤,因?yàn)榻档土顺绦虻目勺x性。3.在命令行插入記錄不要寫中文饲做,否則會(huì)出現(xiàn)亂碼(解決控制臺(tái)的亂碼問題后便可插入中文线婚,至于如何解決亂碼問題請參考我的下篇文章)。
3.2.2修改記錄(不會(huì)修改一行)
修改某列的全部值:update 表名 set 列名1=列值1(盆均,列名2=列值2);
修改(某行或者多行記錄的)列的指定值:update 表名 set 列名1=列值1 where 列名2=列值2 or 列名3=列值3;
運(yùn)算符:=塞弊、!=、<>泪姨、<游沿、>、>=驴娃、<=奏候、between...and、in(…)唇敞、is null蔗草、not咒彤、or、and咒精,其中in(…)的用法表示集合镶柱。例如:update 表名 set 列名1=列值1 where 列名2=列值2 or 列名2=列值22用in(…)寫成update 表名 set 列名1=列值1 where 列名2 in(列值2,列值3)
3.2.3刪除數(shù)據(jù)(刪除整行)
delete from 表名 (where 條件);不加where條件時(shí)會(huì)刪除表中所有的記錄模叙,所以為了防止這種失誤操作歇拆,很多數(shù)據(jù)庫往往都會(huì)有備份。
3.3DCL(數(shù)據(jù)控制語言)語法
該語言用來定義訪問權(quán)限范咨,理解即可故觅,以后不會(huì)多用。需要記住的是渠啊,一個(gè)項(xiàng)目創(chuàng)建一個(gè)用戶输吏,一個(gè)項(xiàng)目對(duì)應(yīng)的數(shù)據(jù)庫只有一個(gè)。這個(gè)用戶只能對(duì)這個(gè)數(shù)據(jù)庫有權(quán)限替蛉,其它數(shù)據(jù)庫該用戶就操作不了贯溅。
3.3.1創(chuàng)建用戶
用戶只能在指定ip地址上登錄mysql:create user 用戶名@IP地址 identified by ‘密碼’;
用戶可以在任意ip地址上登錄:create user 用戶名@‘%’ identified by ‘密碼’躲查;
3.3.2給用戶授權(quán)
語法:grant 權(quán)限1它浅,…,權(quán)限n on 數(shù)據(jù)庫.* to 用戶名@IP地址镣煮;其中權(quán)限1姐霍、2、n可以直接用all關(guān)鍵字代替怎静。權(quán)限例如:create,alter,drop,insert,update,delete,select邮弹。
3.3.3撤銷授權(quán)
語法:revoke 權(quán)限1黔衡,…蚓聘,權(quán)限n on 數(shù)據(jù)庫.* from 用戶名@ ip地址;撤銷指定用戶在指定數(shù)據(jù)庫上的指定權(quán)限盟劫。撤銷例如:revoke create,delete on mydb1.* form user@localhost;表示的意思是撤消user用戶在數(shù)據(jù)庫mydb1傷的create夜牡、alter權(quán)限。
3.3.4查看權(quán)限
查看指定用戶的權(quán)限:show grants for 用戶名@ip地址侣签;
3.4DQL(數(shù)據(jù)查詢語言)語法
重點(diǎn)塘装,該語言用來查詢記錄,不會(huì)修改數(shù)據(jù)庫和表結(jié)構(gòu)影所。
3.4.1基本查詢(后綴都是統(tǒng)一為from 表名)
- 1.字段(列)控制1.查詢所有列:select * from 表名;
其中*表示查詢所有列蹦肴,而不是所有行的意思。 - 2.查詢指定列:select 列1猴娩,列2阴幌,列n from 表名勺阐;
- 3.完全重復(fù)的記錄只顯示一次:在查詢的列之前添加distinct:select distinct $ from 表名;
缺省值為all矛双。 - 4.列運(yùn)算a.數(shù)量類型的列可以做加渊抽、減、乘议忽、除:SELECT sal*5 from 表名懒闷;
說明:
1.遇到null加任何值都等于null的情況,需要用到ifnull()函數(shù)栈幸。
2.將字符串做加減乘除運(yùn)算愤估,會(huì)把字符串當(dāng)作0。b.字符串累類型可以做連續(xù)運(yùn)算(需要用到concat()函數(shù)):select concat(列名1速址,列名2) from 表名;其中列名的類型要為字符串灵疮。c. 給列名起別名:select 列名1 (as) 別名1,列名2 (as) 別名2 from 表名;
2.條件控制
1.條件查詢壳繁。在后面添加where指定條件:select * from 表名 where 列名=指定值;
2.模糊查詢:當(dāng)你想查詢所有姓張的記錄震捣。用到關(guān)鍵字like。eg:select * from 表名 where 列名 like ‘張_’;
(代表匹配任意一個(gè)字符闹炉,%代表匹配0~n個(gè)任意字符)蒿赢。
3.4.2排序(所謂升序和降序都是從上往下排列)
1.升序:select * form 表名 order by 列名 (ASC );
()里面的內(nèi)容為缺省值;
2.降序:select * from 表名 order by 列名 DESC;
3.使用多列作為排序條件: 當(dāng)?shù)谝涣信判驐l件相同時(shí)渣触,根據(jù)第二列排序條件排序(當(dāng)?shù)诙幸琅f相同時(shí)可視情況根據(jù)第三例條件排序)羡棵。eg:select * from 表名 order by 列名1 ASC, 列名2 DESC;
意思是當(dāng)列名1的值相同時(shí)按照列名2的值降序排。
3.4.3聚合函數(shù)
1.count:select count(列名) from 表名嗅钻;
,紀(jì)錄有效行數(shù)皂冰。
2.max:select count(列名) from 表名;
,列中最大值养篓。
3.min:select sum(列名) from 表名秃流;
,列中最小值。
4.sum:select sum(列名) from 表名柳弄;
,求列的總值舶胀,null 和字符串默認(rèn)為0。
5.avg:select avg(列名) from 表名;
,一列的平均值碧注。
3.4.4分組查詢
分組查詢的信息都是組的信息嚣伐,不能查到個(gè)人的信息,其中查詢組的信息是通過聚合函數(shù)得到的萍丐。
語法:select 分組列名轩端,聚合函數(shù)1,聚合函數(shù)2 from 表名 group by 該分組列名;
其中分組列名需要的條件是該列名中有重復(fù)的信息逝变。
查詢的結(jié)果只能為:作為分組條件的列和聚合函數(shù)基茵;查處的信息都是組的信息刻撒。
分組查詢前,還可以通過關(guān)鍵字where先把滿足條件的人分出來耿导,再分組声怔。語法為:select 分組列,聚合函數(shù) from 表名 where 條件 group by 分組列舱呻;
分組查詢后醋火,也可以通過關(guān)鍵字having把組信息中滿足條件的組再細(xì)分出來。語法為:select 分組列箱吕,聚合函數(shù) from 表名 where 條件 group by 分組列 having 聚合函數(shù)或列名(條件)芥驳;
3.4.5LIMIT子句(mysql中獨(dú)有的語法)
LIMIT用來限定查詢結(jié)果的起始行,以及總行數(shù)茬高。
例如:select * from 表名 limit 4兆旬,3;
表示起始行為第5行怎栽,一共查詢3行記錄丽猬。
4.總結(jié)
學(xué)過的關(guān)鍵字:select,from,where,group by,having ,order by。
當(dāng)一條查詢語句中都包含所有這些關(guān)鍵字時(shí)它們的優(yōu)先級(jí)是select>from>where>group by>having>order by
熏瞄。