【数据库系统原理】数据库设计、表关系、多表查询

数据库设计内容

  • 设计有哪些表
  • 设计表有哪些字段
  • 设计表和表之间的关系

表关系

1.一对一

  • 如:用户和用户详情
  • 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
  • 实现方式:在任意一方加入外键,关联另一方主键,并设置外键为唯一(UNIQUE)

2.一对多(多对一)

  • 如:部门和员工
  • 一个部门对应多个员工,一个员工对应一个部门
  • 实现方式:从“多”的这个表创建一个外键指向“一”的表

3.多对多

  • 如:商品和订单
  • 一个商品对应多个订单,一个订单包含多个商品
  • 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

多表查询

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是分组之后对结果进行过滤。

执行顺序: where > 聚合函数 > having

事务(transaction)

包含一组数据库操作命令

  • 开启事务
    BEGIN; 或者 START TRANSACTION;

  • 提交事务
    COMMIT;

  • 回滚事务
    ROLLBACK;

事务的四大特征(ACID)

  • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
  • 一致性(Consistency): 事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolation): 多个事务之间,操作的可见性
  • 持久性(Durability): 事务一旦提交或回滚,对数据库中数据的修改是永久的

MySQL中默认情况下事务自动提交
可以使用select @@autocommit;进行提交方式的查询
修改事务的提交方式:
set @@autocommit = 0 0为手动提交;1为自动提交