zoukankan      html  css  js  c++  java
  • Mysql基础04-查询

    关联查询

    1、内连接:实现A∩B

    select 字段列表
    from A表 inner join B表
    on 关联条件
    where 等其他子句;

    2、左外连接

    #实现查询结果是A
    select 字段列表
    from A表 left join B表
    on 关联条件
    where 等其他子句;
    
    #实现A - A∩B
    select 字段列表
    from A表 left join B表
    on 关联条件
    where 从表关联字段 is null and 等其他子句;

    3、右外连接

    #实现查询结果是B
    select 字段列表
    from A表 right join B表
    on 关联条件
    where 等其他子句;
    
    #实现B -  A∩B
    select 字段列表
    from A表 right join B表
    on 关联条件
    where 从表关联字段 is null and 等其他子句;

    4、用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中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。

    列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。

    实际上,UNION在需要组合多个表的数据时也很有用,即使是有不匹配列名的表,在这种情况下,可以将UNION与别名组合,检索一个结果集。

    5、自连接:同一张表,通过取别名的方式来虚拟成两张表

    select 字段列表
    from 表名 别名1 inner/left/right join 表名 别名2
    on 别名1.关联字段 = 别名2的关联字段
    where 其他条件

    6大子句顺序

    (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与分组函数

    可以使用GROUP BY子句将表中的数据分成若干组

    在SELECT列表中,所有未包含在分组函数中的列都应该包含在 GROUP BY子句中

    包含在 GROUP BY 子句中的列不必包含在SELECT 列表中

    having与where的区别

    (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默认是自动提交,执行一句就提交一句。

    我想要手动提交事务:

    (1)set autocommit=false;

    接下来所有语句都必须手动提交,

    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 再次读取同一个表, 就会多出几行。

    • 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。

    • 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。

    Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED 。

    Mysql 支持 4 种事务隔离级别。 Mysql 默认的事务隔离级别为: REPEATABLE READ。在mysql中REPEATABLE READ的隔离级别也可以避免幻读了。

    在MySql中设置隔离级别

    • 每启动一个 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)密码

    给每个用户权限,4个权限级别:

    (1)全局(2)数据库(3)表(4)字段

    依次校验权限,如果前面通过了,后面就不校验了:

    全局 > 数据库 > 表 > 字段

    注意:root@localhost,这个用户始终保留所有的全局权限。

    查看账户权限:

    show grants for user@host;

  • 相关阅读:
    php 日期处理 DateTime
    http范围请求
    fiddle扩展
    汉字编码 (GB2312 GBK GB18030)
    Navicat http 通道增加验证
    vim 支持 nginx配置文件 语法高亮
    composer 使用
    剖析nsq消息队列(三) 消息传输的可靠性和持久化[一]
    剖析nsq消息队列(二) 去中心化源码解析
    剖析nsq消息队列(一) 简介及去中心化实现原理
  • 原文地址:https://www.cnblogs.com/Open-ing/p/12037140.html
Copyright © 2011-2022 走看看