大家好, 欢迎遇到你. 继上两篇查询汇总贴后,今天整理一下数据表的增加、修改、删除。
上两篇超链接:
基础篇 传送门
进阶篇 传送门
加上今天整理的这篇,就凑齐了增删改查四大天王了!
本文内容其实挺抽象的,因为原始表格您没有见过,所以阅读的过程仅能熟悉或者说在心中跑一遍代码。如果需要原表格,可以私聊我要。之前提供过二维码,然后文章就审核不过去了。
INSERT 语句
普通语法
插入写入记录,可以是一条记录,也可以是多条记录
- INSERT INTO 表名(字段1,字段2,…) VALUES (值1,值2,…);.
- INSERT INTO 表名(字段1,字段2,…) VALUES (值1,值2,…),(值1,值2,…);
-- INSERT INTO
INSERT INTO t_dept (deptno, dname, loc)
VALUES (50,'技术部','北京'),(60,'后勤部','北京'),(70,'保安部','北京');
-- 向技术部添加一条员工记录, 只知道他是技术部,不知道技术部是什么编号
INSERT INTO t_emp
(empno,ename, job,mgr,hiredate,sal,comm,deptno)
VALUES (8001,'刘娜','SALESMAN',8000,'1988-12-20',2000,NULL,
(SELECT deptno FROM t_dept WHERE dname='技术部'));
-- 子查询只能是一个单行单列才可以.
INSERT方言语法
不具备通用性[red]
mysql的方言: INSERT INTO 表名 SET 字段1=值1,字段2=值2,…
IGNORE 语句
ignore关键字让insert只插入数据库不存在的记录
- INSERT [IGNORE] INTO 表名…;
案例: 70已有了(上边插入的),现在再插入一个70和一个80,运行后记得删除
-- 70已有,80没有
INSERT IGNORE INTO t_dept ( deptno,dname,loc)
values (70,'A','北京'),(80,'B','上海');
UPDATE 语句
用来修改记录的,语法如下:
UPDATE [IGNORE] 表名
SET 字段1=值1,字段2=值2,…
[WHERE 条件1 . …] – 写了就是条件修改
[ORDER BY…] – 写了就按排序修改
[LIMIT…]; – 只能修改前第一个分页记录, 比如limit 10,代表前十条
案例&练习:
-- 案例1: 把每位员工编号和上司编号都加一
UPDATE t_emp SET empno=empno+1 , mgr=mgr+1
ORDER BY empno DESC;
-- 案例2:把月收入前三名员工底薪减100,用LIMIT完成
UPDATE t_emp
SET sal = sal-100
ORDER BY sal+IFNULL(comm,0) DESC
LIMIT 3;
update表链接
- 语法: **UPDATE 表1 JOIN 表2 ON 条件 SET 字段1=值1, 字段2=值2, … **
- 表链接的UPDATE语句可以修改多张表的记录
- 语法: : UPDATE 表1, 表2 SET 字段1=值1, 字段2=值2, … WHERE 连接条件
案例:
-- 把ALLEN调往RESEARCH部门,职务调整为ANALYST
-- e.deptno=d.deptno 这句话是把research部门编号,赋给艾伦的编号
UPDATE t_emp e JOIN t_dept d
SET e.deptno=d.deptno ,e.job='ANALYST' , d.loc="北京"
WHERE e.ename="ALLEN" AND d.dname="RESEARCH";
-- 把底薪低于公司平均底薪的员工,底薪增加150元
-- 表链接update
UPDATE t_emp e JOIN (SELECT AVG(sal) AS avg FROM t_emp)t
ON e.sal <t.avg
SET e.sal =e.sal+150;
- update语句的表链接即可以是内连接,又可以外连接
UPDATE 表1 [LEFT | RIGHT] JOIN 表2 ON 条件 SET 字段1=值1, 字段2=值2,…;
案例 :
-- 把没有部门的员工,或者sales部门低于2000元底薪的员工,都调往20部门
UPDATE t_emp e LEFT JOIN t_dept d ON e.deptno=d.deptno
SET e.deptno = 20
WHERE e.deptno IS NULL OR ( d.dname="SALES" AND e.sal<2000);
DELETE 删除
DELETE [ IGNORE ] FROM 表名
**[ WHERE 条件1 ,条件2,… ] **
[ ORDER BY … ] 排序后删除数据
[ LIMIT … ] 分页
内连接
案例:
-- 删除10部门中,工龄超过20年的员工
DELETE
FROM t_emp
WHERE deptno=10 AND DATEDIFF(now(),hiredate)/365>=20;
-- 删除20部门中,工资最高的员工的记录
DELETE FROM t_emp
WHERE deptno=20
ORDER BY sal+IFNULL(comm,0)DESC
LIMIT 1;
-- 删除SALES部门和该部门全部员工记录,一个delete语句删除了两张表的记录
DELETE e,d
FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno
WHERE d.dname='SALES';
-- 删除每个部门平均底薪的员工记录
DELETE e
FROM t_emp e JOIN
(SELECT deptno,AVG(sal) avgg
FROM t_emp GROUP BY deptno) t
ON e.deptno=t.deptno AND e.sal < t.avgg;
-- 删除员工KING 和他的直接下属的员工记录,用表链接实现.
DELETE e
FROM t_emp e JOIN
(SELECT empno FROM t_emp WHERE ename='king') t
ON e.mgr=t.empno OR e.empno=t.empno;
外连接
DELETE 表1,…FROM 表1 [ LEFT | RIGHT ] JOIN 表2 ON 条件…
案例:
-- 删除SALES部门员工,以及没有部门的员工.
DELETE e
FROM t_emp e LEFT join t_dept d ON e.deptno=d.deptno
WHERE d.dname='SALES' OR e.deptno IS NULL;
TRUNCATE TABLE
快速删除数据表全部记录
- DELETE语句是在事物机制下删除记录,删除记录之前,先把要删除的记录保存到日志文件里, 然后再删除记录.
- TRUNCATE TABLE 表名;
-- TRUNCATE TABLE 员工表
TRUNCATE TABLE t_emp;
本文学习了:
- INSERT 语法
- UPDATE 语法
- DELETE 语法
- TRUNCATE TABLE 语法
- 掌握了数据更新和删除中表链接语法
路漫漫其修远兮,吾将上下而求索!