Left (right) join执行原理: 首先执行inner join,把表中都有的数据过滤出来,两个表中没有匹配到的数据看保留字 如果是left,则把左表中没有匹配到的数据放入结果集中,否则相反(没有匹配上的字段的值以null值进行填充)
select * from t_student t0, t_class t1 where t0.ClassId = t1.ClassId;(等同于inner join)
等值连接丢数据
数据库进阶
数据库设计(Database Design)
Designer: 设计者
数据库设计,根据用户需求 在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程
良好的设计可以(节省数据的存储空间,能保证数据的完整性,方便进行数据库应用系统的开发)
糟糕的数据库设计(数据冗余、存储空间浪费, 内存空间的浪费, 数据更新和插入的异常)
设计基本步骤:
用户需求已经明确
(建模 模型转换 规范化(三大范式))(实体 Entity)
收集信息
标识对象
标识每个实体的属性
标识对象之间的关系(Relationship)
绘制E-R图(实体关系图)
将E-R图转化成表(将各实体转换为对应的表,各属性转化为各表的对应列, 标识每个表的主键列, 表之间建立主外键)
数据规范化(范式是具有最小冗余的表结构)
范式(
第一范式: 确保每列的原子性(最小的原子单元)(行与列的交叉点不能存在一组值)
第二范式: 满足第一范式并除主键列都依赖于主键(每个表只描述一件事)(复合主键: 不能存在部分依赖关系(与每个主键都有依赖关系))
第三范式:满足第二范式并处主键以外的其他列都不传递依赖于主键列
)(计算列属于冗余列 但是查询性能会提升的话允许保留(性能比规范化更重要))
(沟通 语言表达(少说 多看 多听) 逻辑 条理(停5秒 分点))
(工程实例)
第二章
批处理: 效率高(严格区分大小写)(末尾加go(批处理的标志))(业务相关的语句放在同一个批处理中)
变量:变量是可以在程序运行期间变化的程序元素; 变量在任何程序中充当存储信息的存储器,保存在内存中; 程序运行时,为了完成算法,某些变量会发生变化; 变量都有自己所属的数据类型
局部变量:用户定义的(只能在同一批处理中使用(局部变量不能跨越批处理))
全局变量:只读的(系统维护和控制赋值)
set 一次只能为一个变量赋值
select 一次可以为多个变量赋值, 可以通过查询语句 批量赋值
convert 数据类型转换函数(目标类型, 要转换的变量)
局部变量需要初始化后使用, 否则值为null, 会导致后续结果为空
通过查询语句为变量赋值,必须保证查询结果返回一条记录,否则获取的是最后一条记录
select @a = a, @b = b from Table_A
@@ERROR 最后一个T-SQL语句的错误号
@@IDENTITY 最后一次插入的标识值
@@ROWCOUNT 受上一个SQL语句影响的行数
@@FETCH_STATUS 返回针对连接当前打开的任何游标发出的上一条游标 FETCH 语句的状态
标量:一对一
子查询
法一:采用T-SQL变量实现
declare @avgMoney money;
select avg(TotalMoney) from dbo.Tme_OrderInfo;
select * from dob.Tme_OrderInfo where totalMoney > @avgMoney;
法二:采用子查询
select * from dbo.Tme_OrderInfo where totalMoney > (select avg(TotalMoney) from dbo.Tme_OrderInfo)(子查询与判断符号一起用时必须保证查询结果只能有一个)
in 表示在列表中存在
exists 存在检测(检测是否存在)(返回值为true 或 false)
相关子查询:依赖于外部查询,不能独立调用;相关子查询效率低
在逻辑上,独立要先执行一次 只执行一次; 相关要在外部行执行的时候单独计算一次
什么时候用相关子查询:和自己比较的时候
exists 子查询
if exists (select * from sys.sysobjects where name = ‘test’) drop table test;
go
派生表
把子查询当表来用
第五章
索引:常规的未作索引的表中的行不会以特定的顺序存储,无序状态的表被称为堆(不用查询每行数据,有效的提高查询性能)
索引包含从表或视图中一个或多个列生成的键,映射到指定数据的存储位置的指针
键存储在一个 B树 (balance tree)中 快速有效的查找键值关联的行
只会对索引行加锁, 提高并发检索速度