MySQL中update语句的深入分析
生活随笔
收集整理的這篇文章主要介紹了
MySQL中update语句的深入分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MySQL中update語(yǔ)句的深入分析
MySQL利用update語(yǔ)句更新表中的數(shù)據(jù),update命令的格式如下:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [join tbl_name2 on tbl_name.col_name=tbl_name2.col_name]SET col_name1=expr1 [, col_name2=expr2 ...][WHERE where_definition][ORDER BY ...][LIMIT row_count]說(shuō)明:
(1)tbl_name:要更新的表名;
(2)SET:指定要更新的字段;
(4)join:利用另一張表的數(shù)據(jù)更新當(dāng)前表的數(shù)據(jù);
(3)WHERE:通過(guò)條件指定要更新的行,如果省略WHERE子句,則更新所有的行;
(4)ORDER BY:按照被指定的順序?qū)π羞M(jìn)行更新;
(5)LIMIT:限制更新的行數(shù);
(6)IGNORE:在更新過(guò)程中出現(xiàn)錯(cuò)誤,更新語(yǔ)句也不會(huì)中斷。
注意:
(1)更新的數(shù)據(jù)必須滿足表的約束條件;
(2)提供的數(shù)據(jù)必須與字段的數(shù)據(jù)類型匹配。
一、數(shù)據(jù)準(zhǔn)備
創(chuàng)建emp(員工)表,并輸入數(shù)據(jù),代碼如下:
create table emp(emp_id int primary key auto_increment comment '員工號(hào)',emp_name char(20) not null default '' comment '員工姓名',gender char(2) not null default '男' comment '性別',birth datetime not null default '1990-1-1' comment '出生日期',salary decimal(10,2) not null default 0 comment '工資',address varchar(200) not null default '' comment '通訊地址',dept_name char(20) comment '部門' );insert into emp(emp_name,gender,birth,salary,address,dept_name) values('張曉紅','女','1980-1-23',5800,'河南省鄭州市中原路10號(hào)','銷售部'), ('張靜靜','女','1987-10-3',5400,'河南省新鄉(xiāng)市平原路38號(hào)','銷售部'), ('王云飛','男','1992-11-15',5600,'河南省新鄉(xiāng)市人民路28號(hào)','銷售部'), ('王鵬飛','男','1987-10-1',6800,'河南省新鄉(xiāng)市東明大道12號(hào)','銷售部'), ('王大鵬','男','1989-2-11',5900,'河南省鄭州市東風(fēng)路15號(hào)','銷售部'), ('王萌萌','女','1986-12-30',5000,'河南省開封市五一路14號(hào)','財(cái)務(wù)部'), ('王大光','男','1988-11-8',6200,'河南省開封市八一路124號(hào)','財(cái)務(wù)部'), ('王小明','男','1998-1-3',4800,'河南省駐馬店市雪松路128號(hào)','財(cái)務(wù)部'), ('王娜娜','女','1994-3-5',5200,'河南省駐馬店市車站路2號(hào)','人事部'), ('劉云飛','男','1992-8-13',6800,'河南省南陽(yáng)市民生路255號(hào)','人事部'), ('張陸軍','男','1991-9-6',6200,'河南省南陽(yáng)市張仲景路14號(hào)','人事部');二、update命令的基本用法
mysql> select * from emp; +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | 1 | 張曉紅 | 女 | 1980-01-23 00:00:00 | 5800.00 | 河南省鄭州市中原路10號(hào) | 銷售部 | | 2 | 張靜靜 | 女 | 1987-10-03 00:00:00 | 5400.00 | 河南省新鄉(xiāng)市平原路38號(hào) | 銷售部 | | 3 | 王云飛 | 男 | 1992-11-15 00:00:00 | 5600.00 | 河南省新鄉(xiāng)市人民路28號(hào) | 銷售部 | | 4 | 王鵬飛 | 男 | 1987-10-01 00:00:00 | 6800.00 | 河南省新鄉(xiāng)市東明大道12號(hào) | 銷售部 | | 5 | 王大鵬 | 男 | 1989-02-11 00:00:00 | 5900.00 | 河南省鄭州市東風(fēng)路15號(hào) | 銷售部 | | 6 | 王萌萌 | 女 | 1986-12-30 00:00:00 | 5000.00 | 河南省開封市五一路14號(hào) | 財(cái)務(wù)部 | | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 6200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | | 8 | 王小明 | 男 | 1998-01-03 00:00:00 | 4800.00 | 河南省駐馬店市雪松路128號(hào) | 財(cái)務(wù)部 | | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 5200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | | 10 | 劉云飛 | 男 | 1992-08-13 00:00:00 | 6800.00 | 河南省南陽(yáng)市民生路255號(hào) | 人事部 | | 11 | 張陸軍 | 男 | 1991-09-06 00:00:00 | 6200.00 | 河南省南陽(yáng)市張仲景路14號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ 11 rows in set (0.00 sec)mysql> update emp set salary=salary+1000; ---所有員工的工資增加1000元 Query OK, 11 rows affected (0.00 sec) Rows matched: 11 Changed: 11 Warnings: 0mysql> select * from emp; +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | 1 | 張曉紅 | 女 | 1980-01-23 00:00:00 | 6800.00 | 河南省鄭州市中原路10號(hào) | 銷售部 | | 2 | 張靜靜 | 女 | 1987-10-03 00:00:00 | 6400.00 | 河南省新鄉(xiāng)市平原路38號(hào) | 銷售部 | | 3 | 王云飛 | 男 | 1992-11-15 00:00:00 | 6600.00 | 河南省新鄉(xiāng)市人民路28號(hào) | 銷售部 | | 4 | 王鵬飛 | 男 | 1987-10-01 00:00:00 | 7800.00 | 河南省新鄉(xiāng)市東明大道12號(hào) | 銷售部 | | 5 | 王大鵬 | 男 | 1989-02-11 00:00:00 | 6900.00 | 河南省鄭州市東風(fēng)路15號(hào) | 銷售部 | | 6 | 王萌萌 | 女 | 1986-12-30 00:00:00 | 6000.00 | 河南省開封市五一路14號(hào) | 財(cái)務(wù)部 | | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 7200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | | 8 | 王小明 | 男 | 1998-01-03 00:00:00 | 5800.00 | 河南省駐馬店市雪松路128號(hào) | 財(cái)務(wù)部 | | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 6200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | | 10 | 劉云飛 | 男 | 1992-08-13 00:00:00 | 7800.00 | 河南省南陽(yáng)市民生路255號(hào) | 人事部 | | 11 | 張陸軍 | 男 | 1991-09-06 00:00:00 | 7200.00 | 河南省南陽(yáng)市張仲景路14號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ 11 rows in set (0.00 sec)mysql> update emp set salary=salary+1000 where dept_name='財(cái)務(wù)部'; ---'財(cái)務(wù)部'員工的工資增加1000元 Query OK, 3 rows affected (0.02 sec) Rows matched: 3 Changed: 3 Warnings: 0mysql> select * from emp; +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | 1 | 張曉紅 | 女 | 1980-01-23 00:00:00 | 6800.00 | 河南省鄭州市中原路10號(hào) | 銷售部 | | 2 | 張靜靜 | 女 | 1987-10-03 00:00:00 | 6400.00 | 河南省新鄉(xiāng)市平原路38號(hào) | 銷售部 | | 3 | 王云飛 | 男 | 1992-11-15 00:00:00 | 6600.00 | 河南省新鄉(xiāng)市人民路28號(hào) | 銷售部 | | 4 | 王鵬飛 | 男 | 1987-10-01 00:00:00 | 7800.00 | 河南省新鄉(xiāng)市東明大道12號(hào) | 銷售部 | | 5 | 王大鵬 | 男 | 1989-02-11 00:00:00 | 6900.00 | 河南省鄭州市東風(fēng)路15號(hào) | 銷售部 | | 6 | 王萌萌 | 女 | 1986-12-30 00:00:00 | 7000.00 | 河南省開封市五一路14號(hào) | 財(cái)務(wù)部 | | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 8200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | | 8 | 王小明 | 男 | 1998-01-03 00:00:00 | 6800.00 | 河南省駐馬店市雪松路128號(hào) | 財(cái)務(wù)部 | | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 6200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | | 10 | 劉云飛 | 男 | 1992-08-13 00:00:00 | 7800.00 | 河南省南陽(yáng)市民生路255號(hào) | 人事部 | | 11 | 張陸軍 | 男 | 1991-09-06 00:00:00 | 7200.00 | 河南省南陽(yáng)市張仲景路14號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ 11 rows in set (0.00 sec)select * from emp order by salary desc;update emp set salary=salary+2000 order by salary desc limit 2;三、update命令的使用技巧
(一)使用order by和limit更新特定記錄
mysql> select * from emp order by salary desc; +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 8200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | | 4 | 王鵬飛 | 男 | 1987-10-01 00:00:00 | 7800.00 | 河南省新鄉(xiāng)市東明大道12號(hào) | 銷售部 | | 10 | 劉云飛 | 男 | 1992-08-13 00:00:00 | 7800.00 | 河南省南陽(yáng)市民生路255號(hào) | 人事部 | | 11 | 張陸軍 | 男 | 1991-09-06 00:00:00 | 7200.00 | 河南省南陽(yáng)市張仲景路14號(hào) | 人事部 | | 6 | 王萌萌 | 女 | 1986-12-30 00:00:00 | 7000.00 | 河南省開封市五一路14號(hào) | 財(cái)務(wù)部 | | 5 | 王大鵬 | 男 | 1989-02-11 00:00:00 | 6900.00 | 河南省鄭州市東風(fēng)路15號(hào) | 銷售部 | | 1 | 張曉紅 | 女 | 1980-01-23 00:00:00 | 6800.00 | 河南省鄭州市中原路10號(hào) | 銷售部 | | 8 | 王小明 | 男 | 1998-01-03 00:00:00 | 6800.00 | 河南省駐馬店市雪松路128號(hào) | 財(cái)務(wù)部 | | 3 | 王云飛 | 男 | 1992-11-15 00:00:00 | 6600.00 | 河南省新鄉(xiāng)市人民路28號(hào) | 銷售部 | | 2 | 張靜靜 | 女 | 1987-10-03 00:00:00 | 6400.00 | 河南省新鄉(xiāng)市平原路38號(hào) | 銷售部 | | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 6200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+--------------------------------------+-----------+ 11 rows in set (0.00 sec)mysql> update emp set salary=salary+2000 order by salary desc limit 2; Query OK, 2 rows affected (0.01 sec) Rows matched: 2 Changed: 2 Warnings: 0mysql> select * from emp order by salary desc; +--------+-----------+--------+---------------------+----------+--------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+----------+--------------------------------------+-----------+ | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 10200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | | 4 | 王鵬飛 | 男 | 1987-10-01 00:00:00 | 9800.00 | 河南省新鄉(xiāng)市東明大道12號(hào) | 銷售部 | | 10 | 劉云飛 | 男 | 1992-08-13 00:00:00 | 7800.00 | 河南省南陽(yáng)市民生路255號(hào) | 人事部 | | 11 | 張陸軍 | 男 | 1991-09-06 00:00:00 | 7200.00 | 河南省南陽(yáng)市張仲景路14號(hào) | 人事部 | | 6 | 王萌萌 | 女 | 1986-12-30 00:00:00 | 7000.00 | 河南省開封市五一路14號(hào) | 財(cái)務(wù)部 | | 5 | 王大鵬 | 男 | 1989-02-11 00:00:00 | 6900.00 | 河南省鄭州市東風(fēng)路15號(hào) | 銷售部 | | 1 | 張曉紅 | 女 | 1980-01-23 00:00:00 | 6800.00 | 河南省鄭州市中原路10號(hào) | 銷售部 | | 8 | 王小明 | 男 | 1998-01-03 00:00:00 | 6800.00 | 河南省駐馬店市雪松路128號(hào) | 財(cái)務(wù)部 | | 3 | 王云飛 | 男 | 1992-11-15 00:00:00 | 6600.00 | 河南省新鄉(xiāng)市人民路28號(hào) | 銷售部 | | 2 | 張靜靜 | 女 | 1987-10-03 00:00:00 | 6400.00 | 河南省新鄉(xiāng)市平原路38號(hào) | 銷售部 | | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 6200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | +--------+-----------+--------+---------------------+----------+--------------------------------------+-----------+ 11 rows in set (0.00 sec)(二)使用join關(guān)鍵字用其他表的數(shù)據(jù)更新當(dāng)前表
舉例:
create table stu(stu_id int primary key,stu_name char(20) not null default '',certificate_no char(20) not null default '' ); insert into stu(stu_id,stu_name) values(10001,'張曉云'),(10002,'王云飛'), (10003,'李大鵬'),(10004,'王大剛'),(10005,'張小倩'),(10006,'劉明明');create table certificate(stu_id int primary key,certificate_type char(50) not null default '',certificate_no char(20) not null default '' );insert into certificate(stu_id,certificate_type,certificate_no) values(10001,'計(jì)算機(jī)二級(jí)office高級(jí)應(yīng)用','Comp-2-25879'), (10002,'計(jì)算機(jī)三級(jí)網(wǎng)絡(luò)技術(shù)','Comp-3-25666'), (10003,'英語(yǔ)四級(jí)','CET-4-12458'), (10005,'英語(yǔ)四級(jí)','CET-4-55888');--把certificate表中的證書編號(hào)填寫到學(xué)生表中。 mysql> update stu s inner join certificate c on s.stu_id=c.stu_id-> set s.certificate_no=c.certificate_no; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0mysql> select * from stu; +--------+-----------+----------------+ | stu_id | stu_name | certificate_no | +--------+-----------+----------------+ | 10001 | 張曉云 | Comp-2-25879 | | 10002 | 王云飛 | Comp-3-25666 | | 10003 | 李大鵬 | CET-4-12458 | | 10004 | 王大剛 | | | 10005 | 張小倩 | CET-4-55888 | | 10006 | 劉明明 | | +--------+-----------+----------------+ 6 rows in set (0.00 sec)(三)使用子查詢用其他表的數(shù)據(jù)更新當(dāng)前表
mysql> update stu set certificate_no=''; Query OK, 4 rows affected (0.00 sec) Rows matched: 6 Changed: 4 Warnings: 0mysql> select * from stu; +--------+-----------+----------------+ | stu_id | stu_name | certificate_no | +--------+-----------+----------------+ | 10001 | 張曉云 | | | 10002 | 王云飛 | | | 10003 | 李大鵬 | | | 10004 | 王大剛 | | | 10005 | 張小倩 | | | 10006 | 劉明明 | | +--------+-----------+----------------+ 6 rows in set (0.00 sec)mysql> update stu set stu.certificate_no=-> (select certificate.certificate_no from certificate where certificate.stu_id=stu.stu_id)-> where exists (select 1 from certificate where certificate.stu_id=stu.stu_id); Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0mysql> select * from stu; +--------+-----------+----------------+ | stu_id | stu_name | certificate_no | +--------+-----------+----------------+ | 10001 | 張曉云 | Comp-2-25879 | | 10002 | 王云飛 | Comp-3-25666 | | 10003 | 李大鵬 | CET-4-12458 | | 10004 | 王大剛 | | | 10005 | 張小倩 | CET-4-55888 | | 10006 | 劉明明 | | +--------+-----------+----------------+ 6 rows in set (0.00 sec)四、update使用中的誤區(qū)
(一)一個(gè)update命令對(duì)一個(gè)字段多次更新
mysql> select * from emp where emp_id=9; +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 6200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ 1 row in set (0.00 sec)mysql> update emp set salary=salary-3000,salary=salary+4000 where emp_id=9; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from emp where emp_id=9; +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ | 9 | 王娜娜 | 女 | 1994-03-05 00:00:00 | 7200.00 | 河南省駐馬店市車站路2號(hào) | 人事部 | +--------+-----------+--------+---------------------+---------+------------------------------------+-----------+ 1 row in set (0.00 sec)說(shuō)明:此命令相當(dāng)于針對(duì)salary字段執(zhí)行了兩次更新。
(二)一次更新多個(gè)字段必須用逗號(hào)隔開,不能使用and連接
mysql> select * from emp where emp_id=7; +--------+-----------+--------+---------------------+----------+-----------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+----------+-----------------------------------+-----------+ | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 10200.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | +--------+-----------+--------+---------------------+----------+-----------------------------------+-----------+ 1 row in set (0.00 sec)mysql> update emp set salary=5800 and birth='1988-10-1' and address='河南省開封市紅旗路60號(hào)' where emp_id=7; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from emp where emp_id=7; +--------+-----------+--------+---------------------+--------+-----------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+--------+-----------------------------------+-----------+ | 7 | 王大光 | 男 | 1988-11-08 00:00:00 | 0.00 | 河南省開封市八一路124號(hào) | 財(cái)務(wù)部 | +--------+-----------+--------+---------------------+--------+-----------------------------------+-----------+ 1 row in set (0.01 sec)--該命令不能對(duì)emp表正確更新的原因是:把salary=后面的內(nèi)容理解為一個(gè)邏輯表達(dá)式, --返回邏輯值假(0),所以更新的結(jié)果為salary為0,即: mysql> update emp set salary=(5800 and birth='1988-10-1', address='河南省開封市紅旗路60號(hào)') where emp_id=7; --正確的寫法應(yīng)該是: mysql> update emp set salary=5800, birth='1988-10-1', address='河南省開封市紅旗路60號(hào)' where emp_id=7; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from emp where emp_id=7; +--------+-----------+--------+---------------------+---------+----------------------------------+-----------+ | emp_id | emp_name | gender | birth | salary | address | dept_name | +--------+-----------+--------+---------------------+---------+----------------------------------+-----------+ | 7 | 王大光 | 男 | 1988-10-01 00:00:00 | 5800.00 | 河南省開封市紅旗路60號(hào) | 財(cái)務(wù)部 | +--------+-----------+--------+---------------------+---------+----------------------------------+-----------+ 1 row in set (0.00 sec)總結(jié)
以上是生活随笔為你收集整理的MySQL中update语句的深入分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Portraiture4免费磨皮插件支持
- 下一篇: MySQL视图(view)基本用法