所谓高级处理,从用户的角度来讲,就是那些对数值进行排序,计算销售总额等我们熟悉的处理;从SQL的角度来讲,就是近几年才添加的新功能,这些新功能使得SQL的工作范围不断得到扩展。 OLAP是OnLine Analytical Processing的简称,意思是对数据库进行实时分析处理。 窗口函数就是为了实现OLAP而添加的标准SQL功能。 例,有3条记录排在第一位时:1位、1位、1位、2位……. ROW_NUMBER函数 赋予唯一的连续位次。 例,有3条记录排在第一位时:1位、2位、3位、4位……. 为了避免混淆,SQL提供了一个用来判断超级分组记录的NULL的特定函数—GROUPING函数。 SQL的基础语法知识大致就是这些,如果你稍微会一点SQL,看到这些代码应该很好理解的。如果你没有编程基础,可能这些代码对于你来说过于难以理解。写的很粗糙,勉强可以用来温习SQL的语法。
SQL进阶-10-用SQL处理数列 在关系型数据库的数据结构中,默认是不考虑数据的顺序。处理有序集合在SQL中不能直接实现,但是可以通过集合和谓词来间接实现处理有序数据的需求。 需求1-生成连续编号 需求 不使用数据库中自带的函数,实现任意长的连续编号序列,比如生成0-99的100个连续编号 SQL实现 先解决一个问题:00-99这100个数字中,0,1,2……9这10个数字分别出现了多少次 满足要求的序列: 根据上面的图形,我们发现满足要求的序列:以n为起点,n+(3-1)=n+2为终点的作为全部是未预定状态 SQL实现-不考虑换排 -- 不考虑换排 select s1.seat as 上面代码的主要工作: 找到起点和终点 起点和终点之间的座位都是未预定的状态 全称量化问题:将所有满足条件P转成不存在不满条件P的行 SQL实现-考虑换排 给表中的数据加上了行编号row_id ? 要保证从座位A到座位B全部是未预定的状态,必须满足3个条件: 起点和终点之间的所有座位都是未预定状态 起点之前的座位不是未预定(不能往前延伸) 终点之后的座位不是未预定(不能往后扩展) SQL实现 生成所有序列的视图
概述 本章对SQL的处理流程进行介绍。 SQL的处理流程概要 SQL的处理主要包括解析(parse)、执行(execute)、提取(fetch)几个步骤。 SQL的处理的详细流程可以参考以下官方文档中的流程图: ? Database SQL Tuning Guide >About SQL Processing SQL处理主要内容: 1.解析(parse): 当应用程序执行SQL语句时,应用程序会发出解析调用(parse 语义检查 : 检查SQL的访问对象、访问权限等语义内容。 共享池检查:检查共享池(Shared Pool)中是否有相同SQL的解析结果(执行计划)。 3.提取(fetch): 当SQL文为查询(Select)操作时,提取(fetch)步骤用于返回查询结果。 如果返回查询结果为多行时,提取(fetch)操作可能进行多次。
而用户自定义异常以及预定义异常不回终止程序,但会终止该 PL/SQL 代码块,所以一个存储过程中可以有多个 PL/SQL 代码块。 关于异常的语法及定义: 什么是异常: PL/SQL用异常和异常处理器来实现错误处理 Oracle中出现错误的情形通常分为编译时错误(compile-time error)和运行时错误(run-time 异常在PL/SQL执行过程中很可能出现 对异常如果不进行处理,异常可能会中断程序的运行 捕获异常的规则: 在异常部分WHEN 子句没有数量限制 当异常抛出后,控制无条件转到异常处理部分 EXCEPTION deptno) values (v_empno,v_ename,v_job,v_mgr,v_hiredate,v_sal,v_comm,v_deptno); END store_info; 3. 编写PL/SQL块,使用SELECT语句将管理者编号为空的员工的姓名及工作编号显示出来,如果符合条件的员工多于一人,则返回字符串“最高管理者人员过多!”
SCOTT>select ename,sal 2 from emp e, 3 (select deptno,avg(sal) avg_sal from emp group by deptno 2450 MARTIN 1250 SCOTT>select * from (select * from emp order by sal desc) where rownum<=3; from 2 (select row_number() over(partition by deptno order by sal desc) no,ename,sal,deptno 3
完全备份:完整备份一般一段时间进行一次,且在网站访问量最小的时候,这样常借助批处理文件定时备份。主要是写一个批处理文件在里面写上处理程序的绝对路径然后把要处理的东西写在后面,即完全备份数据库。 = 3则可使用id>3 or id < 3 080 数据库性能下降,想找到哪些sql耗时较长,应该如何操作? my.cnf里如何配置? 3.含有NULL的列比较特殊,SQL难优化,如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。 索引 索引的优点:极大地加速了查询,减少扫描和锁定的数据行数。 9.所有的SQL关键词用大写,养成良好的习惯,避免SQL语句重复编译造成系统资源的浪费。 10.联表查询的时候,记得把小结果集放在前面,遵循小结果集驱动大结果集的原则。 11.开启慢查询,定期用explain优化慢查询中的SQL语句。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
1、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选, 如: if @strWhere ! strWhere 2、收缩数据库 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE 3、 OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO 10、SQL
show show charset; show character set; show char set; show character set like '%utf8%'; show collation like "%utf8%"; SHOW TABLE STATUS FROM `xxx_qa` LIKE 'abc'\G show table status like 'conversations'\G SHOW CREATE TABLE `xxxx_qa`.`abc`\G SHOW INDEX FROM
3-3 SQL Server 2005数据库优化 了解数据库引擎优化顾问基本内容 掌握数据库引擎优化顾问的使用 掌握通过命令行的方式进行索引的优化——DTA 一个数据库系统的性能依赖于组成这些系统的数据库中物理设计结构的有效配置 3-3-1 数据库引擎优化顾问概述 数据库引擎优化顾问是一种工具,用于分析在一个或多个数据库中运行的工作负荷的性能效果。工作负荷是对在优化的数据库招待的一组T-SQL语句。 实现这些结构之后,数据库引擎优化顾问使查询处理器能够用最短的时间性执行工作负荷任务。 3-3-2 数据库引擎优化顾问的使用 数据库引擎优化顾问提供了两种使用方式: 1. 图形界面。 3、事务要求处理时必须满足ACID原则,即_______,_______,_______和_______。 2、简述锁,脏读,不可重复读,幻觉读的概念, 3、请简述在哪两种情况下,可以发生死锁?发生死锁的时候应当如何处理?
在生产中,无论是通过SQL语句或者Scala/Java等代码的方式使用Spark SQL处理数据,在Spark SQL写数据时,往往会遇到生成的小文件过多的问题,而管理这些大量的小文件,是一件非常头疼的事情 大量的小文件会影响Hadoop集群管理或者Spark在处理数据时的稳定性: 1.Spark SQL写Hive或者直接写入HDFS,过多的小文件会对NameNode内存管理等产生巨大的压力,会影响整个集群的稳定运行 分析 1)执行上述insert操作时的分区并行度,主要受tmp的分区数(对应一个DataSet)影响, 2)tmp的分区数主要受t1、t2以及union all的影响 3)暂且不考虑t1或t2是物理表还是经过其他处理生成的临时表 最后,Spark中一个task处理一个分区从而也会影响最终生成的文件数。 当然上述只是以Spark SQL中的一个场景阐述了小文件产生过多的原因之一(分区数过多)。 小文件定期合并 可以定时通过异步的方式针对Hive分区表的每一个分区中的小文件进行合并操作 上述只是给出3种常见的解决办法,并且要结合实际用到的技术和场景去具体处理,比如对于HDFS小文件过多,也可以通过生成
Prepared SQL Statement:SQL的执行、预编译处理语法、注意点 一、SQL 语句的执行处理 1、即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下: 优化 SQL 语句,制定执行计划; 3. 执行并返回结果; 如上,一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)。 2、预处理 SQL 但是,绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 注意: 虽然可能是通过预处理 SQL 的方式一定程度的提高了效率,但是对于优化而言,最优的执行计划不是光靠 SQL 语句的模板化来实现的,往往还是需要通过具体值来预估出成本代价。
今天就和大家聊聊在 MySQL 中处理 Null 值时需要注意的点,本文包含以下内容: 查找 Null 值 将 Null 值转为实际值 在排序中对 Null 值的处理 计算非 Null 值的数量 聚合 比如,查询 emp 表中字段 comm 为 Null 的记录,就这么写 SQL: SELECT * FROM emp WHERE comm IS NULL 有时候根据业务需要,我们要找出在 emp 类似的,在处理字符串类型的字段的时候,我们要找出某个字段没有值的记录。假设该字段叫作 xxx,xxx 允许设置 Null 值。 3 处理排序中的 Null 值 如果是使用默认的升序对包含有 Null 值的列做排序,有 Null 值的记录会排在前面,而使用了降序排序,包含了 Null 值的记录才会排在后面。 比如,要求员工的平均提成,正确的 SQL 应该这么写: SELECT AVG(COALESCE(comm, 0)) AS avg_comm FROM emp 聚合的结果: avg_comm
使用的SQL多了不知道大家有没这样的困惑,SQL的语法大的方面是一致的,如SELECT,JOIN,GROUP BY等,但是在一些函数或某些特定功能处理上还是有很大差异的,而这些差异经常给大家带来困惑,尤其是一个新手从一种 SQL转到另一种SQL的时候,总是抓耳挠腮,不知所措。 今天就把大家常用的SQL语言做一个总结,来看看他们在日期时间处理方面的差异。 :select mow() /current_timestamp() from table1; --比较简单,两个函数返回的结果相同,但是注意返回的是到毫秒的日期时间格式,如果需要到天粒度的话可以截取处理 备注:以上列出了大家工作中常用的一些SQL在日期处理上的一些差别,可能存在部分不严谨的地方,欢迎大家指出。另外在一些功能上也不限于以上提供的方式,大家如果有更好更简洁的方式也欢迎提出。
SELECT * from table1 COMMIT TRAN M2 UPDATE table3 ... COMMIT TRAN T1 BEGIN DISTRIBUTED TRANSACTION 指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始 为 OFF 时,只回滚产生错误的Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。 INSERT INTO t2 VALUES (1) INSERT INTO t2 VALUES (2) /* Foreign key error */ INSERT INTO t2 VALUES (3) 对于导致终止批处理并生成内部回滚的错误,将释放在含有该错误语句的批处理内声明的所有游标。
SQL NULL 值 SQL Date SQL isnull() NULL 值是遗漏的未知数据。 默认地,表的列可以存放 NULL 值。 SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。 NULL 值的处理方式与其他值不同。 SQL 的 NULL 值处理 请看下面的 "Persons" 表: Id LastName FirstName Address City 1 Adams John London 2 Bush George Fifth Avenue New York 3 Carter Thomas Beijing 假如 "Persons" 表中的 "Address" 列是可选的。 来源:http://www.w3school.com.cn/sql/sql_null_values.asp
事物处理 事务是SQL Server中的单个逻辑单元,一个事务内的所有SQL语句作为一个整体执行,要么全部执行,要么都不执行。 事务分类 按事务的启动和执行方式,可将事务分为3类: 1.显示事务:显式地定义启动和结束的事务。 2.自动提交事务:自动提交模式是SQL Server的默认事务管理模式。 3.隐性事务:当连接以隐性事务模式进行操作时,SQL Server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只须提交或回滚每个事务。隐性事务模式形成连续的事务链。 3.隐式事务 隐性事务模式设置为打开之后,当SQL Server首次执行某些Transact-SQL语句时,都会自动启动一个事务,而不需要使用 BEGIN TRANSACTION 语句。 3. 锁定提示。
SQL NULL 函数 SQL Nulls SQL 数据类型 SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表 : P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder 1 computer 699 25 15 2 printer 365 36 3 telephone 微软的 ISNULL() 函数用于规定如何处理 NULL 值。 NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。 在这里,我们希望 NULL 值为 0。 SQL Server / MS Access SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products
专栏持续更新中:MySQL详解 一、sql执行流程分析 一条sql从客户端发起,在mysql中经过了一系列的流程,归结为如下图所示: 客户端提交一条sql语句,先在查询缓存中查询,如果缓存没有命中,将会进行查表操作 查表的流程总结过为如下: (1)将sql交给解析器处理,生成一个解析树。 (2)预处理器会处理解析器,重新生成一个解析器,这个过程中将会改写sql。 (3)改写后的解析器交给查询优化器,查询优化器生成sql的执行计划。 (4)执行计划交给执行引擎调用存储引擎的的API接口,查询数据。 预处理阶段(查询改写) 查询优化阶段:主要有逻辑优化,物理优化。 3.1. 逻辑优化:把sql交给查询优化器之后,会根据生成的解析树,对sql做一些改写操作。 3.2. tmp_table_size 将临时表中的数据转换到磁盘中 Converting HEAP to MyISAM:线程正在从内部内存临时表到磁盘MYISA临时表 Creating sort index:正在使用内部临时表处理
所有语句都是基于mysql的语法,能用一条sql语句搞定的就不要去写程序。 时区转化 很多时候为了程序处理方便统一,表中某个字段的时间是utc时间,但是生成报表需要转化成北京时间。 当前时间 有时候需要获取最近3天的创建的数据,那么我们就需要对日期做一个对比,可以借助CURRENT_DATE()来完成。 下面这个sql可以用来获取当天的数据,需要用DATE()函数来获取时间字段的日期值。 不需要查出来后用程序处理,sql语句也能通通搞定。 有一个很常用的时序统计相关的需求,按照月统计新增用户数量并按照日期从小到大排序。