文章目录
相关子查询
-- 相关子查询:子查询不可以独立运行,并且先运行外查询再运行子查询
-- 优点:简单,功能强大
-- 缺点:理解较难
-- 查询本部门最高工资的员工
SELECT deptno,ename,max(sal) from emp GROUP BY deptno
-- 括号里面的语句不能单独运行,必须先运行外层查询,才可以进行里面的查询
SELECT * from emp e1 where sal in(SELECT max(sal) from emp e2 where e1.deptno=e2.deptno)
索引
- 提高查询速度
- BTREE(B+TREE) 和 HASH两种算法
- 索引会提高查询的速度,但是会降低添加,更新,删除的速度(不仅操作数据库表,也要操作索引)
-- 查看索引 默认 主键和外键是索引
show INDEX from emp;
SELECT * from emp WHERE empno=1;
SELECT * from emp WHERE ename='湛山';
-- 创建索引
CREATE index index_emp_ename on emp(ename)
-- 查找速率很增快,要有数据量的支持
SELECT * from emp WHERE ename='湛山';
-- 删除索引
drop index index_emp_ename on emp;
事务
- 事务是用来维护数据库完整性的
- 原子性:使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。
- 一致性:一致性是指事务执行的结果必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。
- 隔离性:隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。
- 持久性:持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。
-- 事物:是用来维护数据库的完整性的
-- 原子性 一致性 隔离性 持久性
-- 创建account账户表
create table account(
id int primary key auto_increment,
username varchar(30) not null,
balance double
);
-- 为account账户表同时插入两条数据
insert into account (username, balance) values('张三', 2000),('李四', 2000);
-- 查看account账户表中的数据
select * from account;
-- 开启转账事务 设置事务不会自动提交
start transaction;
update account set balance=balance-200 where username='张三';
update account set balance=balance+200 where username='李四';
select * from account;
-- 当我们关闭数据库重新打开后,张三和李四的账户余额并没发生任何变化。
-- 这是因为当我们使用“START TRANSACTION”开启一个事务后,该事务的提交方式不再是自动的,
-- 而是需要手动提交,而在这里,我们并没有使用事务提交语句COMMIT,
-- 所以对account表中数据的修改并没有永久的保存到数据库中,也就是说我们的转账事务并没有执行成功
-- 提交转账事务
commit;
-- 事务的回滚也可以看做是结束事务的标记,但是回滚的事务并没有执行成功,而是让数据库恢复到了执行事务操作前的初始状态。
-- 需要注意的是事务的回滚必须在事务提交之前,因为事务一旦提交就不能再进行回滚操作。
rollback;
-- 事务并发问题
-- 脏读 不可重复读 幻读
-- 查看默认的事务隔离级别 MySQL默认的是repeatable read
select @@transaction_isolation;
-- 设置事务的隔离级别
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
视图
- 好处:
- 简化用户操作,将复杂得语句存储为一张视图可以随时调用
- 对机密数据提供安全保护:有了视图,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据(如,敏感字段“salary”)出现在不应该看到这些数据的用户视图上。这样视图就自动提供了对机密数据的安全保护功能
-- 视图 方便查询数据的,不是用来方便修改的
SELECT * from emp;
SELECT empno,ename,job,mgr,HIREDATE,COMM,deptno from emp
-- 定义一个视图
CREATE VIEW myview1
as
SELECT empno,ename,job,mgr,HIREDATE,COMM,deptno from emp
-- 查看我们的视图
SELECT * from myview1;
-- 多表视图
CREATE VIEW myview2
as
SELECT dept.deptno,emp.ename,emp.job from emp join dept on emp.deptno=dept.deptno;
SELECT * from myview2;
-- 视图可以添加数据,操作的还是原表格
INSERT into myview1 VALUES(7777,"ACONGSUN","HJH",7839,"1999-05-12",2850,30);
-- 练习
-- 创建视图 存放员工表中每个部门平均薪资
create or REPLACE view myview3
as
SELECT deptno,avg(sal) "平均薪资" from emp GROUP BY deptno;
SELECT * from myview3;
-- 删除视图
drop view myview3;
-- 展示所有表包含虚拟的表
show TABLES
存储过程
- 感觉像是封装一个方法在数据库调用方法得形式
- 优点:
- 提高执行性能。
- 可减轻网络负担。
- 可将数据库的处理黑匣子化。
-- 定义最简单的存储过程 无返回值
create procedure myproc1(in name varchar(20))
begin
if name is null or name = '' then
select * from emp;
else
select * from emp where ename like CONCAT("%",name,"%");
end if;
end
-- 运行存储过程
call myproc1("AR");
call myproc1("");
-- 删除存储过程
drop PROCEDURE myproc1
-- 定义存储过程,有返回值
create procedure myproc2(in name varchar(20),out num int(4))
begin
if name is null or name = '' then
select * from emp;
else
select * from emp where ename like CONCAT("%",name,"%");
end if;
-- 返回数据得条数
select found_rows() into num;
end
-- 调用存储过程
call myproc2("AR",@num);
-- 获取返回值 一定要带上@
select @num
数据得导入导出
- 导出: 转储SQL文件,并保存
- 导入:在需要导入的数据库中运行SQL文件即可。
远程访问数据库
- 将自己数据库得权限从localhost改成%
- 刷新数据库权限 flush privileges;
- 输入需要远程访问得数据库得ip地址以及对应得数据库名称和密码即可