当前位置: 移动技术网 > IT编程>数据库>MSSQL > 数据库高级

数据库高级

2020年07月14日  | 移动技术网IT编程  | 我要评论

子查询(嵌套sql)
SELECT语句是SQL的查询。迄今为⽌我们所看到的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。
SQL还允许创建⼦查询(subquery),即嵌套在其他查询中的查询。
子查询的使用:
1.利⽤子查询进⾏过滤
2.作为计算字段使⽤用子查询
注意:子查询中的WHERE⼦句与前⾯使⽤的WHERE⼦句稍有不同,因为它使⽤了完全限定列名
这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使⽤用这种语法(表名和列名由一个句点分隔)。
关系表
SQL最强⼤大的功能之⼀就是能在数据检索查询的执⾏中联结(join)表。
在能够有效地使⽤用联结前,必须了解关系表以及关系数据库设计的一些基础知识。
关系表的设计就是要保证把信息分解成多个表,一类数据一个表。
各表通过某些常⽤用的值(即关系设计中的关系(relational))互相关联。
表联结
如果数据存储在多个表中,怎样⽤用单条SELECT语句句检索出数据?
答案是使⽤用联结。简单地说,联结是一种机制,用来在一条SELECT语句句中关联表,因此称之为联结。
使用特殊的语法,可以联结多个表返回一组输出,联结在运⾏时关联表中正确的⾏。
在联结两个表时,你实际上做的是将第一个表中的每⼀行与第二个表中的每⼀行配对。
WHERE⼦句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的⾏。
比如select vend_name,prod_name,prod_price from vendors,products
如果没有where条件,第⼀个表中的每个⾏将与第⼆个表中的每个⾏配对,⽽不管它们逻辑上是否可以配在⼀起,由没有联结条件的表关系返回的结果为笛卡⼉儿积。检索出的行的数⽬将是第⼀个表中的⾏数乘以第⼆个表中的⾏数。
比如:select vend_name,prod_name,prod_price from vendors inner join products on vendors.vend_id = products.vend_id;
两个表之间的关系是FROM⼦句的组成部分,以INNER JOIN指定。
在使⽤这种语法时,联结条件用特定的ON⼦句⽽不是WHERE⼦句给出。
SQL对一条SELECT语句中可以联结的表的数⽬没有限制。
MySQL在运⾏时关联指定的每个表以处理联结。 这种处理可能是非常耗费资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降越厉害。
使⽤用表别名 AS
别名除了用于列名和计算字段外,SQL还允许给表名起别名。
这样做有两个主要理理由:
缩短SQL语句句;允许在单条SELECT语句中多次使⽤相同的表
应该注意,表别名只在查询执行中使⽤,与列别名不一样,表别名不返回到客户机。
⾃联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。
外部链接
许多联结将⼀个表中的⾏与另⼀个表中的⾏相关联。但有时候会需要包含没有关联行的那些行。
注意:
保证使用正确的联结条件,否则将返回不正确的数据。
应该总是提供联结条件,否则会得出笛卡⼉儿积。
在⼀个联结中可以包含多个表,甚⾄对于每个联结可以采⽤不同的联结类型。虽然这样做是合法的,⼀一般也很有⽤,但应该在一起测试它们前,分别测试每个联结。这将使故障排除更更为简单。
组合查询 UNION
MySQL也允许执⾏多个查询(多条SELECT语句句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
UNION规则:
UNION必须由两条或两条以上的SELECT语句组成,语句之间⽤用关键字UNION分隔(因此,如果组合4条SELECT语句句,将要使用3个UNION关键字)。
UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列列出)
列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
UNION从查询结果集中自动去除了重复的行(换句话说,它的行为与单条SELECT语句中使⽤多个WHERE⼦句条件⼀样)。
这是UNION的默认⾏为,但是如果需要,可以改变它。如果想返回所有匹配⾏,可使用UNIONALL⽽不是UNION。

MySQL 事务 概述

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的⼀个程序执行逻辑单元。
在这里插入图片描述
事务的语法

  1. start transaction;/ begin;
  2. commit; 使得当前的修改确认
  3. rollback; 使得当前的修改被放弃

事务的ACID特性

  1. 原⼦性(Atomicity)
    事务的原⼦性是指事务必须是一个原⼦的操作序列列单元。事务中包含的各项操作在⼀次执⾏过程中,只允许出现两种状态之⼀。
    全部执⾏成功
    全部执⾏失败
    事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发⽣一样。也就是说事务是⼀个不可分割的整体,就像化学中学过的原⼦,是物质构成的基本单位。
    2.一致性(Consistency)
    事务的一致性是指事务的执⾏不能破坏数据库数据的完整性和一致性,⼀个事务在执⾏之前和执⾏之后,数据库都必须处于一致性状态。
    比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。
  2. 隔离性(Isolation)
    事务的隔离性是指在并发环境中,并发的事务是互相隔离的。也就是说,不同的事务并发操作相同的数据时,每个事务都有各⾃完整的数据空间。
    一个事务内部的操作及使⽤的数据对其它并发事务是隔离的,并发执⾏的各个事务是不能互相干扰的。
  3. 持久性(Duration)
    事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器器系统崩溃或服务器器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
    事务的并发问题
    脏读:读取到了没有提交的数据, 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
    不可重复读:同一条命令返回不同的结果集(更新).事务 A 多次读取同⼀数据,事务 B 在事务A多次读取的过程中,对数据作了了更新并提交,导致事务A多次读取同⼀数据时,结果 不一致。
    幻读:重复查询的过程中,数据就发⽣了量的变化(insert, delete)。
    事务隔离级别
  4. 读未提交(READ_UNCOMMITTED)
    读未提交,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进⾏了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另⼀个事务也能够访问该数据。
  5. 读已提交(READ_COMMITTED)
    读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上⾯的脏读的情况了。但是在同一个事务中执⾏同一个读取,结果不一致。
  6. 可重复读(REPEATABLE_READ)
    可重复读就是保证在事务处理过程中,多次读取同⼀个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
    幻读:
    幻读就是指同样的事务操作,在前后两个时间段内执⾏对同一个数据项的读取,可能出现不一致的结果。
  7. 顺序读(SERIALIZABLE)
    顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执⾏,即事务只能⼀个接一个地处理,不能并发

本文地址:https://blog.csdn.net/qq_45019857/article/details/107301936

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网