本篇内容介绍了“mysql设计概念、多表查询和事务操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
数据库设计简介
1.数据库设计概念
数据库设计就是根据业务系统具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
建立数据库中的表结构以及表与表之间的关联关系的过程。
有哪些表?表里有哪些字段?表和表之间有什么关系?
2.数据库设计步骤
需求分析:数据库是什么?数据具体有哪些属性?数据与属性的特点是什么?
逻辑分析:通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统。
物理设计:根据数据库自身的特点把逻辑设计转换为物理设计。
维护设计:对新的需求进行建表和对表的优化。
3.表关系简介
在真实的开发中,一个项目中的数据,一般都会保存在同一个数据库中,但是不同的数据需要保存在不同的数据表中。这时不能把所有的数据都保存在同一张表中。
那么在设计保存数据的数据表时,我们就要根据具体的数据进行分析,然后把同一类数据保存在同一张表中,不同的数据进行分表处理。
数据之间必然会有一定的联系,我们把不同的数据保存在不同的数据表中之后,同时还要在数据表中维护这些数据之间的关系。这时就会导致表和表之间必然会有一定的联系。这时要求设计表的人员,就需要考虑不同表之间的具体关系。
在数据库中,表总共存在三种关系,真实的数据表之间的关系:多对多关系、一对多(多对一)、一对一(极少),(一对一关系就是我们之前学习的Map集合的key-value关系)
4.外键级联
在修改和删除主表的主键时,同时更新或删除从表的外键值,称为级联操作
ON UPDATE CASCADE – 级联更新,主键发生更新时,外键也会更新
ON DELETE CASCADE – 级联删除,主键发生删除时,外键也会删除
5.总结
1.为何要引用外键约束?
让表的数据有效性,正确性。提高查询效率。
2.添加外键约束语法?
constraint 外键约束名 foreign key(当前表的字段名) references 主表(主键)
3.有了外键约束操作数据注意事项?
要求添加数据需要先添加主表,然后添加从表。
要求删除数据需要先删除从表,然后再删除主表。
表关系(一对多)
一对多(多对一)
如:部门表 和 员工表
一个部门对应多个员工,一个员工对应一个部门
实现方式:在多的一方建立外键,指向一的一方的主键
mysql设计概念、多表查询和事务操作实例分析
表关系之一对一
一对一
如:用户和 用户信息
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
mysql设计概念、多表查询和事务操作实例分析
多表查询
mysql设计概念、多表查询和事务操作实例分析
准备数据
-- 价格create table price(
id int primary key auto_increment,
price double);-- 水果 create table fruit(
id int primary key auto_increment,
name varchar(20) not null,
price_id int,
foreign key (price_id) references price (id));-- 数据insert into pricevalues (1, 2.30);insert into pricevalues (2, 3.50);insert into pricevalues (4, null);insert into fruitvalues (1, '苹果', 1);insert into fruitvalues (2, '橘子', 2);insert into fruitvalues (3, '香蕉', null);
内连接查询
1.什么是内连接
内连接查询又称为交集查询,也就是查询只显示满足条件的数据
2.显示内连接
显示内连接:使用INNER JOIN...ON语句,可以省略INNER关键字
-- 语法核心select * from 表名1 inner join 表名2 on 条件;-- 或者select * from 表名1 join 表名2 on 条件;
3.隐式内连接
看不到JOIN关键字,条件使用WHERE指定
select 列名,列名,... from 表名1,表名2 where 表名1.列名=表名2.列名;
4.示例
查询水果的价格
-- 隐式内连接select * from fruit,price where fruit.price_id=price.id;-- 显式内连接select * from fruit inner join price on fruit.price_id=price.id;
mysql设计概念、多表查询和事务操作实例分析
查询苹果的信息,显示苹果的id,名字,价格
-- 方式1select fruit.id, fruit.name, price.pricefrom fruit,
pricewhere fruit.price_id = price.id and fruit.name = '苹果';-- 方式2select fruit.id, fruit.name, price.pricefrom fruit inner join
price on fruit.price_id = price.id and fruit.name = '苹果';
5.总结
1.内连接作用?
过滤笛卡尔积
获取两表的交集部分(都满足条件的部分)
2.什么是隐式内连接和显示内连接?
隐式内连接:看不到JOIN:select 列名,列名....from 表名1,表名2 where 表名1.列名=表名2.列名;
显示内连接:看得到JOIN:select * from 表名1 inner join 表名2 on 条件;
3.内连接查询步骤?
1)确定查询几张表
2)确定表连接条件
3)根据需要在操作
外连接查询
1.左外连接
左表的记录全部显示出来
外表只会显示符合搜索条件的记录
语法格式:
select * from 表1 left [outer] join 表2 on 条件;
说明:
left关键字左边的表定义为左表,left关键字右边的表定义为右表,查询的内容以左表为主
如果左表有数据,而右表没有数据对应的数据,仍然会把左表数据进行显示
outer关键字可以省略
练习:
不管能否查到水果对应价格,都要把水果显示出来
-- 左外连接查询select * from fruit left outer join price on fruit.price_id=price.id;
2.右外连接
右表的记录全部表示出来
左表只会显示符合搜索条件的记录
语法格式:
select * from 表名1 right [outer] join 表名2 on 条件;
说明:
right关键字左边的表定义为左表,right关键字右边的表定义为右表,查询的内容以右表为主
如果右表没有数据,而左表没有对应的数据,仍然会把右表数据进行显示
outer关键字可以省略
练习:
不管能否查到价格对应的水果,都要把价格显示出来
select * from fruit right outer join price on fruit.price_id=price.id;
总结:
1.掌握左外连接查询格式?
select * from 表1 left outer join 表2 on 条件;
表1看作为左表,表2看做为右表
2.左外连接查询特点?
在满足要求的基础上保证左表的数据全部显示
3.掌握右外连接查询格式?
select * from 表1 right outer join 表2 on 条件;
4.右外连接查询特点?
在满足要求的基础上,保证右表的数据全部显示
嵌套查询(子查询)
1.什么是子查询
一条查询语句结果作为另一条查询语法一部分。
SELECT 查询字段 FROM 表 WHERE 条件;举例:SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee);
说明:子查询需要放在()中
三种子查询情况:单行单列、多行单列、多行多列。
2.单行单列
子查询结果是单列,在WHERE后面作为条件
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
通常使用比较运算符: > 、>= 、<、<=、=等
3.多行单列
子查询结果是多行单列,结果集类似于一个数组,在WHERE后面作为条件,父查询使用IN运算符
-- IN表示在数值中SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
4.多行多列
子查询结果是多列,在FROM后面作为表
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
注意:子查询作为表需要取别名,使用as,可以省略,否则这张表没用名称无法访问表中的字段
事务操作
事务的概念
什么是事务
在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败,就进行事务的回滚,所有的SQL语句全部执行失败。
简而言之,事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。
事务作用:保证在一个事务中多次操作数据库表中数据时,要么全都成功,要么全都失败。
事务的应用场景声明
关于事务在实际中的应用场景:
假设我在淘宝买了一部手机,然后当我付完款,钱已经从我的账户中扣除。正当此时,淘宝转账系统宕机了,那么此时淘宝还没有收到钱,而我的账户的钱已经减少了,这样就会导致我作为买家钱已经付过,而卖家还没有收到钱,他们不会发货物给我。这样做显然是不合理。实际生活中是如果淘宝出问题,作为用户的账户中钱是不应该减少的。这样用