DAY7sql事务和视图

存储引擎
完整的建表语句
Create table t_x(id int(11) DEFAULT NULL) engine=innodb default charset=utf8;
//飘号
注意:在mysql 凡是标识符可以用飘号括起来的,别用 不通用
建表可以指定存储引擎,也可以指定字符集
Mysql默认使用的存储引擎是Innob方式
默认使用的字符集是UTF8
什么是存储引擎呢
存储引擎这个名字只有mysql中存在,在Oracle有相应的机制但不叫存储引擎
Mysql支持很多存储引擎,每一个存储引擎都是对应了一种不同的存储方式
每个存储引擎都有自己的缺点,需要在合适的时机选择合适的存储引擎
任务63:057 常见的存储引擎有哪些.flv
2.3查看当前mysql支持的存储引擎
show engines \g
mysql> show engines \g
±-------------------±--------±---------------------------------------------------------------±-------------±-----±-----------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
±-------------------±--------±---------------------------------------------------------------±-------------±-----±-----------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
±-------------------±--------±---------------------------------------------------------------±-------------±-----±-----------+
9 rows in set (0.00 sec)
*任务64:058 MyISAM存储引擎.flv
常见的存储引擎
MyISAM存储引擎
Engine:MyISAM
Support:yes
Comment:MYISAM storage engine
transactionL:no
XA:no
Savepoints:no
MyISAM这种存储引擎不支持事务
MyISAM是最为常用引擎,但是不是默认的
Select * from emp;
搞定J2EE -----BAIDU ENIGINE索引提高效率
mysql> select * from emp where ename = ‘smith’;
±------±------±------±-----±-----------±-------±-----±-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
±------±------±------±-----±-----------±-------±-----±-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
±------±------±------±-----±-----------±-------±-----±-------+
1 row in set (0.00 sec)
3种类型的文件
mysql> use mysql;
Database changed
mysql> show tables;
存结构 表的格式
±--------------------------+
| Tables_in_mysql |
±--------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
±--------------------------+
28 rows in set (0.00 sec)
Myisam采用三个文件组织一张表
Xxx.frm(存储格式的文件)
Xxx.MYD(存储表种数据的文件)
Xxx.MYI(存储表中索引的文件)
优点:可被压缩 节省空间 并且可以转换为只读表 提高检索效率

任务65:059 InnoDB存储引擎.flv
InnoDB存储引擎
Engine:InnoDB
Support:DEFEAULT
Comment:supports transactions,row_level locking, and foreign keys
Transaction:yes
XA:yes
Savepoints:yes
优点:支持事务,行级表,外键。这种存储引擎数据的安全得到保障
存储在表空间,没办法压缩
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读
这种InnoDB存储引擎在MYsql数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新
Mysql删除父表,外键有父的都删掉

任务66:060 MEMORY存储引擎.flv

Engine:MEMORY
Support:DEFEAULT
Comment:hash based, stored in memory, useful for temporary tables
Transaction:no
XA:no
Savepoints:no
缺点:不支持事务。数据容易丢失。因为所有数据和索引都是
存储在内存当中的。
优点:查询速度最快。
以前叫做HEPA 引擎

https://blog.csdn.net/ddl12131/article/details/121946297

任务68:061 34道作业题的第1题.flv
Mysql34道作业题
1.取每个部门最高薪水的人员名称
(1)取得每个部门最高薪水
Select deptno,max(sal) as maxsal from emp group by deptno;
Select empname.deptno.max(sal) as maxsal freom emp group by ename;(错)
2合成表 别名 join()
(2)将以上结果当作临时表t,t表和emp e表进行连接,条件是:
T.deptno=d.deptno and t.maxsal=e.sal
Select xx
From t
Join emp e
On
U.deptno=e.deptno and t.maxsal=e.sal;

Select e.ename,t*
From (select deptno,max(sal) as maxsal from emp group by deptno) t
Join emp e
On t.deptno=e.deptno and t.maxsal=e.sal;
mysql> select e.ename,t.*
-> from (select deptno,max(sal) as maxsal from emp group by deptno) t
-> join
-> emp e
-> on
-> t.deptno=e.deptno and t.maxsal=e.sal;
±------±-------±--------+
| ename | deptno | maxsal |
±------±-------±--------+
| BLAKE | 30 | 2850.00 |
| SCOTT | 20 | 3000.00 |
| KING | 10 | 5000.00 |
| FORD | 20 | 3000.00 |
±------±-------±--------+
4 rows in set (0.00 sec)
任务69:062 事务概述.flv
事务(transaction)
一个事务是一个完整的业务逻辑单元,不可再分
比如:银行账户转账,从a账户向b账户转账10000,需要执行两条update语句
Update t_act set balance=balance -1000 where actno =’act-001’;
Update t_act set balance=balance +1000 where actno =’act-002’;
以上两条DML语句必须同时成功 或者同时失败 不允许出现一条成功 一条失败
要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的’事务机制‘
3.2和事务相关的语句只有:DML语句(insert delete update)
为什么?因为他们这三个语句都是数据库当中的“数据”相关的
事务的存在是为了保证数据的完整性,安全性
3.3假设所有的事务都是能使用1条DML语句搞定,
还需要事务机制吗?
不需要事务。
实际情况下不是这样,通常一个事务【业务】 需要多条DML语句共同联合完成的
3.4
任务70:063 事务的原理.flv

任务71:064 事务四大特性.flv
事务特性
事务包括四大特性:ACID
A:原子性 atomicity 事务是最小的工作单元,不可再分
C:一致性coherence 事务必须保证多条DML语句同时成功或者失败
I:隔离性 Isolation 事务A与事务B之间具有隔离
D:持久性durability 持久性说的是最终数据必须持久化到硬盘文件中 事务才算成功的结束

任务72:065 事务的隔离性.flv
3.5关于事务之间的隔离性
事务隔离性级别,理论上隔离级别包括4个
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当签事务可以读取到对方未提交的数据
读未提交存在脏读(Dirty read)现象:表现读到了脏的数据
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到
读已经提交存在的问题是:不可重复读。
第三级别:可重复读(repeated read)
这种隔离级别解决了:不可重复读问题
这种隔离级别存在的问题是:读到的数据是幻象,
第四级别:序列化读/串行化读
解决了所有问题
效率低,需要事务排队
Oracle 数据库默认的隔离级别是:读已提交
Mysql数据库m默认的隔离级别是:可重复读

任务73:066 演示事务.flv
Mysql事务默认情况下是自动提交的(什么是自动提交?只要执行任意一条DML语句则提交一次)
怎么关闭自动提交? start transaction;
准备表:
Use bjpowernode;
Drop table if exists t_user;
Create table t_user(
Id int primary key auto_increment,username varchar(255));
mysql> show tables;
演示:
mysql> insert into t_user(username) values(‘zs’);
Query OK, 1 row affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_user(username) values(‘lisi’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(username) values(‘wangwu’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
| 2 | lisi |
| 3 | wangwu |
±—±---------+
3 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
±—±---------+
1 row in set (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
±—±---------+
1 row in set (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_user(username) values(‘wangwu’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(username) values(‘rose’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(username) values(‘jack’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
±—±---------+
4 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
±—±---------+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;
±—±---------+
| Id | username |
±—±---------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
±—±---------+
4 rows in set (0.00 sec)
任务74:067 演示读未提交(上).flv
第一:演示read uncommitted
mysql> use bjpowernode;
Database changed
设置事务的隔离级别
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
查看事务的全局隔离级别
mysql> select @@global.tx_isolation;
±----------------------+
| @@global.tx_isolation |
±----------------------+
| READ-UNCOMMITTED |
±----------------------+
1 row in set (0.00 sec)
mysql> exit;
Bye
两个cmd不同操作

读未提交级别

任务75:068 演示读已提交(下).flv???
第一种:read uncommitted
第二种:演示read committed
mysql> use bjpowernode;
Database changed
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.tx_isolation;
±----------------------+
| @@global.tx_isolation |
±----------------------+
| READ-COMMITTED |
±----------------------+
1 row in set (0.00 sec)

任务76:069 演示可重复读(上).flv
第三个隔离级别:
Repeatable read
C:\Users\Administrator>mysql -uroot -proot
mysql> use bjpowernode;
mysql> set global transaction isolation level repeatable read;
mysql> select @@global.tx_isolation;
±----------------------+
| @@global.tx_isolation |
±----------------------+
| REPEATABLE-READ |
±----------------------+
1 row in set (0.00 sec)

任务77:070 演示串行化读(下).flv
第四:演示serializable
mysql> set global transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.tx_isolation;
±----------------------+
| @@global.tx_isolation |
±----------------------+
| SERIALIZABLE |
±----------------------+
1 row in set (0.00 sec)

mysql> exit;
Bye

C:\Users\Administrator>

第二张图

任务78:071 索引.flv
索引
什么是索引 有什么用
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源
再数据库方面,查询一张表的时候有两种检索方式
第一种方式:全表扫描
第二种方式:根据索引检查
索引为什么可以提高检索效率呢
其实最根本的原理是缩小了扫描的范围
索引虽然可以提高索引效率,但是不能随意的添加索引,因为索引也是数据库当种的对象,也需要数据库不断的维护,维护具有成本。比如,表中的数据经常被修改这样就不适合添加索引,因为数字一旦修改,索引需要重新排序,进行维护.
添加索引是给某一个字段,或者说某些字段添加索引
Select ename,sal from emp where ename=’SMITH’;
当ename字段没有添加索引的时候,以上sql语句会进行全表扫描,扫描ename字段中所有的值
当ename字段添加索引的时候,以上sql语句会进行索引扫描,快速定位。
4.2怎么创建索引对象?怎么删除索引对象?
Create index 索引名称 on 表名(字段名); 、
删除索引对象
Drop index 索引名称;Oracle
Drop index 索引名称 on 表名;

4.3什么时候考虑给字段添加索引?(满足什么条件)
数据量庞大。(根据客户的需求,根据线上的环境)
该字段很少的DML条件。(因为字段进行修改操作,索引也需要维护)
该字段经常出现再where子句中。(经常根据哪个字段查询)
4.4注意 主键和具有unique约束的字段自动会添加索引
根据主键查询效率较高,尽量根据主键检索
4.5查看sql语句的执行计划
Explain select ename,sal from emp where sal =5000;
mysql> use bjpowernode;
Database changed
mysql> Explain select ename,sal from emp where sal =5000;
±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+
| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |
±—±------------±------±-----±--------------±-----±--------±-----±-----±------------+
1 row in set (0.00 sec)

给薪资sal字段添加索引:
mysql> create index emp_sal_index on emp(sal);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
4.6索引底层采用的数据j结构是:B+Tree
4.7索引的实现原理
mysql> select ename from emp order by ename;
±-------+
| ename |
±-------+
| ADAMS |
| ALLEN |
| BLAKE |
| CLARK |
| FORD |
| JAMES |
| JONES |
| KING |
| MARTIN |
| MILLER |
| SCOTT |
| SMITH |
| TURNER |
| WARD |
±-------+
14 rows in set (0.00 sec)

mysql> select ename from emp order by ename asc;

4.7索引的实现原理
通过B tree 缩小扫描 范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引到数据之后,获取到关联的物理地址,通过地址定位表中的数据,效率是最高的
Select ename from emp where ename =’smith’;
通过索引转化为:
Select ename from emp where 物理地址 =0x3;
4.8索引的分类
单一索引,给单个字段添加索引
符合索引:给多个字段联合起来添加1个索引
主键索引:主键上自动添加索引
唯一索引:有unique约束的字段上自动添加索引
。。。
4.9索引什么时候失效
Select ename from emp where ename like ‘%A%’;
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。
任务79:072 视图.flv
5.视图 view
什么是视图
站在不同的角度取看到数据 (同一张表的数据,通过不同的角度看待)
5.2 怎么创建视图?怎么删除视图
Create view myview as select empno,ename from emp;
Drop view myview;
注意:只有DQL语句才能以视图对象的方式创建出来
5.3对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据,不是直接操作的原表)
可以对视图进行CRUD操作
5.4
mysql> create view myview as select empno,ename from emp;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from myview;
±------±-------+
| empno | ename |
±------±-------+
| 7369 | SMITH |
| 7499 | ALLEN |
| 7521 | WARD |
| 7566 | JONES |
| 7654 | MARTIN |
| 7698 | BLAKE |
| 7782 | CLARK |
| 7788 | SCOTT |
| 7839 | KING |
| 7844 | TURNER |
| 7876 | ADAMS |
| 7900 | JAMES |
| 7902 | FORD |
| 7934 | MILLER |
±------±-------+
14 rows in set (0.00 sec)
mysql> create table emp_bak as select * from emp;
Query OK, 14 rows affected (0.02 sec)
Records: 14 Duplicates: 0 Warnings: 0
mysql> create view myview1 as select empno,ename,sal from emp bak;
Query OK, 0 rows affected (0.01 sec)
mysql> update myview1 set ename=‘hehe’, sal=1 where empno=7365;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0

mysql> update myview1 set ename=‘hehe’,sal=1 where empno=7369;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0//通过视图修改原表数据;

mysql> delete from myview1 where empno=7369; //通过视图删除原表数据
Query OK, 1 row affected (0.00 sec)
5.5视图的作用
视图可以隐藏的实现细节,保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD
mysql> create view myview2 as select empno a,ename b,sal c from emp_bak;
Query OK, 0 rows affected (0.01 sec)
mysql> select view2 from myview2;
ERROR 1054 (42S22): Unknown column ‘view2’ in ‘field list’
mysql> select * from myview2;
±-----±-------±--------+
| a | b | c |
±-----±-------±--------+
| 7369 | SMITH | 800.00 |
| 7499 | ALLEN | 1600.00 |
| 7521 | WARD | 1250.00 |
| 7566 | JONES | 2975.00 |
| 7654 | MARTIN | 1250.00 |
| 7698 | BLAKE | 2850.00 |
| 7782 | CLARK | 2450.00 |
| 7788 | SCOTT | 3000.00 |
| 7839 | KING | 5000.00 |
| 7844 | TURNER | 1500.00 |
| 7876 | ADAMS | 1100.00 |
| 7900 | JAMES | 950.00 |
| 7902 | FORD | 3000.00 |
| 7934 | MILLER | 1300.00 |
±-----±-------±--------+
14 rows in set (0.00 sec)

mysql> insert into myview2(a,b,c) values(…);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘…)’ at line 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值