一、内链接:实现A∩Bmysql
select 字段列表 from A表 inner join B表 on 关联条件 where 等其余子句;
二、左外链接sql
#实现查询结果是A select 字段列表 from A表 left join B表 on 关联条件 where 等其余子句; #实现A - A∩B select 字段列表 from A表 left join B表 on 关联条件 where 从表关联字段 is null and 等其余子句;
三、右外链接数据库
#实现查询结果是B select 字段列表 from A表 right join B表 on 关联条件 where 等其余子句; #实现B - A∩B select 字段列表 from A表 right join B表 on 关联条件 where 从表关联字段 is null and 等其余子句;
四、用union代替全外链接并发
#实现查询结果是A∪B #用左外的A,union 右外的B select 字段列表 from A表 left join B表 on 关联条件 where 等其余子句 union select 字段列表 from A表 right join B表 on 关联条件 where 等其余子句; #实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B) #使用左外的 (A - A∩B) union 右外的(B - A∩B) select 字段列表 from A表 left join B表 on 关联条件 where 从表关联字段 is null and 等其余子句 union select 字段列表 from A表 right join B表 on 关联条件
UNION规则函数
UNION中的每一个查询必须包含相同的列、表达式或汇集函数(不过,各个列不须要以相同的次序列出)。spa
列数据类型必须兼容:类型没必要彻底相同,但必须是DBMS能够隐含转换的类型(例如,不一样的数值类型或不一样的日期类型)。code
实际上,UNION在须要组合多个表的数据时也颇有用,即便是有不匹配列名的表,在这种状况下,能够将UNION与别名组合,检索一个结果集。blog
五、自链接:同一张表,经过取别名的方式来虚拟成两张表排序
select 字段列表 from 表名 别名1 inner/left/right join 表名 别名2 on 别名1.关联字段 = 别名2的关联字段 where 其余条件
(1)from:从哪些表中筛选事务
(2)where:从表中筛选的条件
(3)group by:分组依据
(4)having:在统计结果中再次筛选
(5)order by:排序
降序:desc 升序:要么默认,要么加asc
虽然ORDER BY子句彷佛只是最后一条SELECT语句的组成部分,但实际上DBMS将用它来排序全部SELECT语句返回的全部结果。
(6)limit:分页
limit m,n
m = (第几页 - 1)*每页的数量
n = 每页的数量
可使用GROUP BY子句将表中的数据分红若干组
在SELECT列表中,全部未包含在分组函数中的列都应该包含在 GROUP BY子句中
包含在 GROUP BY 子句中的列没必要包含在SELECT 列表中
(1)where是从表中筛选的条件,而having是统计结果中再次筛选
(2)where后面不能加“分组/聚合函数”,而having后面能够跟分组函数
嵌套在另外一个查询中的查询,做为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
根据位置不一样,分为:
(1)where型
①子查询是单值结果,那么能够对其使用(=,>等比较运算符)
②子查询是多值结果,那么可对其使用(【not】in(子查询结果),或 >all(子查询结果),或>=all(子查询结果),<all(子查询结果),<=all(子查询结果),或 >any(子查询结果),或>=any(子查询结果),<any(子查询结果),<=any(子查询结果))
(2)from型
必须给子查询取别名,即临时表名,表的别名不要加“”和空格
表别名不只能用于WHERE子句,还能够用于SELECT的列表、ORDER BY子句以及其余语句部分。
表别名只在查询执行中使用。与列别名不同,表别名不返回到客户端。
(3)exists型
保证全部事务都做为一个工做单元来执行,即便出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操做时,要么全部的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所做的全部修改,整个事务回滚(rollback)到最初状态
事务的ACID属性:
(1)原子性(Atomicity) 原子性是指事务是一个不可分割的工做单位,事务中的操做要么都发生,要么都不发生。
(2)一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
(3)隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其余事务干扰,即一个事务内部的操做及使用的数据对并发的其余事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其余操做和数据库故障不该该对其有任何影响
mysql默认是自动提交,执行一句就提交一句。
我想要手动提交事务:
接下来全部语句都必须手动提交,
commit; 或 rollback; 或发生异常;
直到我set autocommit=true;或从新链接,
不然它以后的语句所有都须要手动提交
(2)start transaction;
在自动提交模式下,单独针对某一组sql开启事务
一组sql语句
commit; 或 rollback;
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。 以后, 若 T2 回滚, T1读取的内容就是临时且无效的。
不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 而后 T2 更新了该字段。 以后, T1再次读取同一个字段, 值就不一样了。
幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 而后 T2 在该表中插入了一些新的行。 以后, 若是 T1 再次读取同一个表, 就会多出几行。
数据库事务的隔离性:数据库系统必须具备隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各类并发问题。
一个事务与其余事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别, 不一样隔离级别对应不一样的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。
Mysql 支持 4 种事务隔离级别。 Mysql 默认的事务隔离级别为: REPEATABLE READ。在mysql中REPEATABLE READ的隔离级别也能够避免幻读了。
每启动一个 mysql 程序, 就会得到一个单独的数据库链接。每一个数据库链接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.
查看当前的隔离级别: SELECT @@tx_isolation;
查看全局的隔离级别: SELECT @@global.tx_isolation;
设置当前 mySQL 链接的隔离级别:
set tx_isolation ='repeatable-read';
设置数据库系统的全局的隔离级别:
set global tx_isolation ='read-committed';
注意:这里的隔离级别中间是减号,不是下划线。
(1)IP+用户名做为身份验证
(2)密码
(1)全局(2)数据库(3)表(4)字段
依次校验权限,若是前面经过了,后面就不校验了:
全局 > 数据库 > 表 > 字段
注意:root@localhost,这个用户始终保留全部的全局权限。
查看帐户权限:
show grants for user@host;