数据库的CRUD操作

一、mysql引擎

MyISAM引擎:数据读取速度很快,适合读多写少的场景,不支持事务,不允许并发写入,串行的

InnoDB引擎:支持事务,综合维护成本较低,单表数据量超过两千万,读单张表的数据的速度明显下降,允许并发读写

TokuDB:仅支持Linux系统,写入数据的速度是InnoDB的9-20倍 ,数据的压缩比是InnoDB的十四倍 ,适合写多读少的场景但是需要的需要额外的安装

二、INSERT插入

复制代码
批量插入数据,遇到重复记录或错误,跳过,继续往下执行,在INSERT后加IGNORE:
sql 复制代码
INSERT IGNORE INTO t_dept(deptno,dname,loc)
VALUES (40,"企划部","北京"),
(50,"培训部","上海"),
(60,"后期部","北京"),
(70,"技术部","北京"),
(80,"市场部","北京");
复制代码
插入前的表数据:

插入后的表数据:

实现记录不存在就插入,存在就更新:
sql 复制代码
INSERT INTO t_emp_ip(id,empno,ip) VALUES
(5,8004,"192.168.99.44"),
(6,8005,"192.168.99.45"),
(7,8006,"192.168.99.46"),
(8,8001,"192.168.99.47")
ON DUPLICATE KEY UPDATE ip=VALUES(ip);

执行前的表:

执行后的表第二条数据的IP变为"192.168.99.47"完成了修改而不是新增:

复制代码
实现不存在就插入,存在就更新。
sql 复制代码
INSERT INTO t_emp_ip(id,empno,ip) VALUES
(5,8004,"192.168.99.44"),
(6,8005,"192.168.99.45"),
(7,8006,"192.168.99.46"),
(8,8001,"192.168.99.47")
ON DUPLICATE KEY UPDATE ip=VALUES(ip);

三、查询

由于MySQL数据库默认关闭了缓存,座椅每个子查询都是相关子查询(相关子查询就是要循环执行多次的子查询)下面的代码就是一个执行相关子查询的代码,其中WHERE语句每过滤一条数据子查询就会执行一次,如果有一万条数据 就要执行一万次查询;但MyBatis登持久层框架开启了缓存功能,其中一级缓存就会保存子查询的结果,所以就可以放心的使用子查询。不过在SQL控制台使用子查询就代价过大了。

sql 复制代码
SELECT empno, ename
FROM t_emp
WHERE sal>(
SELECT sal 
FROM t_emp
WHERE empno = 7499
)
AND empno!=7499;

可以使用FROM代替WHERE子查询;把子查询放在FROM子句里面的查询,把查询的结果集当作一张表和t_emp表连接再添加约束

sql 复制代码
SELECT e.empno,e.ename
FROM t_emp e
JOIN (SELECT sal FROM t_emp WHERE empno = 7499) t
ON e.sal >t.sal AND e.empno != 7499

上面的两种代码都是实现查询工资(sal)比编号(empno)为7499多的员工的姓名(ename)和编号(empno)可以看到第一种查询所用的时间大于第二种的时间,虽然差的不多但是表中只有十几条数据,当表中数据比较多的时候差别就过呢个大了。

t_emp表

四、表的连接

在内连接里,查询条件下载ON子句或者WHERE子句,效果相同

sql 复制代码
SELECT e.ename,d.dname
FROM t_emp e 
JOIN t_dept d ON e.deptno  = d.deptno AND d.deptno = 10;
sql 复制代码
SELECT e.ename,d.dname 
FROM t_emp e 
JOIN t_dept d ON e.deptno = d.deptno
WHERE d.deptno = 10

t_dept表

外连接里,查询条件写在ON子句或者WHERE子句,效果不同;在下面的代码里面使用左连接的方式连接两个表t_dept(右表)和t_emp(左表)左连接会保留左表所有的记录和右表进行连接,右表如果有符合条件的记录改记录就和左边进行连接,如果没有符合的记录就会null值和左表进行连接。在外连接的连接条件并不强求符合连接条件才能查询出记录

sql 复制代码
SELECT e.ename,d.dname 
FROM t_emp e 
LEFT JOIN t_dept d ON e.deptno  = d.deptno
AND d.deptno=10;

而把查询条件写在WHERE子句里必须要符合查询条件才可以检索出数据

五、表连接修改

UPDATE语句中的WHERE子查询如何改成表连接

sql 复制代码
UPDATE t_emp e JOIN t_dept d ON e.deptno = d.deptno 
AND d.dname  = 'SALES'
SET e.sal = 10000,d.dname='销售部';

上面的代码可以同时更改两张表的数据;把t_emp表中所有的'SALES'部门的员工的sal改成10000,同时把t_dept表的'SALES'改为'销售部';

六、表连接删除

sql 复制代码
DELETE e,d -- 想要删除那张表的数据就把改表的别名写在DELETE子句里面
FROM t_emp e JOIN t_dept d 
ON e.deptno = d.deptno AND d.dname = '销售部';
相关推荐
张张123y5 小时前
# 后端第八课:数据库入门(给 FastAPI 接口加上“记忆“,存下问答历史)
数据库·sql·mysql·oracle·fastapi·sqllite
cspttty5 小时前
2027秋招市场调研岗:统计学专业如何补齐业务、SQL与研究交付能力
大数据·数据库
BD_Marathon6 小时前
Milvus数据库的DML操作
数据库·milvus
其实防守也摸鱼6 小时前
存储管理:页面置换算法学习任务(测验题要求给出置换页面顺序,缺页次数,缺页率)
android·前端·数据库·学习·oracle·自动化
cspttty6 小时前
2027校招:大数据管理与应用专业如何匹配电商运营与供应链管培生能力要求
大数据·数据库
ss2736 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 12 PostgreSQL数据目录与重要文件结构
数据库·笔记·postgresql
小天源6 小时前
智叟云集政策监测技术方案——原文解析、证据提取与可核验摘要
java·服务器·数据库
凤山老林6 小时前
从零搭建企业 OAuth2 授权中心:Spring Boot 集成 Spring Authorization Server 与
数据库·spring boot·spring
小羊没烦恼!6 小时前
在.net中读写config文件的各种方法
java·大数据·运维·服务器·前端·数据库·oracle
NocoBase7 小时前
本周更新|优化及缺陷修复
数据库·人工智能·开源·零代码·无代码