-
Notifications
You must be signed in to change notification settings - Fork 0
SQL
wzs edited this page Aug 27, 2018
·
1 revision
-
DATEADD(HOUR,-4,GETDATE())根据GETDATE()时间调整(可调整 前/后 小时/分钟/等) - LEFT JOIN:从左表返回所有行, 即使右表中没有匹配行
- A LEFT JOIN B, 则会:A中列, B中符合Join要求的列
- RANK():排名函数
- RANK() OVER ( PARTITION BY CON1 ORDER BY CON2)AS ..
- 执行顺序为:先PARTITION分区, 而后分区内ORDER排序, 排序后才RANK排名
-
@自定义变量@@系统变量Cursor游标- 游标:
Cursor c is select .. from .. - 游标和临时表对比:内存/硬盘, 数据量两方面考虑
- 游标:
- 注意数据库字段, 表名的长度限制. Oracle是30个字符
- Union/union all:示例
- COUNT(*), COUNT(PK), COUNT(1)都是用来统计列数的
- *为所有行数, 包括null
- distinct: 用于返回唯一不同的值. 即 相同值(单列/多列 相同)只保留1个
- SQL SERVER 中单页长度为8kb, 且不允许一行数据存储在不同页上
-
{(varchar(max)),nvarchar(max)),text,ntext,varbinary(max),image}类型除外 - 可用字节数: 8060 = 8kb - 132(系统信息)
-
- 外键必须是另一个表的主键
- 架构(模式):数据库下的一个逻辑命名空间, 是一个数据库对象
- 作用:便于管理数据库对象, 即对数据库对象进行逻辑划分, 将解决同类问题的对象放置到一个架构中
- 关系规范化:规范化的过程就是让每个关系模式概念单一化的过程
- x-->y:y依赖于x, x是决定因子
- 第一范式:不包含非原子项的属性
- 第二范式:所有非主属性都完全依赖于主键
- 第三范式:所有非主属性都不传递依赖于主键
- BCNF:当且仅当每个函数以来的决定因子都是候选键时
- 多值依赖:一组函数值的依赖
- 链接依赖:R拆分成R1和R2后还能再连接得到R, 即无损联结
- SQL Server中
@@ROWCOUNT返回受上一语句影响的行数, 返回值类型为int, 如果行数大于20亿, 需要使用ROWCOUNT_BIG. - EXEC 执行存储过程
- 分区表:将数据按某种标准划分成不同区域存储在不同文件组
- 外键使用的键必须是主键或者unique约束的列
- 触发器中可以使用inserted/deleted两个特殊的临时表. 并且只能用在触发器代码中, 与建立触发器的表的结构完全相同
- inserted:insert中新插入的数据/update中更新后的数据
- deleted:delete操作删除的数据/update更新前的数据
- 所有create/alter数据库/数据库对象, drop语句都不允许在触发器中使用.
- 收缩数据库大小:创建完毕之后新增的才可以收缩. 初始大小固定不可收缩
-
ODBC, OLEDB, ADO, ADO.Net的演化简史
- 从刚开始直接操作DB的时代, 到ODBC标准搞定关系数据库, 到OLE DB搞定关系型+非关系型数据库, 到ADO, 一步步封装

-
SET NOCOUNT ON:不返回 ..行受到影响
- Union All:对两个结果集进行并集操作, 包括重复行, 不进行排序
- 示例:
select top 5 OrderID,[EmployeeID] from dbo.Orders where EmployeeID=1 union all select top 5 OrderID,[ProductID] from [Order Details] where ProductID=1- 结果
- Union:对两个结果集进行并集操作, 不包括重复行, 同时进行默认规则的排序
- Union: 示例
select top 5 OrderID,[EmployeeID] from dbo.Orders where EmployeeID=1 union select top 5 OrderID,[ProductID] from [Order Details] where ProductID=1- 结果
参考: SQL索引一步到位
- 聚集索引/非聚集索引:是否是物理排序
- 聚集索引(物理排序):创建聚集索引后, 表内行顺序按照聚集索引列顺序排序, 所以聚集索引只能有一个
- 非聚集索引行定位器是
- 指向行的指针(文件标识符+页码+行序号生成)
- 该行的聚集索引关键字的值.
- SQL SERVER 采用 B- 树结构, 非聚集索引是一个新实体(类似术语表)
- 原则上where字句上出现的列都需要创建索引:不然还是会到表中查询
- 避免在WHERE条件中, 在索引列上进行计算或使用函数:这将导致索引不被使用
- 保证索引排序和Order By 字句顺序保持一致
- 数据重复列高的字段不要创建索引:没有意义
- text, varchar(max)不创建索引
- 外键和用于做表连接的字段需要做单独的索引:如果外键列缺少索引, 从关联子表的查询就只能对子表选择全表扫描
- 经常更改的列不创建索引:维护成本太高
- 示例: 事件 搜索:
事件 定时策略 - 配置文件开启事件支持:
[mysqld] event_scheduler=ON //这一行加入mysqld标签下
- 周期执行: every, 单位 second,minute,hour,day,week,quarter,month,year
-
on schedule every 1 second每秒执行1次 -
on schedule every 2 minute每两分钟执行1次 -
on schedule every 1 day starts timestamp(current_date,'00:00:00')每天零点执行, every 可以和 starts/ends 结合使用
-
- 在具体的时间执行: at
-
on schedule at current_timestamp()+interval 5 day5天后执行 -
on schedule at '2016-10-01 21:50:00'在指定时间执行
-
- 在某个时间段执行 starts/ends
-
on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month5天后开始每天都执行执行到下个月底 -
on schedule every 1 day ends current_timestamp()+interval 5 day从现在起每天执行, 执行5天
-
- SQL 参数填充
Connection conn = mapdutil.basicDataSource.getConnection(); String sql = "select * from testdb where lon BETWEEN ? AND ? AND receive_time BETWEEN ? AND ?" ps = conn.prepareStatement(sql); // 从1开始 ps.setDouble(1, Double.parseDouble(minlon)); ps.setDouble(2, Double.parseDouble(maxlon)); ps.setTimestamp(3, Timestamp.valueOf(startTime)); ps.setTimestamp(4, Timestamp.valueOf(endTime)); ps.executeQuery();
- 脚本头规范:参考别人写的就行了.
作者 / 创建时间 / 修改人 / 修改时间 / 对应系统模块 / 描述 参数注释 TRANSACTION事务注释 - 存储过程规范:
过程名称, 作者, 功能说明, 创建日期, 维护记录, 使用案例
- 脚本命名
编号_数据库名_脚本功能- 脚本数据库存在分库情况时, DBA会将其全库执行, 不需要开发处理
- 存储过程命名:
架构名.模块名_功能语义 - 依赖条件命名时使用
xxxBy+条件 - 最好有return信息. 没有的话可添加
return 1 - 为什么必须有主键
- 主键不是必须的, 但是主键是必要的. 首先, 确保表的完整性(如数据的唯一性)当插入两行一模一样的数据时, 没有主键则不可区分. 其次, 提升效率(没有主键时, 是按照输入顺序进行插入的)
- 有些数据库里主键时必须要有的.
- 如果没有业务列组合当主键, 可以生成自增id当主键
- 业务列作为主键 / GUID主键 / 时间+机器号+自增ID主键
- 业务逻辑是否封装到存储过程里
- 在开发过程中为什么需要写存储过程
- 是:执行速度快, 安全性(屏蔽开发人员权限), 银行/电信等采用此种方案
- 否:互联网企业一般采用此方案
- 业务逻辑交给程序处理, 减少数据库资源消耗
- 不利于分层规范和维护
- 迁移方便(屏蔽具体sql的差异, 如sqlserver和mysql)
-
数据类型
- 不同数据库类型有些许不同, 但是大体类似

