为了不让使用数据库的程序员看到敏感/隐私数据(比如别人的账户多少钱),DBA就可以创建视图,让程序员看到DBA想让他看到的东西,专心于事务就好了,是一种“外模式/模式”的映射,实现了逻辑独立性
本质呢,是虚表,不是真的表,隐藏了表的结构
从某种层面说呢,他也降低了SQL的复杂度
就是把表的查询结果的表作为视图,其实也就是保存查询语句了
mysql> select * from score; +------+---------+---------+------+ | id | chinese | english | math | +------+---------+---------+------+ | 1 | 98 | 99 | 100 | | 2 | 90 | 92 | 80 | +------+---------+---------+------+ 2 rows in set (0.00 sec) mysql> create view vw_score as select id,math from score; Query OK, 0 rows affected (0.02 sec) mysql> select * from vw_score; +------+------+ | id | math | +------+------+ | 1 | 100 | | 2 | 80 | +------+------+ 2 rows in set (0.00 sec)(同表)
这个就不一样了,它是用的alter
mysql> alter view vw_score as select id,chinese from score; Query OK, 0 rows affected (0.01 sec) mysql> select * from vw_score; +------+---------+ | id | chinese | +------+---------+ | 1 | 98 | | 2 | 90 | +------+---------+ 2 rows in set (0.00 sec)用的是drop,比如:
drop view vw_score;要让视图的子查询生效,要这么创建:
create algorithm=TEMPTABLE view vw_score as select id,math from score;所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)
事务不可再分,要么执行,要么不执行
事务开始前和事务结束后**,**数据库的完整性约束没有被破坏
这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
比如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)
多个事务并发访问时,事务间是隔离的,比如A和B的交易、B和C的交易之间是隔离开的,运行结果是没问题的
在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间
事务提交了,结果就定下来了,该事务所对数据库所作的更改便持久的保存在数据库之中,不会再改变,回滚也没用!
引擎要为InnoDB
涉及敏感数据,比如金钱转账
最直接的就是加快查询,但带来的副作用就是对表的增删改慢了不少,而且还占空间;所以确实经常要查某个字段的数据,再设置索引;还有,要是表小的话也别用索引,没必要
它不像视图,只能查,它是支持增删改的,就像是SQL里的函数;它的出现就是为了实现“模块化”,一般是DBA来写的
首先要把SQL语句集合起来,但是一遇到;就会执行,怎么办呢?用delimiter # 把语句结束符改为//,;就无效了 delimiter // 然后就是写函数了 create procedure proc() begin # 操作 end // 写完之后准备调用,记得把;调回来 delimiter ; call proc();涉及敏感数据别忘了嵌套上“事务”
删除存储过程 drop procedure proc;在SQL层就能搞定的就在SQL搞定,别交给service再搞
ceil()向上取整 mysql> select ceil(3.1); +-----------+ | ceil(3.1) | +-----------+ | 4 | +-----------+ 1 row in set (0.00 sec)floor()向下取整(用法同上)
round()四舍五入(用法同上)
truncate()截取
mysql> select truncate(3.1415926535,2); +--------------------------+ | truncate(3.1415926535,2) | +--------------------------+ | 3.14 | +--------------------------+ 1 row in set (0.00 sec)ucase(string)转化为大写
lcase(string)转化为小写
left(string,num)左截取string的前num个字符
right(string,num)右截取string的后num个字符
substring(string,start,num)从start位置开始截取num个字符
concat(str1,str2)拼接字符串