MySQL相关语句

子查询

1.将子查询当作一个值

select max(列名) from 表名;
select * from 表名 where 列名=条件;
select * from 表名 where 列名 =select max(列名) from 表名);

2.将子查询当作一张表

类似1中所示,将头次所查询的表用表连接的方法与另外一张表按某些条件连接

case when

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

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

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

select 所查询列
case 
    when 薪资列<= 2000 then '低工资'
    when sal >2000 and sal <=3000  then '中等工资'
    else '高工资'
end 工资级别  from;

DCL(数据操控语言)

grant 授权
revoke 回收权限

创建用户

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

授权语法:

grant 权限 to 用户名;

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

回收权限

revoke 权限 from 用户名;

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

事务和锁

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

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

begin; // 表示事务的起点 等价方式: start transaction
sql1
sql2

commit(提交,表示结果都将生效) 和 rollback(回滚,用来撤销事务内的更改) 表示事务的终点

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

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

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

查询时加排他锁

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

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

事务隔离性

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

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

脏读(读未提交)

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

不可重复读

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

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

幻读

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

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

事务四特性 (ACID)

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

你可能感兴趣的:(MySQL相关语句)