约束是作用于表中列上的规则,用于限制加入表的数据,约束的存在保证了数据库中数据的正确性、有效性和完整性。
利用约束创建表
需要注意的是:
1、主键是一行数据的唯一标识,要求非空且唯一。一张表只能有一个主键。
2、默认约束只有在不给值时才会采用默认值。如果给了null,那值就是null值。
3、auto_increment一般和主键用在一起,当主键类型为int类型时,不给主键赋值时,主键的值会自动增长。
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。
利用外键约束创建表,添加外键 dep_id,关联 dept 表的id主键。
创建一个员工表,并使用外键约束和部门表关联到一起。
创建一个部门表
往员工表和部门表中添加元素:
员工表中的dep_id字段是部门表的id字段关联,也就是说1号员工张三属于1号部门研发部的员工。现在我要删除1号部门,会发现无法删除。
所以使用了外键约束,可以保证数据的一致性和完整性。因为如果此时可以删除1号部门,那么属于1号部门的员工这些数据全部都是错误数据,因为他们的部门没有了。
需要注意的是Mysql中innodb是支持外键的,而myisam是不支持外键的。
多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。多表查询分为:内连接查询、外连接查询、子查询。
内连接查询相当于查询 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;
两种连接方式在查询结果的功能上是等效的,它们都可以实现相同的连接操作。然而在性能和可读性方面存在一些差异。
左外连接:相当于查询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;
查询中嵌套查询,称嵌套查询为子查询。
查询工资高于猪八戒的员工信息。
select * from emp where salary > (select salary from emp where name = '猪八戒');
括号里面的是子查询,用来查询猪八戒的工资,再把这条查询结果当做条件,就形成了嵌套查询。
数据库的事务(Transaction)是一种机制、指的是把一组SQL操作看成一个整体,在执行的过程中要么同时成功,要么同时失败。
具体的例子:
张三和李四的账户中各有1000块钱,现李四需要转500块钱给张三,模拟的转账操作为:
第一步:查询李四账户余额
第二步:从李四账户金额 -500
第三步:给张三账户金额 +500
现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500。下图就是出现的错误结果。
使用事务可以解决上述问题
从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。
将上述案例添加事务后的sql:
上面sql中执行成功则选择执行提交事务,而出现问题则执行回滚事务。但是在实际工作中我们肯定不会这样操作,而是在java代码中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。
mysql中的事务是自动提交的。也就是说我们不需要添加3.1中的事务执行sql语句,语句执行完毕会自动的提交事务。
Oracle中的事务是手动提交的,执行完sql语句需要我们手动Commit(提交)或者rollback(回滚)。
可以通过下面语句查询默认提交方式:
SELECT @@autocommit;
查询到的结果是1 则表示自动提交,结果是0表示手动提交。
原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) :多个事务之间,操作的可见性
持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的