一、SQL語(yǔ)句分類(lèi)
- DDL(Data Definition Language):數(shù)據(jù)定義語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象:庫(kù)、表、列等。功能:創(chuàng)建、刪除、修改庫(kù)和表結(jié)構(gòu)。
- DML(Data Manipulation Language):數(shù)據(jù)操作語(yǔ)言,用來(lái)定義數(shù)據(jù)庫(kù)記錄:增、刪、改表記錄。
- DCL(Data Control Language):數(shù)據(jù)控制語(yǔ)言,用來(lái)定義訪(fǎng)問(wèn)權(quán)限和安全級(jí)別。
- DQL(Data Query Language):數(shù)據(jù)查詢(xún)語(yǔ)言,用來(lái)查詢(xún)記錄。也是本章學(xué)習(xí)的重點(diǎn)。
二、SQL屬性類(lèi)型
| 屬性 | 大小 | 含義 |
|---|---|---|
| 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 | 字符型,固定長(zhǎng)度字符串類(lèi)型:char(255)。你存入一個(gè)a字符,雖然a只占一個(gè)字符,但是它會(huì)自動(dòng)給你加254個(gè)空格湊成255個(gè)長(zhǎng)度即數(shù)據(jù)的長(zhǎng)度不足指定長(zhǎng)度,會(huì)補(bǔ)足到指定長(zhǎng)度。 | |
| VARCHAR | 可變長(zhǎng)度字符串類(lèi)型:varchar(65535),存入的數(shù)據(jù)多長(zhǎng)它就是多長(zhǎng)。它會(huì)抽出幾個(gè)字節(jié)來(lái)記錄數(shù)據(jù)的長(zhǎng)度。 | |
| TEXT(CLOB) | mysql獨(dú)有的數(shù)據(jù)類(lèi)型,字符串類(lèi)型。 | |
| BLOB | 字節(jié)類(lèi)型。 | |
| YEAR | 年份值,格式為:YYYY | |
| DATA | 日期類(lèi)型,格式為:yyyy-MM-dd。 | |
| TIME | 時(shí)間類(lèi)型,格式為:hh:mm:ss。 | |
| TIMESTAMP | 時(shí)間戳類(lèi)型,格式為上面二者的綜合。 | |
| DATETIME | 混合日期和時(shí)間值,格式為:YYYYMMDD HHMMSS. |
三、SQL語(yǔ)句詳解
當(dāng)然首先需要再命令行中輸入如下指令來(lái)進(jìn)入mysql。
mysql -uroot -p
注意:
- MySQL語(yǔ)法不區(qū)分大小寫(xiě),但是建議關(guān)鍵字使用大寫(xiě)表示。
- 每一條語(yǔ)句后面以分號(hào)結(jié)尾。
3.1 DDL(數(shù)據(jù)定義語(yǔ)言語(yǔ)法)
該語(yǔ)言用來(lái)對(duì)數(shù)據(jù)庫(kù)和表結(jié)構(gòu)進(jìn)行操作。
3.1.1 對(duì)數(shù)據(jù)庫(kù)的操作:
- 查看所有數(shù)據(jù)庫(kù)
SHOW DATABASES;
- 使用數(shù)據(jù)庫(kù)
USE 數(shù)據(jù)庫(kù)名;
- 創(chuàng)建數(shù)據(jù)庫(kù)并指定編碼:
CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫(kù)名 [DEFAULT CHARACTER SET UTF8];
- 刪除數(shù)據(jù)庫(kù):
DROP DATABASE 數(shù)據(jù)庫(kù)名;
- 修改數(shù)據(jù)庫(kù)的編碼:
ALTER DATABASE 數(shù)據(jù)庫(kù)名 CHARACTER SET UTF-8;
3.1.2 對(duì)表結(jié)構(gòu)的操作
3.1.2.1 創(chuàng)建表
CREATE TABLE (IF NOT EXISTS) 表名(
列名 列類(lèi)型,
...,
列名 列類(lèi)型
);
3.1.2.2 查看表
- 查看當(dāng)前數(shù)據(jù)庫(kù)中所有表:
SHOW TABLES;
- 查看表結(jié)構(gòu):
DESC 表名;
3.1.2.3 刪除表
- 刪除表:
DROP 表名;
3.1.2.4 修改表
修改表:修改表有5個(gè)操作,但前綴都是一樣的:ALTER TABLE 表名...
- 修改表之添加列:
ALTER TABLE 表名 add (列名 列類(lèi)型,...,列名 列類(lèi)型); - 修改表之修改列類(lèi)型:
ALTER TABLE 表名 MODIFY 列名 列的新類(lèi)型; - 修改表之列名稱(chēng)列類(lèi)型一起修改:
ALTER TABLE 表名 CHANGE 原列名 新列名 列名類(lèi)型; - 修改表之刪除列:
ALTER TABLE 表名 DROP 列名; - 修改表之修改表名:
ALTER TABLE 表名 RENAME TO 新表名
3.2 DML(數(shù)據(jù)操作語(yǔ)言)語(yǔ)法
用來(lái)對(duì)表記錄操作,包括增、刪、改。
3.2.1 插入數(shù)據(jù)(一次插入就是插入一行)
insert into 表名 (列名1,列名2,列名3) values (列值1,列值2,列值3);
說(shuō)明:
- 在數(shù)據(jù)庫(kù)中所有的字符串類(lèi)型,必須使用單引號(hào)。
- (列名1,列名2,列名3)可省略,表示按照表中的順序插入。但不建議采取這種寫(xiě)法,因?yàn)榻档土顺绦虻目勺x性。
- 在命令行插入記錄不要寫(xiě)中文,否則可能會(huì)出現(xiàn)亂碼。
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(…)的用法表示集合。
例如:
//寫(xiě)法1
update 表名 set 列名1=列值1 where 列名2=列值2 or 列名2=列值3
//寫(xiě)法2
update 表名 set 列名1=列值1 where 列名2 in(列值2,列值3)
3.2.3 刪除數(shù)據(jù)(刪除若干整行)
delete from 表名 (where 條件);
不加where條件時(shí)會(huì)刪除表中所有的記錄,所以為了防止這種失誤操作,很多數(shù)據(jù)庫(kù)往往都會(huì)有備份。
3.2.4 請(qǐng)空數(shù)據(jù)(刪除所有行)
delete from 表名;
truncate table 表名;
不帶where參數(shù)的delete語(yǔ)句可以刪除mysql表中所有內(nèi)容,
使用truncate table也可以清空mysql表中所有內(nèi)容。
效率上truncate比delete快,但truncate刪除后不記錄mysql日志,不可以恢復(fù)數(shù)據(jù)。
delete的效果有點(diǎn)像將mysql表中所有記錄一條一條刪除到刪完,
而truncate相當(dāng)于保留mysql表的結(jié)構(gòu),重新創(chuàng)建了這個(gè)表,所有的狀態(tài)都相當(dāng)于新表。
3.3 DCL(數(shù)據(jù)控制語(yǔ)言)語(yǔ)法
該語(yǔ)言用來(lái)定義訪(fǎng)問(wèn)權(quán)限,理解即可,以后不會(huì)多用。需要記住的是,一個(gè)項(xiàng)目創(chuàng)建一個(gè)用戶(hù),一個(gè)項(xiàng)目對(duì)應(yīng)的數(shù)據(jù)庫(kù)只有一個(gè)。這個(gè)用戶(hù)只能對(duì)這個(gè)數(shù)據(jù)庫(kù)有權(quán)限,其它數(shù)據(jù)庫(kù)該用戶(hù)就操作不了。
3.3.1 創(chuàng)建用戶(hù)
- 用戶(hù)只能在指定ip地址上登錄mysql:
create user 用戶(hù)名@IP地址 identified by ‘密碼’;
- 用戶(hù)可以在任意ip地址上登錄:
create user 用戶(hù)名@‘%’ identified by ‘密碼’;
3.3.2 給用戶(hù)授權(quán)
- 語(yǔ)法格式:
grant 權(quán)限1,…,權(quán)限n on 數(shù)據(jù)庫(kù)名.表名 to 用戶(hù)名@IP地址;
其中權(quán)限1、2、n可以直接用all關(guān)鍵字代替。權(quán)限例如:create,alter,drop,insert,update,delete,select。
- 授權(quán)舉例:最大特權(quán)
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
flush privileges;
3.3.3 撤銷(xiāo)授權(quán)
- 語(yǔ)法格式:
revoke 權(quán)限1,…,權(quán)限n on 數(shù)據(jù)庫(kù).* from 用戶(hù)名@ ip地址;
撤銷(xiāo)指定用戶(hù)在指定數(shù)據(jù)庫(kù)上的指定權(quán)限。
- 撤銷(xiāo)舉例:
revoke create,delete on mydb1.* form user@localhost;
說(shuō)明:撤消user用戶(hù)在數(shù)據(jù)庫(kù)mydb1上的create、alter權(quán)限。
3.3.4 查看權(quán)限
查看指定用戶(hù)的權(quán)限:
SHOW GRANTS FOR 用戶(hù)名@ip地址;
3.3.5 刪除用戶(hù)
DROP USER 用戶(hù)名@ip地址;
3.4 DQL(數(shù)據(jù)查詢(xún)語(yǔ)言)語(yǔ)法
mysql學(xué)習(xí)的重點(diǎn),該語(yǔ)言用來(lái)查詢(xún)記錄,不會(huì)修改數(shù)據(jù)庫(kù)和表結(jié)構(gòu)。
3.4.1 基本查詢(xún)(后綴都是統(tǒng)一為from 表名)
3.4.1.1 字段(列)控制
- 查詢(xún)所有列:
select * from 表名;
說(shuō)明:其中‘*’表示查詢(xún)所有列,而不是所有行的意思。
- 查詢(xún)指定列:
select 列1,列2,列n from 表名;
- 完全重復(fù)的記錄只顯示一次:在查詢(xún)的列之前添加distinct:
select distinct $ from 表名;
說(shuō)明:缺省值為all,即查詢(xún)所有的結(jié)果,包括重復(fù)的行。
- 列運(yùn)算
- a.數(shù)量類(lèi)型的列可以做加、減、乘、除:
SELECT sal*5 from 表名;
說(shuō)明:
遇到null加任何值都等于null的情況,需要用到ifnull()函數(shù);將字符串做加減乘除運(yùn)算,會(huì)把字符串當(dāng)作0。
- b.字符串類(lèi)型可以做連接運(yùn)算(需要用到concat()函數(shù)):
select concat(列名1,列名2) from 表名;
其中,列名的類(lèi)型要為字符串。
- c. 給列名起別名:
select 列名1 (as) 別名1,列名2 (as) 別名2 from 表名;
3.4.1.2 條件控制
- 條件查詢(xún):在查詢(xún)語(yǔ)句的后面添加where指定條件:
SELECT * FROM 表名 WHERE 列名=指定值;
SELECT 表1.a,表2.b FROM 表1,表2 WHERE 表1.a=表2.c;
- 模糊查詢(xún):當(dāng)你想查詢(xún)所有姓張的記錄。用到關(guān)鍵字like。eg:
SELECT * FROM 表名 WHERE 列名 LIKE ‘張_’;
說(shuō)明:
- _代表匹配任意一個(gè)字符
- %代表匹配0~n個(gè)任意字符
3.4.2 排序
有時(shí)我們需要對(duì)查詢(xún)的結(jié)果進(jìn)行排序輸出,而所謂升序和降序都是從上往下排列。
- 升序:
select * form 表名 order by 列名 (ASC);
說(shuō)明:()里面的內(nèi)容為缺省值,即mysql的order by子句默認(rèn)會(huì)將結(jié)果按照升序方式排列輸出。
- 降序:
select * from 表名 order by 列名 DESC;
- 使用多列作為排序條件:
當(dāng)?shù)谝涣信判驐l件相同時(shí),根據(jù)第二列排序條件排序(當(dāng)?shù)诙幸琅f相同時(shí)可視情況根據(jù)第三例條件排序)。例如:
select * from 表名 order by 列名1 ASC, 列名2 DESC;
意思是當(dāng)列名1的值相同時(shí)按照列名2的值降序排。
3.4.3 聚合函數(shù)
- count:統(tǒng)計(jì)有效行數(shù)。
select count(列名) from 表名;
- max:求列中最大值。
select max(列名) from 表名;
- min:求列中最小值。
select min(列名) from 表名;
- sum:求列的總值,null 和字符串默認(rèn)為0。
select sum(列名) from 表名;
- avg:求一列的平均值。
select avg(列名) from 表名;
3.4.4 分組查詢(xún)
分組查詢(xún)的信息都是組的信息,不能查到個(gè)人的信息,其中查詢(xún)組的信息是通過(guò)聚合函數(shù)得到的。
- 語(yǔ)法格式:
select 分組列名,聚合函數(shù)1,聚合函數(shù)2 from 表名 group by 該分組列名;
其中,
- 分組列名需要的條件是該列名中有重復(fù)的信息
- 查詢(xún)的結(jié)果只能為作為分組條件的列和聚合函數(shù)
- 查出的信息都是組的信息
- 使用技巧
分組查詢(xún)前,可以通過(guò)關(guān)鍵字where先把滿(mǎn)足條件的人分出來(lái):
select 分組列,聚合函數(shù) from 表名 where 條件;
再根據(jù)需要進(jìn)行分組:
select 分組列,聚合函數(shù) from 表名 where 條件 group by 分組列;
分組查詢(xún)后,也可以通過(guò)關(guān)鍵字having把組信息中滿(mǎn)足條件的組再細(xì)分出來(lái):
select 分組列,聚合函數(shù) from 表名 where 條件 group by 分組列 having 聚合函數(shù)或列名(條件);
3.4.5 LIMIT子句
LIMIT子句可以過(guò)濾顯示結(jié)果,用來(lái)限定查詢(xún)結(jié)果的起始行,以及總行數(shù)。
- 語(yǔ)法格式:
SELECT * FROM 表名 LIMIT ${START_LINE},${LINE_COUNT};
- 例如:
select * from 表名 limit 4,3;
說(shuō)明:對(duì)查詢(xún)出來(lái)的結(jié)果進(jìn)行過(guò)濾,只顯示起始行為第5行,一共查詢(xún)3行記錄。
四、總結(jié)
關(guān)鍵字:
select,from,where,group by,having,order by,limit優(yōu)先級(jí):
select>from>where>group by>having>order by>limit