前言:以下是MySQL最基本的增刪改查語句吹害,很多IT工作者都必須要會的命令螟凭,也是IT行業(yè)面試最常考的知識點它呀,由于是入門級基礎(chǔ)命令螺男,所有所有操作都建立在單表上,未涉及多表操作纵穿。
前提:在進(jìn)行“增刪改查”的操作之前下隧,先建立一個包含數(shù)據(jù)表student的數(shù)據(jù)庫
1、“增”——添加數(shù)據(jù)
1.1 為表中所有字段添加數(shù)據(jù)
1.1.1 INSERT 語句中指定所有字段名
語法:INSERT INTO 表名(字段名1谓媒,字段名2淆院,…)
VALUES(值1,值2句惯,…)土辩;
舉例:
INSERT INTO student(id,name,grade)VALUES(1,'zhangshan',98);
使用SELECT * FROM student;命令查看結(jié)果為:
表示數(shù)據(jù)已經(jīng)成功插入。
1.1.2 INSERT語句中不指定字段名
若不指定字段名抢野,則添加的值的順序應(yīng)和字段在表中的順序完全一致拷淘。
語法:INSERT INTO 表名 VALUES(值11,值2指孤,…)启涯;
舉例:INSERT INTO student VALUES (2,'lisi',62);
使用SELECT * FROM student;命令查看結(jié)果為:
1.2 為表的指定字段添加數(shù)據(jù)
為指定字段添加數(shù)據(jù),即只向部分字段添加值恃轩,而其他字段的值為表定義時的默認(rèn)值结洼。
語法:INSERT INTO 表名(字段1,字段2详恼,…)
VALUES(值1补君,值2,…)
舉例:INSERT INTO student(id,name) VALUES(3,'wangwu');
使用SELECT * FROM student;命令查看結(jié)果為:
從結(jié)果中可以看出昧互,新記錄的grade字段值為NULL挽铁,是因為添加時為指明grade的值,系統(tǒng)會自動添加默認(rèn)值敞掘。
1.3 INSERT語句的其他寫法
語法:INSERT INTO 表名
SET 字段名1=值1[,字段名2=值2叽掘,…]
舉例:INSERT INTO student
SET id=4,name='zhaoliu',grade=72;
使用SELECT * FROM student;命令查看結(jié)果為:
1.4 同時添加多條數(shù)據(jù)
語法:INSERT INTO 表名[(字段名1玖雁,字段名2更扁,…)]
VALUES (值1,值2,…)浓镜,(值1溃列,值2,…)膛薛,
…
√(值1,值2哄啄,…)
舉例:INSERT INTO student VALUES
(5雅任,‘lilei’,99),
(6,'hanmeimei',87),
(8,'poly',76);
使用SELECT * FROM student;命令查看結(jié)果為:
2、“刪”——刪除數(shù)據(jù)
語法:DELETE FROM 表名 [WHERE 條件表達(dá)式
2.1 刪除部分?jǐn)?shù)據(jù)
即刪除指定的部分?jǐn)?shù)據(jù)咨跌,需要使用WHERE子句來指定刪除記錄的條件沪么。
舉例:刪除student表中的id值為7的記錄
命令:DELETE FROM student
WHERE id=7;
使用SELECT * FROM student;命令查看結(jié)果為:
可見id為7的記錄已被成功刪除。
2.2 刪除全部數(shù)據(jù)
若 DELETE 語句中沒有使用WHERE語句锌半,則會將表中所有記錄都刪除禽车。
語法:DELETE FROM 表名
舉例:刪除student表中的所有記錄
命令:DELETE FROM student;
使用SELECT * FROM student;命令查看結(jié)果為:
可見student表中記錄為空拳喻,說明表中所有數(shù)據(jù)已被成功刪除哭当。
2.2 刪除全部數(shù)據(jù)的另一種方法——TRUNCATE
語法:TRUNCTE [TABLE ] 表名
舉例:TRUNCATE TABLE student;即可刪除student表
注意:
(1)DELETE 后面可以跟WHERE子句指定刪除部分記錄冗澈,TRUNCATE只能刪除整個表的所有記錄
(2)使用TRUNCATE語句刪除記錄后钦勘,新添加的記錄時,自動增長字段(如本文中student表中的 id 字段)會默認(rèn)從1開始亚亲,而使用DELETE刪除記錄后彻采,新添加記錄時,自動增長字段會從刪除時該字段的的最大值加1開始計算(即原來的id最大為5捌归,則會從6開始計算)肛响。所以如果是想徹底刪除一個表的記錄而且不會影響到重新添加記錄,最好使用TRUNCATE來刪除整個表的記錄惜索。
3特笋、“改”——更新數(shù)據(jù)
更新數(shù)據(jù)指對表中現(xiàn)存的數(shù)據(jù)進(jìn)行修改。
語法:UPDATE 表名
SET 字段名1=值1巾兆,[ 猎物,字段名2=值2,…]
[ WHERE 條件表達(dá)式 ]
在執(zhí)行后面的語句之前角塑,先使用INSERT語句往student表中插入以下數(shù)據(jù):
3.1 UPDATE 更新部分?jǐn)?shù)據(jù)
指更新指定表中的指定記錄蔫磨,使用WHERE 子句來指定。
舉例:將student表中id值為1=記錄圃伶,將其name字段的值改為‘caocao’堤如,grade字段的值改為50蒲列。
先查詢之前的記錄:SELECT * FROM student WHERE id=1;
顯示為:
命令:UPDATE student
SET name=‘caocao’,grade=50
WHERE id=1;
使用SELECT * FROM student;命令查看結(jié)果為:
可見表中數(shù)據(jù)已被成功更新。
注意:還可以使用其他WHERE條件表達(dá)式搀罢,如:id > 4;
3.2 UPDATE 更新全部數(shù)據(jù)
在UPDATE 語句中若不使用WHERE 子句蝗岖,則會將表中所有記錄的指定字段都進(jìn)行更新。
舉例:更新student表中全部記錄榔至,將grade字段都更新為80
命令:UPDATE student
SET grade=80剪侮;
使用SELECT * FROM student;命令查看結(jié)果為:
可以看出所有數(shù)據(jù)已被成功更新。
4洛退、“查”——之單表查詢
MySQL從數(shù)據(jù)表中查詢數(shù)據(jù)最基本的語句是SELECT語句,在前面的“增刪查”已經(jīng)使用過:SELECT * FROM 表名杰标,也就是查詢指定數(shù)據(jù)表中的所有數(shù)據(jù)兵怯。下面將對SELECT語句進(jìn)行詳細(xì)介紹。
在進(jìn)行后面的操作之前我們先建立一個新的數(shù)據(jù)表student2腔剂,如下:
CREATE TABLE student2
(
id INT(3) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
grade FLOAT,gender CHAR(2)
);
此處的PRIMARY KEY表示將該字段設(shè)為主鍵媒区,AUTO_INCREMENT表示將該字段設(shè)為開始值是 1,每條新記錄自動遞增 1,,所以在插入數(shù)據(jù)時不需為該字段設(shè)值掸犬;NOT NULL表示將該字段限制為非空值(此處不作詳細(xì)講解)
再向student2表中插入如下數(shù)據(jù):
INSERT INTO student2(name,grade,gender)
VALUES ('songjiang',40,'男'),('wuyong',100,'男'),
('qinming',90,'男'),('husanniang',88,'女'),('sunerniang',66,'女'),
('wusong',86,'男'),('linchong',92,'男'),('yanqing',90,NULL);
注意:若因為此處插入的數(shù)據(jù)包含了中文而導(dǎo)致無法插入袜漩,可將“男/女”改為“man/woman”,或者將字段編碼改為utf-8(方法自行百度湾碎,此處不做講解)宙攻。
4.1 簡單查詢
4.1.1 查詢所有字段
語法:SELECT 字段名1,字段名2介褥,…
FROM 表名
舉例:查詢student2表中的所有記錄
命令:SELECT id,name,grade ,gender
FROM student2;
結(jié)果:
注意:字段順序可以更改座掘,如:
SELECT id,grade,gender ,name
FROM student2;
則顯示的結(jié)果也會作出對應(yīng)的調(diào)整:
4.1.2 在SELECT語句中使用(‘ * ’)通配符代替所有字段
語法:SELECT * FROM 表名;
在此前已多次使用此命令柔滔,所以此處不作贅述溢陪。
4.1.3 查詢指定的部分字段
語法:SELECT 字段名1,字段名2睛廊,… FROM 表名形真;
舉例:查詢student2表中的name字段和gender字段
命令:SELECT name,gender FROM student2;
結(jié)果:
從結(jié)果中可以看到只顯示了name和gender兩個字段。
4.2 按條件查詢
4.2.1 帶關(guān)系運算符的查詢
語法:SELECT 字段名1超全,字段名2咆霜,…
FROM 表名
WHERE 條件表達(dá)式
在WHERE子句中可以使用如下關(guān)系運算符:
<colgroup style="margin: 0px; padding: 0px;"><col style="margin: 0px; padding: 0px;"><col style="margin: 0px; padding: 0px;"></colgroup>
|
關(guān)系運算符
舉例:查詢student2表中id為4的人的id和name字段
命令:SELECT id,name FROM student2 WHERE id=4;
結(jié)果:
舉例:查詢student2表中g(shù)rade大于80的人的name和grade字段
命令:SELECT name FROM student2 WHERE grade>80;
結(jié)果:
4.2.2 帶 IN 關(guān)鍵字的查詢
IN關(guān)鍵字用于判斷某個字段的值是否在指定集合中卵迂,若在裕便,則該字段所在的記錄將會被查詢出來.
語法:SELECT * | 字段名1,字段名2见咒,…
FROM 表名
WHERE 字段名 [ NOT ] IN (元素1偿衰,元素2,…)
舉例:查詢student2表中id值為1,2,3的記錄
命令:SELECT * FROM student2 WHERE id IN (1,2,3);
結(jié)果:
注意:NOT IN 與 IN 相反下翎,查詢的是不在指定范圍內(nèi)的記錄缤言。
4.2.3 帶 BETWEEN AND 關(guān)鍵字的查詢
BETWEEN AND 用于判斷某個字段的值是否在指定范圍之內(nèi),若在视事,則該字段所在的記錄會被查詢出來胆萧,反之不會。
語法:SELECT * | { 字段名1俐东,字段名2跌穗,… }
FROM 表名
WHERE 字段名 [ NOT ] BETWEEN 值1 AND 值2;
舉例:查詢student2表中id值在2~5之間的人的id和name
命令:SELECT id,name FROM students WHERE id BETWEEN 2 AND 5;
結(jié)果:
注意:NOT BETWEEN AND 表示查詢指定范圍外的記錄虏辫。
4.2.4 空值查詢
在數(shù)據(jù)表中有些值可能為空值(NULL)蚌吸,空值不同于0,也不同于空字符串砌庄,需要使用 IS NULL 來判斷字段的值是否為空值羹唠。
語法:SELECT * | 字段名1,字段名2娄昆,…
FROM 表名
WHERE 字段名 IS [ NOT ] NULL
舉例:查詢student2表中g(shù)ender值為空值的記錄佩微。
命令:SELECT * FROM student2 WHERE gender IS NULL;
結(jié)果:
注意:IS NOT NULL 關(guān)鍵字用來查詢字段不為空值的記錄。
4.2.5 帶 DISTINCT 關(guān)鍵字的查詢
很多表中某些字段的數(shù)據(jù)存在重復(fù)的值萌焰,可以使用DISTINCT關(guān)鍵字來過濾重復(fù)的值哺眯,只保留一個值。
語法:SELECT DISTINCT 字段名 FROM 表名杆怕;
舉例:查詢student2表中g(shù)ender字段的值族购,結(jié)果中不允許出行重復(fù)的值。
命令:SELECT DISTINCT gender FROM student2;
結(jié)果:
注意:DISTINCT 關(guān)鍵字還可作用于多個字段陵珍,則只有多個字段的值都完全相同時才會被認(rèn)作是重復(fù)記錄寝杖。
4.2.6 帶 LIKE 關(guān)鍵字的查詢
語法:SELECT * | 字段名1,字段名2互纯,…
FROM 表名
WHERE 字段名 [ NOT ] LIKE ‘匹配字符串’;
(1)百分號(%)通配符
匹配任意長度的字符串瑟幕,包括空字符串。例如留潦,字符串“ c% ”匹配以字符 c 開始只盹,任意長度的字符串,如“ ct ”兔院,“ cut ”殖卑,“ current ”等;字符串“ c%g ”表示以字符 c 開始坊萝,以 g 結(jié)尾的字符串孵稽;字符串“ %y% ”表示包含字符“ y ”的字符串许起,無論“ y ”在字符串的什么位置。
舉例1:查詢student2表中name字段以字符“ s ”開頭的人的id,name
命令:SELECT id,name FROM student2 WHERE name LIKE "S%";
結(jié)果:
舉例2:查詢student2表中name字段以字符“ w ”開始菩鲜,以字符“ g ”結(jié)尾的人的id园细,name。
命令:SELECT id,name FROM student2 WHERE name LIKE 'w%g';
結(jié)果:
舉例3:查詢student2表中name字段不包含“ y ”的人的id接校,name猛频。
命令:SELECT id,name FROM student2 WHERE name NOT LIKE '%y%';
結(jié)果:
(2)下劃線(_)通配符
下劃線通配符只匹配單個字符,若要匹配多個字符蛛勉,需要使用多個下劃線通配符鹿寻。例如,字符串“ cu_ ”匹配以字符串“ cu ”開始诽凌,長度為3的字符烈和,如“ cut ”,“ cup ”皿淋;字符串“ c__l”匹配在“ c ”和“ l ”之間包含兩個字符的字符串,如“ cool ”恬试。需要注意的是窝趣,連續(xù)的“”之間不能有空格,例如“M _QL”只能匹配“My SQL”训柴,不能匹配“MySQL”哑舒。
舉例:查詢在student2表中name字段值以“ wu ”開始,以“ ong ”結(jié)束幻馁,并且中間只有一個字符的記錄洗鸵。
命令:SELECT * FROM student2 WHERE name LIKE 'wu_ong';
結(jié)果:
注意:若要查詢的字段值本來就含有“ % ”或者“ _ ”,則要用“ \ ”進(jìn)行轉(zhuǎn)義,如要查詢本身含有“ % ”的字符串仗嗦,命令應(yīng)改為 “ %%%”膘滨。
4.2.7 帶 AND 關(guān)鍵字的多條件查詢
在使用SELECT語句查詢數(shù)據(jù)時,優(yōu)勢為了使查詢結(jié)果更加精確稀拐,可以使用多個查詢條件火邓,如使用 AND 關(guān)鍵字可以連接兩個或多個查詢條件。
語法:SELECT * | 字段名1德撬,字段名2铲咨,…
FROM 表名
WHERE 條件表達(dá)式1 AND 條件表達(dá)式2 [ … AND 條件表達(dá)式 n ];
舉例:查詢student2表中 id 字段小于5,并且 gender 字段值為“ 女 ”的人的id和name
命令:SELECT id,name FROM student2 WHERE id<5 AND gender='女';
結(jié)果:
4.2.8 帶 OR 關(guān)鍵字的多條件查詢
與 AND 關(guān)鍵字不同蜓洪,OR 關(guān)鍵字只要滿足任意一個條件就會被查詢出來
語法:SELECT * | 字段名1纤勒,字段名2,…
FROM 表名
WHERE 條件表達(dá)式1 OR 條件表達(dá)式2 [ … OR 條件表達(dá)式 n ];
舉例:查詢student2表中 id 字段小于3隆檀,或者 gender 字段值為“ 女 ”的人的id摇天,name和gender
命令:SELECT id,name ,gender FROM student2 WHERE id<3 OR gender='女';
結(jié)果:
4.2.9 OR 和 AND 一起使用的情況
OR 和 AND 一起使用的時候,AND 的優(yōu)先級高于 OR闸翅,因此二者一起使用時再芋,會先運算 AND 兩邊的表達(dá)式,再運算 OR 兩邊的表達(dá)式坚冀。
舉例:查詢student2表中g(shù)ender值為“女”或者gender值為“男”并且grade字段值為100的人的記錄
命令:SELECT * FROM student2 WHERE gender='女' OR gender='男' AND grade=100;
結(jié)果:
4.3 高級查詢
4.3.1 聚合函數(shù)
(1)COUNT()函數(shù):統(tǒng)計記錄的條數(shù)
語法:SELECT COUNT(*) FROM 表名
舉例:查詢student2表中一共有多少條記錄
命令:SELECT COUNT(*) FROM student2;
結(jié)果:
(2)SUM()函數(shù):求出表中某個字段所有值的總和
語法:SELECT SUM(字段名) FROM 表名济赎;
舉例:求出student2表中g(shù)rade字段的總和
命令:SELECT SUM(grade) FROM student2;
結(jié)果:
(3)AVG()函數(shù):求出表中某個字段所有值的平均值
語法:SELECT AVG(字段名) FROM 表名;
舉例:求出student2表中g(shù)rade字段的平均值
命令:SELECT AVG(grade) FROM student2;
結(jié)果:
(4)MAX()函數(shù):求出表中某個字段所有值的最大值
語法:SELECT MAX(字段名) FROM 表名记某;
舉例:求出student2表中所有人grade字段的最大值
命令:SELECT MAX(grade) FROM student2;
結(jié)果:
(5)MIN()函數(shù):求出表中某個字段所有值的最小值
語法:SELECT MIN(字段名) FROM 表名司训;
舉例:求出student2表中所有人grade字段的最小值
命令:SELECT MIN(grade) FROM student2;
結(jié)果:
4.3.2 對查詢結(jié)果進(jìn)行排序
語法:SELECT 字段名1,字段名2液南,…
FROM 表名
ORDER BY 字段名1 [ ASC | DESC ],字段名2 [ ASC | DESC ]…
在該語法中指定的字段名是對查詢結(jié)果進(jìn)行排序的依據(jù)壳猜,ASC表示升序排列,DESC 表示降序排列滑凉,默認(rèn)情況是升序排列统扳。
舉例1:查出student2表中的所有記錄,并按照grade字段進(jìn)行升序排序
命令:SELECT * FROM student2
ORDER BY grade;
結(jié)果:
舉例2:查出student2表中的所有記錄畅姊,并按照grade字段進(jìn)行降序排序
命令:SELECT * FROM student2
ORDER BY grade DESC;
結(jié)果:
4.3.3 分組查詢
在對表中數(shù)據(jù)進(jìn)行統(tǒng)計的時候咒钟,可以使用GROUP BY 按某個字段或者多個字段進(jìn)行分組,字段中值相同的為一組若未,如男生分為一組朱嘴,女生分為一組。
語法:SELECT 字段名1粗合,字段名2萍嬉,…
FROM 表名
GROUP BY 字段名1,字段名2隙疚,… [ HAVING 條件表達(dá)式 ];
(1)單獨使用 GROUP BY 進(jìn)行分組
單獨使用GROUP BY 關(guān)鍵字壤追,查詢的是每個分組中的一條記錄
舉例:查詢student2表中的數(shù)據(jù),按照gender字段進(jìn)行分組供屉。
命令:SELECT * FROM student2 GROUP BY gender;
結(jié)果:
注意:若在此2例中鍵入命令之后出現(xiàn)“#1055”錯誤大诸,無法完成分組查詢,是由于MySQL版本升級到了5.7贯卦,可自行百度“MySQL 1055錯誤”參考解決辦法资柔。
(2) GROUP BY 和聚合函數(shù)一起使用
GROUP BY 和聚合函數(shù)一起使用,可以統(tǒng)計出某個或者某些字段在一個分組中的最大值撵割、最小值贿堰、平均值等。
舉例:將student2表按照gender字段進(jìn)行分組查詢啡彬,計算出每組共有多少個人羹与。
命令:SELECT COUNT(*) ,gender FROM student2 GROUP BY gender;
結(jié)果:
(2) GROUP BY 和 HAVING 關(guān)鍵字一起使用
HAVING關(guān)鍵字和WHERE關(guān)鍵字的作用相同故硅,區(qū)別在于HAVING 關(guān)鍵字可以跟聚合函數(shù),而WHERE 關(guān)鍵字不能纵搁。通常HAVING 關(guān)鍵字都和GROUP BY一起使用吃衅,用于對分組后的結(jié)果進(jìn)行過濾。
舉例:將student2表按照gender字段進(jìn)行分組查詢腾誉,查詢出grade字段值之和小于300的分組
命令:SELECT sum(grade),gender FROM student2 GROUP BY gender HAVING SUM(grade) < 300;
結(jié)果:
4.3.4 使用 LIMIT 限制查詢結(jié)果的數(shù)量
語法:SELECT 字段名2徘层,字段名2,…
FROM 表名
LIMIT [ OFFSET ,] 記錄數(shù)
在此語法中利职,LIMIT 后面可以跟兩個參數(shù)趣效,第一個參數(shù)“ OFFSET ”表示偏移量,如果偏移量為0猪贪,則從查詢結(jié)果的第一條記錄開始跷敬,偏移量為1則從查詢結(jié)果中的第二條記錄開始,以此類推热押。OFFSET為可選值西傀,默認(rèn)值為0,第二個參數(shù)“記錄數(shù)”表示指定返回查詢記錄的條數(shù)桶癣。
舉例1:查詢student2表中的前四條記錄池凄。
命令:SELECT * FROM student LIMIT 4;
結(jié)果:
舉例2:查詢student2表中g(shù)rade字段從第五位到第八位的人(從高到低)
命令:SELECT * FROM student2 ORDER BY grade DESC LIMIT 4,4;
結(jié)果:
4.3.5 函數(shù)(列表)
4.4 為表和字段取別名
4.4.1 為表取別名
在進(jìn)行查詢操作時,如果表名很長使用起來不方便鬼廓,可以為表取一個別名來代替表的名稱。
語法:SELECT * FROM 表名 [ AS ] 別名致盟;
舉例:為student2表起一個別名s碎税,并查詢student2表中g(shù)ender字段值為“女”的記錄
命令:SELECT * FROM student2 AS s WHERE s.gender='女';
結(jié)果:
4.4.1 為字段取別名
語法:SELECT 字段名 [ AS ] 別名 [ ,字段名 [AS] 別名,…] FROM 表名 馏锡;
舉例:查詢student2表中的所有記錄的name和gender字段值雷蹂,并未這兩個字段起別名stu_name和stu_gender
命令:SELECT name AS stu_name,gender AS stu_gender FROM student2;
結(jié)果: