一.
where 和having的区别?
1)where和having都是用于对表中的记录进行筛选过滤
2)where用于在分组之前对记录进行筛选过滤,而having用于对分组之后的记录进行筛选过滤
3)where 子句不能使用多行函数 和 列别名, 但可以使用表别名
select name 姓名,sal 薪资 from emp e;
----其中上面的’姓名’,'薪资’都是列别名,e是表别名!
4)having子句可以使用多行函数 和 列别名 以及 表别名!
二.
char和varchar有什么区别?
1) char和varchar存的数量是不同的, char类型最多能存255个字符, varchar类型最多能存65535个字节
2) char类型如果存的数据量小于最大长度, 剩余的空间会使用空格填充, 因此可能会浪费空间
所以char类型适合存储长度固定的数据, 这样既不会浪费空间, 效率还比varchar略高
3) varchar类型如果存的数据量小于最大长度, 剩余的空间会留给别的数据使用
所以varchar类型适合存储长度不固定的数据, 这样虽然没有char存储效率高, 但至少不会浪费空间。
三
主键约束 和 (非空+唯一约束) 有什么区别:
1) 主键约束 和 非空+唯一 特点是相同的, 都是不能为空且不能重复
2) 主键约束除了非空且不能重复之外, 还可以表示唯一一行表记录, 即作为表记录的唯一标识。
四
事务的四大特征 1)原子性 2)一致性 3)隔离性 4)持久性
1)原子性:原子曾被认为是最小单位,不能被分割, 这里的原子性其实是指:
事务中的所有SQL是一个整体,不能被分割。不存在一部分SQL执行成功,而另一部分SQL执行失败,都执行成功才算成功,有一条失败就算失败!
--------------------------------------------
2)一致性:在事务执行前后(不管事务最后是提交还是回滚)的业务数据之和是保持一致的!
--------------------------------------------
以转账为例: A、B账户各有1000元,A给B转账100元
A账户减去100元:update account set money=money-100 where name=‘A’;
B账户加上100元:update account set money=money+100 where name=‘B’;
如果上面的SQL是在一个事务中执行的, 可以保证A和B的账户金额之和在转账前、转账后是一致的!
情况1: 上面的SQL都成功了, 事务最后提交了
A账户减去100 = 900;
B账户加上100 = 1100;
A+B总和是2000, 和转账前总金额一致!
情况1: 上面的SQL有一条或者两条失败了, 按全失败处理, 事务最后回滚了
A的钱没少, B的钱也没多, 和转账前一致!
--------------------------------------------
3)隔离性:在事务并发时, 一个事务理论上看不到另外一个事务的状态, 也就是说事务之间是相互隔离开来的!
一个事务只能看到另外一个事务没开始之前的数据状态, 或者只能看到另外一个事务已经结束之后的数据状态!
事务1--开启事务, 查询A+B的账户金额之和
A+B账户金额之和: 2000
事务2--开启事务, 完成一个转账操作(A给B转账100元)
A减去100元=900
--------------
B加上100元=1100
--------------------------------------------
4)持久性:一旦事务提交之后, 事务中对数据的更新操作会持久的保存到数据库中(最终是更新到硬盘的数据文件里)
反过来说, 在事务提交之前, 对数据的更新操作只是一个临时的数据, 没有真正的去修改数据库。
-- 开启事务:
A减去100元: update account set money=money-100 where name='A'; 900元
B加上100元: update account set money=money+100 where name='B'; 1100元
-- 结束事务(提交,回滚)