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