MySQL数据库之--增删改

大家好, 欢迎遇到你. 继上两篇查询汇总贴后,今天整理一下数据表的增加、修改、删除。

上两篇超链接:
基础篇 传送门
进阶篇 传送门
加上今天整理的这篇,就凑齐了增删改查四大天王了!


本文内容其实挺抽象的,因为原始表格您没有见过,所以阅读的过程仅能熟悉或者说在心中跑一遍代码。如果需要原表格,可以私聊我要。之前提供过二维码,然后文章就审核不过去了。

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 语法
  • 掌握了数据更新和删除中表链接语法

在这里插入图片描述

路漫漫其修远兮,吾将上下而求索!

发布了44 篇原创文章 · 获赞 5 · 访问量 1947
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章