【MySQL入門(mén)篇 第二節(jié)】MySQL基本語(yǔ)法

一、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ù)的操作:

  1. 查看所有數(shù)據(jù)庫(kù)
SHOW DATABASES;
  1. 使用數(shù)據(jù)庫(kù)
USE 數(shù)據(jù)庫(kù)名;
  1. 創(chuàng)建數(shù)據(jù)庫(kù)并指定編碼:
CREATE DATABASE [IF NOT EXISTS] 數(shù)據(jù)庫(kù)名 [DEFAULT CHARACTER SET UTF8];
  1. 刪除數(shù)據(jù)庫(kù):
DROP DATABASE 數(shù)據(jù)庫(kù)名;
  1. 修改數(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 查看表

  1. 查看當(dāng)前數(shù)據(jù)庫(kù)中所有表:
SHOW TABLES;
  1. 查看表結(jié)構(gòu):
DESC 表名;

3.1.2.3 刪除表

  1. 刪除表:
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ō)明:

  1. 在數(shù)據(jù)庫(kù)中所有的字符串類(lèi)型,必須使用單引號(hào)。
  2. (列名1,列名2,列名3)可省略,表示按照表中的順序插入。但不建議采取這種寫(xiě)法,因?yàn)榻档土顺绦虻目勺x性。
  3. 在命令行插入記錄不要寫(xiě)中文,否則可能會(huì)出現(xiàn)亂碼。

3.2.2 修改記錄(不會(huì)修改一行)

  1. 修改某列的全部值:
update 表名 set 列名1=列值1(,列名2=列值2);
  1. 修改(某行或者多行記錄的)列的指定值:
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ù)

  1. 用戶(hù)只能在指定ip地址上登錄mysql:
create user 用戶(hù)名@IP地址 identified by ‘密碼’;
  1. 用戶(hù)可以在任意ip地址上登錄:
create user 用戶(hù)名@‘%’ identified by ‘密碼’;

3.3.2 給用戶(hù)授權(quán)

  1. 語(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。

  1. 授權(quán)舉例:最大特權(quán)
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123' WITH GRANT OPTION;  
flush privileges; 

3.3.3 撤銷(xiāo)授權(quán)

  1. 語(yǔ)法格式:
revoke 權(quán)限1,…,權(quán)限n on 數(shù)據(jù)庫(kù).* from 用戶(hù)名@ ip地址;

撤銷(xiāo)指定用戶(hù)在指定數(shù)據(jù)庫(kù)上的指定權(quán)限。

  1. 撤銷(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 字段(列)控制

  1. 查詢(xún)所有列:
select * from 表名;

說(shuō)明:其中‘*’表示查詢(xún)所有列,而不是所有行的意思。

  1. 查詢(xún)指定列:
select 列1,列2,列n from 表名;
  1. 完全重復(fù)的記錄只顯示一次:在查詢(xún)的列之前添加distinct:
select distinct $ from 表名;

說(shuō)明:缺省值為all,即查詢(xún)所有的結(jié)果,包括重復(fù)的行。

  1. 列運(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 條件控制

  1. 條件查詢(xún):在查詢(xún)語(yǔ)句的后面添加where指定條件:
SELECT * FROM 表名 WHERE 列名=指定值;
SELECT 表1.a,表2.b FROM 表1,表2 WHERE 表1.a=表2.c;
  1. 模糊查詢(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)行排序輸出,而所謂升序和降序都是從上往下排列。

  1. 升序:
select * form 表名 order by 列名 (ASC);

說(shuō)明:()里面的內(nèi)容為缺省值,即mysql的order by子句默認(rèn)會(huì)將結(jié)果按照升序方式排列輸出。

  1. 降序:
select * from 表名 order by 列名 DESC;
  1. 使用多列作為排序條件:

當(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ù)得到的。

  1. 語(yǔ)法格式:
select 分組列名,聚合函數(shù)1,聚合函數(shù)2 from 表名 group by 該分組列名;

其中,

  • 分組列名需要的條件是該列名中有重復(fù)的信息
  • 查詢(xún)的結(jié)果只能為作為分組條件的列和聚合函數(shù)
  • 查出的信息都是組的信息
  1. 使用技巧

分組查詢(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ù)。

  1. 語(yǔ)法格式:
SELECT * FROM 表名 LIMIT ${START_LINE},${LINE_COUNT};
  1. 例如:
select * from 表名 limit 4,3;

說(shuō)明:對(duì)查詢(xún)出來(lái)的結(jié)果進(jìn)行過(guò)濾,只顯示起始行為第5行,一共查詢(xún)3行記錄。

四、總結(jié)

  1. 關(guān)鍵字:
    select,from,where,group by,having,order by,limit

  2. 優(yōu)先級(jí):
    select>from>where>group by>having>order by>limit

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀(guān)其大綱 page 01 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 M...
    周少言閱讀 3,255評(píng)論 0 33
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評(píng)論 5 115
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,963評(píng)論 0 9
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,302評(píng)論 2 89
  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪(fǎng)問(wèn),管理...
    chen_000閱讀 4,143評(píng)論 0 19

友情鏈接更多精彩內(nèi)容