新零售数据库设计 笔记(一)

527 阅读2分钟

配置数据库

本地登陆数据库

mysql -u root -p

修改root密码

alter user user() identified by "abc123456"

好用的CURD操作

  1. 数据插入
  • 批量插入数据,因为一条记录的问题,全部数据都写入失败
  • 实现不存在就插入,存在就更新sql语句
INSERT INTO table_name(id, props) VALUES
  (4, xxx),
  (5, xxx)
ON DUPLITCATE KEY UPDATE ip=VALUES(props)

ON DUPLITCATE KEY UPDATE这个语句的是如果制定字段已经存在就执行update语句

  • Mysql数据库默认关闭了缓存,所以每个子查询都是相关子查询
  • 相关子查询就是要循环执行多次的子查询 下面这个sql语句每查询一条记录都执行一次子查询
 SELECT id, props
 FORM table_name
 WHERE props > (
   SELECT props 
   FORM table1_name
   WHERE props = value
 )
  • 使用FORM子查询,替代WHERE子查询,FORM子查询只会执行一次,所以不是相关子查询
SELECT t.id,t.props FORM table_name t 
JOIN (SELECT props FORM table2_name) ON props = value
  • 内连接里,查询条件写在ON子句或者WHERE子句,效果相同
SELECT e.ename, d.dname FROM t_emp e
JOIN t_dept d ON e.deptno = d.deptno AND d.deptno = 10;

SELECT e.ename, d.dname FROM t_emp e
JOIN t_dept d ON e.deptno = d.deptno
WHERE d.deptno = 10;
  • 外连接里,查询条件写在ON子句或者WHERE子句,效果不同
SELECT e.ename, d.dname FROM t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno AND d.deptno = 10;

SELECT e.ename, d.dname FROM t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno
WHERE d.deptno = 10;

因为是left连接表,查询会把左表也就是t_emp全部查询出来,并用右表t_dept去判断条件是否满足,满足的话把右表记录跟左表连在一起,否则NULL连接左表

  • UPDATE语句中的WHERE子查询如何改成表连接 优化前,相关子查询
UPDATE t_emp SET sal = 10000
WHERE deptno = 
(SELECT deptno FROM t_dept WHERE dname = 'SALES')

优化后,表连接,不仅可以修改t_emp,也修改t_dept

UPDATE t_emp e JOIN t_dept d ON e.deptno = d.deptno
AND d.dname='SALES'
SET e.sal = 10000, d.dname="销售部"
  • DELETE语句中也可以使用表连接
DELETE e, d FROM t_emp e JOIN t_dept d
ON e.deptno =d.deptno AND d.dname = "销售部"