JavaWeb(四)

一、约束的概念和分类

约束是作用于表中列上的规则,用于限制加入表的数据,约束的存在保证了数据库中数据的正确性、有效性和完整性。

1.1、单表约束

JavaWeb(四)_第1张图片

利用约束创建表

JavaWeb(四)_第2张图片

需要注意的是:

1、主键是一行数据的唯一标识,要求非空且唯一。一张表只能有一个主键

2、默认约束只有在不给值时才会采用默认值。如果给了null,那值就是null值。

3、auto_increment一般和主键用在一起,当主键类型为int类型时,不给主键赋值时,主键的值会自动增长。

1.2、多表约束

外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。

利用外键约束创建表,添加外键 dep_id,关联 dept 表的id主键。

创建一个员工表,并使用外键约束和部门表关联到一起。

JavaWeb(四)_第3张图片

创建一个部门表

JavaWeb(四)_第4张图片

往员工表和部门表中添加元素:

JavaWeb(四)_第5张图片

JavaWeb(四)_第6张图片

员工表中的dep_id字段是部门表的id字段关联,也就是说1号员工张三属于1号部门研发部的员工。现在我要删除1号部门,会发现无法删除。

所以使用了外键约束,可以保证数据的一致性完整性。因为如果此时可以删除1号部门,那么属于1号部门的员工这些数据全部都是错误数据,因为他们的部门没有了。

需要注意的是Mysql中innodb是支持外键的,而myisam是不支持外键的。

二、多表查询

多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。多表查询分为:内连接查询外连接查询子查询

JavaWeb(四)_第7张图片

2.1、内连接查询

内连接查询相当于查询 A B 交集数据。内连接查询又分为隐式内连接和显示内连接。

隐识内连接:(平常工作中最常用的)

SELECT 字段列表 FROM 表1,表2… WHERE 条件;

SELECT * FROM emp,dept 

WHERE emp.dep_id = dept.did;

显示内连接:

SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;

select * from emp inner join dept on emp.dep_id = dept.did;

两种连接方式在查询结果的功能上是等效的,它们都可以实现相同的连接操作。然而在性能和可读性方面存在一些差异

2.2、外连接查询

左外连接:相当于查询A表所有数据和交集部分数据

右外连接:相当于查询B表所有数据和交集部分数据

查询emp表所有数据和对应的部门信息(左外连接)

select * from emp left join dept on emp.dep_id = dept.did;

查询dept表所有数据和对应的员工信息(右外连接)

select * from emp right join dept on emp.dep_id = dept.did;

2.3、子查询

查询中嵌套查询,称嵌套查询为子查询

查询工资高于猪八戒的员工信息。

select * from emp where salary > (select salary from emp where name = '猪八戒');

括号里面的是子查询,用来查询猪八戒的工资,再把这条查询结果当做条件,就形成了嵌套查询。

三、事务

数据库的事务(Transaction)是一种机制、指的是把一组SQL操作看成一个整体,在执行的过程中要么同时成功,要么同时失败

具体的例子:

张三和李四账户中各有1000块钱,现李四需要转500块钱给张三,模拟的转账操作为:

第一步:查询李四账户余额

第二步从李四账户金额 -500

第三步:给张三账户金额 +500

现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500下图就是出现的错误结果

JavaWeb(四)_第8张图片

使用事务可以解决上述问题

JavaWeb(四)_第9张图片

从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题

3.1、数据库中事务的语法

JavaWeb(四)_第10张图片

将上述案例添加事务后的sql:

JavaWeb(四)_第11张图片

上面sql中执行成功选择执行提交事务,而出现问题则执行回滚事务。但是在实际工作中我们肯定不会这样操作而是在java代码中进行操作,在java中可以抓取异常没出现异常提交事务,出现异常回滚事务。

3.2、Mysql和Oracle中关于事务的区别

mysql中事务是自动提交的也就是说我们不需要添加3.1中的事务执行sql语句,语句执行完毕会自动的提交事务。

Oracle中的事务是手动提交的,执行sql语句需要我们手动Commit(提交)或者rollback(回滚)。

3.3、查询数据库中事务的提交方式

可以通过下面语句查询默认提交方式:

SELECT @@autocommit;

查询到的结果是1 则表示自动提交,结果是0表示手动提交。

3.3、事务的四大特征

原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败

一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态

隔离性(Isolation) :多个事务之间,操作的可见性

持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

你可能感兴趣的:(JavaWeb,数据库,java)