mysql(下)

一.多表查询
多表查询的结果叫做,笛卡尔积,就是A集合和B集合.组合情况就叫做笛卡尔积,A集合5行,B集合3行,总共就查出来15行
消除无用的数据.
以下消除方式
1.内连接查询
从哪些表查询,条件是什么,需要查询哪些字段的信息?
1.隐式内连接:使用where 条件消除无用的数据
select emp.name,dep.name from emp,dept where emp.dep_id = dep.id
2.显示内连接:查询所有员工信息和对应的部门信息
select emp.name,d.name from emp inner join dept on emp.dep.id = dept.id
select e,p.name,dept.name from emp join dept on emp.dep.id = dept.id --inner可以省略
个人理解这个内连接的隐式 和 显示, 其实显示效果一样的,区别就是一个是where条件,一个是join on条件

2.外连接查询
1.左外连接
select 字段列表 from 表1 left outer join 表2 on 条件; --outer可以省略
select 字段列表 from 表1 left join 表2 on 条件;
select t1.*,t2.name from emp t1 left join dep t2 on t1.dep_id = t2.id;
左外连接就是查询左表所有数据以及交集部分
2.右外连接
select 字段列表 from 表1 right join 表2 on 条件;
查询右表的所有记录以及交集部分
左外和右外就是相对的关系,掌握一个就可以,比如表1和表2交换一下位置继续用左外连接,其实就相当于右外连接
3.子查询
select * from emp where emp.salary = (select max(salary) from emp);
多行多列
select * from dept t1,(select * from emp where emp.join_date >'2011-11-11') t2 where t1.id = t2.dept_id;

二.事务(开启事务,回滚,提交)
多个步骤的业务操作,执行就执行一串流程,要不就是所有语句成功也要不就是所有语句失败
比如转账,如果转账失败了可能钱就飞了,所以务必业务操作开启为事务
start transaction;开启事务
代码业务操作
一旦发现数据不对 就回滚事务,找到上面执行的事务恢复数据
rollback;
发现执行没有问题,就commit;提交事务

在mysql中自动提交事务:一条dml增删改语句,语句会自动提交一次事务.一条dml相当于一个事务
select @@autocommit; 1代表自动提交,0代表手动提交
set @@autocommit
这里mysql是自动提交的,一条dml语句.但Oracle是手动提交

事务的特性:原子性(不可分割),持久性(一直被保留修改),隔离性(多个事务相互独立),一致性(事务操作前后,数据总量不变)

DCL管理用户 DBA数据库管理员

三.索引
避免sql语句的耗时过多
创建索引create index 索引名 on 表名(字段名);
无索引数据量越大,效率越低,就需要全表扫描,然而索引是帮助数据库高校获取数据的数据结构
有索引也就是把数据建立为一个二叉排序树,这样查询是极高效的

优点
提高数据查询的效率,降低数据库的IO成本。
通过索引列对数据进行排序,降低数据排序的成本降低CPU消耗。
缺点
索引会占用存储空间
索引大大提高了查询效率,同时却也降低了insert.update、delete的效率。

默认索引是B+树结构组织的索引

B+树根节点存在的数,在叶子节点也存在。每个根下的指针指向数据的头部指针
一般在三到四层,所有的数据都存在叶子节点的,所有的非叶子节点仅仅起到索引的作用。底部的叶子节点形成了一个有序的双向数据链表

创建索引
create [unique] index 索引名 on 表名(字段名,...); //unique创建唯一索引
查看索引
show index from 表名
删除索引
drop index 索引名 on 表名

主键字段会自动创建主键索引,添加唯一约束时,数据库实际上会添加唯一索引

posted @ 2024-01-06 03:15  launch  阅读(4)  评论(0编辑  收藏  举报