码迷,mamicode.com
首页 > 数据库 > 详细

MySQl数据库简单命令之dcl

时间:2018-12-18 20:34:34      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:copy   tables   技术分享   src   总结   端口号   aci   join   员工信息   

SQL (结构化 Structured 查询 Query 语言 Language)
分类
DDL(数据定义语言) 表的定义、用户的定义... create drop alter
DML(数据操控语言) 对数据的增加、修改、删除、查询 insert update delete select
DCL(数据控制语言) grant(授权) revoke(回收)

DML

    insert into 表 (列...) values (值...);
    insert into 表 (列...) values (值...), (值...)...
    insert into 表1 (列...) select 列... from 表2
    update 表 set 列=新值, ...
    update 表 set 列=新值, ... where 条件
    delete from 表;
    delete from 表 where 条件
    select 列... from 表 
                inner|left join 表 on 连接条件
                where 条件
                group by 列... having 条件
                order by 列 asc|desc
                limit n, m

子查询 (sub query)

求最高工资的员工信息
select max(sal),e.* from emp e; -- 会报错

select max(sal) from emp e;
-- 最大值 一行记录 , 但名字有两个

情况1:把子查询当做一个值

分解问题:

select max(sal) from emp; --> 第一步:5000 把它看做一个值
select * from emp where sal = 5000; --> 第二步:写主查询语句 
select * from emp where sal = (select max(sal) from emp); --> 第三步:替换

技术分享图片

情况2:把子查询当做一张表

每个部门的最高工资的员工

第一步:按部门分组
(select  max(sal) msal, deptno  from emp group by deptno) a
// 生成了临时表 a, 其中有两列: msal, deptno

第二步: 把上面的查询结果看做一张临时表,它可以与其他表之间做连接操作
select * from emp b inner join a on b.deptno=a.deptno and b.sal = a.msal;

第三步: 把子查询代入
select * from emp b inner join 
    (select  max(sal) msal, deptno  from emp group by deptno) a 
    on b.deptno=a.deptno and b.sal = a.msal;

技术分享图片

case when

可以配合select工作, 把一列的取值根据不同的条件进行翻译
类似于 java 中的if else if
语法:

case
   when 条件1 then 结果1
   when 条件2 then 结果2
   ...
   else 结果n
end

2000以下显示低工资,2000~3000显示中等,3000以上显示高工资

select empno, ename, sal, 
case 
    when sal <= 2000 then ‘低工资‘
    when sal >2000 and sal <=3000  then ‘中等工资‘
    else ‘高工资‘
end 工资级别  from emp;

技术分享图片

dcl (了解)

grant 授权
revoke 回收权限

创建用户

create user 用户名 identified by ‘密码‘;

技术分享图片
授权语法:

grant 权限 to 用户名;

例如:把查询test库中所有表的查询权限授权给user1
grant select on test.* to tuser;

技术分享图片

如果不给权限,只能进行登陆,不能进行其他操作,例如查询,插入.
例:
技术分享图片
回收权限

revoke 权限 from 用户名;

例如:回收之前分配的权限:
revoke select on test.* from tuser;

事务和锁

事务

transaction 事务 : 把多条sql语句视为一个整体执行,这些sql 要么都成功, 其中有一个失败了,之前的操作也需要撤销

两个人同时操作一张表的同一条数据

中国银行账户表 account
id        name       balance(余额)
1         张三       2000

建设银行账户
id        name       balance(余额)
2         张三       3000

```java逻辑
张三转账
try {
begin;
update account set balance=balance+1000 where id = 2;

 // 出现异常
update account set balance=balance-1000 where id = 1; 
commit;

} catch( Exception e ) {
rollback;
}

mysql的事务控制
默认情况下,是一条语句一个事务
要多条语句一个事务,需要通过 `begin` `commit` `rollback` 来控制事务

begin;  // 表示事务的起点 等价方式: `start transaction`
sql1
sql2
...
commit(提交,表示结果都将生效) 和 rollback(回滚,用来撤销事务内的更改) 表示事务的终点

TCL (事务控制语言)

## 锁(了解)
```sql
客户1                                                               客户2
begin;                                                              begin;
update emp set sal = 4000 where empno = 7369;
                                                            update emp set ename = ‘abc‘ where empno = 7369; // 被阻塞
                                                            直到超时为止

技术分享图片
InnoDB 行级锁, 只要两个客户端更新的是不同的行,互不干扰
MyISAM 表锁,是锁住整个表

增删改(insert update delete) 都会在行上加排他锁(X锁)
查询可以加共享锁 (S锁)表示可以同时查询,但其他人不能增删改(insert update delete)

select * from 表 lock in share mode;  添加共享锁-别人可以再加共享锁,但不能再加排他锁

查询时加排他锁

select * from 表 for update;   添加排他锁, -别人不能再加共享锁和排他锁

mysql对查询有特别的优化:不用锁也能实现并发访问: 多版本并发访问(MVCC)

查询

1   张三    8000 旧版本
                修改
                1   张三    7000
select * from 表 就是利用的多版本并发查询, 好处:并发性高!

java.util.concurrent.CopyOnWriteArrayList 线程安全的ArrayList: 修改时会产生一个集合的副本,修改都是在副本上进行,查询查的是旧集合的内容,所以查询和修改可以并行执行,等修改结束会用副本替换旧的内容
线程安全的List: Vector 全部方法加锁

事务隔离性(了解)

有不同的隔离级别,
隔离级别越低,并发性越好,但数据的一致性差
隔离级别越高,并发性差,但数据的一致性高
由低到高四种:
读未提交 < 读提交 < 可重复读(mysql默认) < 序列化读

错误的级别由高到低
脏读 , 不可重复读, 幻读

脏读(读未提交)

7369的工资1000
事务1                                              事务2
begin                                              begin
修改7369的工资为8000
                                                   select  sal from emp where empno=7369;// 8000
rollback

将隔离级别提高到读提交,可以避免脏读

不可重复读

一边查询,另一边做update操作
一个事务内多次查询结果不一致

7369的工资1000
事务1                                              事务2
begin                                              begin
                                                   select sal from emp where empno=7369; // 1000
修改7369的工资为8000
commit;
                                                   select  sal from emp where empno=7369; // 8000

要避免脏读、不可重复读:将隔离级别提高到可重复读隔离级别

幻读

一边查询,另一边做insert操作

事务1                                              事务2
begin                                              begin
查询到10,20,30,40条记录
                                                   insert 50号部门
                                                   commit
insert 50号部门 报错,主键冲突

要避免脏读、不可重复读、幻读:将隔离级别提高到序列化读
所谓的序列化读就是把多版本并发退化到锁的并发控制:select语句上会被偷偷加上共享锁

事务四特性 (ACID)

原子性 A 多个sql要作为一个整体运行,不可分割
一致性 C 一个事务内结果应当一致
隔离性 I
持久性 D 事务一旦提交,事务内的修改就应当永久生效

其他sql总结 (了解)

查看有哪些库: show databases;
查看库的创建语句: show create database 库名;
使用库: use 库名;
查看有哪些表: show tables;
查看表结构: desc 表名;
查看建表语句: show create table 表名;
\G 可以取代; 效果是把表行转列
查看系统变量的值: select @@系统变量名;

select @@transaction_isolation; // 查看事务隔离级别
select @@port; // 查看服务器端口号
select @@character_set_server; // 查看默认字符集
select @@secure_file_priv;
...

show variables like ‘character%‘;

MySQl数据库简单命令之dcl

标签:copy   tables   技术分享   src   总结   端口号   aci   join   员工信息   

原文地址:http://blog.51cto.com/13670525/2332284

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!