【数据库系统原理】数据库设计、表关系、多表查询
数据库设计内容
- 设计有哪些表
- 设计表有哪些字段
- 设计表和表之间的关系
- 如:用户和用户详情
- 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
- 实现方式:在任意一方加入外键,关联另一方主键,并设置外键为唯一(UNIQUE)
- 如:部门和员工
- 一个部门对应多个员工,一个员工对应一个部门
- 实现方式:从“多”的这个表创建一个外键指向“一”的表
- 如:商品和订单
- 一个商品对应多个订单,一个订单包含多个商品
- 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
select * from 表1, 表2
会根据笛卡尔积计算表1、表2中所有的组合情况;因此重点在于如何消除无效数据?
连接查询
内连接 两个表的交集
隐式内连接(用得很多)
select * from table1, table2 where table1.xx = table2.xxx;
显式内连接
select * from table1 inner join table2 on table1.xx = table2.xxx;
select * from table1 join table2 on table1.xx = table2.xxx;
inner 可以省略外连接 左外连接 :相当于查询A表的所有数据和交集部分数据;
select * from table1 left outer join 表2 on 条件;
outer 可以省略
select * from table1 left join 表2 on 条件;
右外连接 :相当于查询B表的所有数据和交集部分数据;
select * from table1 right outer join 表2 on 条件;
outer 可以省略
select * from table1 right join 表2 on 条件;
子查询
概念: 查询中嵌套查询,称嵌套查询为子查询
根据查询结果不同,作用不同:
- 单行单列:作为条件值,使用 = != > <等进行条件判断
select 字段列表 from table1 where 字段名=(子查询)
- 多行单列:作为条件值,使用 in 等关键字进行条件判断
select 字段列表 from table1 where 字段名 in(子查询)
- 多行多列:作为虚拟表
select 字段列表 from (子查询)where 条件
这里的子查询后可以用as别名替代一下,方便写查询条件
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]
where和having的区别:
- 执行时机不一样,where是分组之前进行限定,不满足where条件不参与分组,having是分组之后对结果进行过滤。
事务(transaction) 包含一组数据库操作命令
- 开启事务
BEGIN;
或者START TRANSACTION;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
- 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
- 一致性(Consistency): 事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolation): 多个事务之间,操作的可见性
- 持久性(Durability): 事务一旦提交或回滚,对数据库中数据的修改是永久的
可以使用
select @@autocommit;
进行提交方式的查询修改事务的提交方式:
set @@autocommit = 0
0为手动提交;1为自动提交推荐阅读
- CSCI 150 Assembly分析
- leetcode算法13.罗马数字转整数
- java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
- 数据库|Redis——作为sql数据库缓存
- Redis|Redis——详解持久化
- 【课程笔记】中科大凸优化(二)
- 应用工具|【长期更新】盘一盘那些 uTools 高质量插件,让你的工作效率瞬间提升N倍!
- 墨天轮国产数据库沙龙 | 张玮绚(TDengine,高性能、分布式、支持SQL的时序数据库)
- 【Docker Desktop】在 Windows上安装 Docker Desktop
- C语言实现小型工资管理系统