你的EXCEL用了10年,怎连个合并计算都不会用?
啊!!!
我一直在EXCEL里用SQL
EXCEL菜单项这么简单,干嘛偏偏用SQL语句?
解决我的多张表单关联和汇总啊!
EXCEL里的合并计算和透视表不不是可以解决多张表的问题么?
呆子,那是猴哥随便应付你的。你会的那些功能只能解决一个文本列的表单问题。实际工作中表单都很复杂,哪有那么理想。
EXCEL中可以使用SQL语句完成类似数据库的一些功能。例如:多张复杂的数据表快速合并,多个工作簿文件快速合并。这些是我们在工作中必然会遇到的问题,但是用EXCEL现有的合并计算、透视表功能都无法解决。
不用担心,EXCEL并非真正的数据库,所以使用的SQL语句也很简单,一学就会,另外,只有解决像上面提到的问题时才需要。
01
四种基本的SQL语句1. 查询
select * from table
2. 更新
update table set field=value
3. 插入
insert [into] table (field) values(value)
4. 删除
delete [from] table
02
语句的执行顺序请看下面的录屏:
03
select 语句的执行顺序(8)select (9) distinct (11) top_specification select_list
(1)from left_table
(3) join_type join right_table
(2)on join _condition
(4)where where_condition
(5)groupby group_by_list
(6)with {cube|rollup}
(7)having(having_condition)
(10)order by order_by_condition
从这个顺序可以看出,所有的查询语句都是从from开始执行的。在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的基础。
第一步:from
首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表vt1 .
第二步:on
接下来便是应用on筛选器,on 中的逻辑表达式将应用到vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表vt2 .
第三步:join
如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3.
第四步:多表
如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3.
第五步:where
应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。
第六步:group by
分组,生成虚拟表 vt4
第七步:having
对vt4应用having筛选器,生成虚拟表 vt5
第八步:select
处理select 列表,生成虚拟表vt6
第九步:distinct
将vt6 中重复的行去掉,生成虚拟表vt7
第十步:order by
将vt7中的行按order by 子句中的列列表排序,生成一个游标vc8
第十一步: top
从vc8的开始处选择指定数量或比例的行,生成虚拟表vt9,并返回给调用者
04
SQL语句扩展1.select
选择性插入语句
Insert into table1 (field1 ) Select field2 from table2
要求table1必须存在。
select field1 into table1 fromtable2
要求table1不存在,在运行时会自动创建表名为table1,字段名为field1的一个表。
2.update
多表更新
Update table1 set table1.field 1=table2.field2 from
table1,table2
where table1.field3= table2 .filed3
提示:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法
Oracle 中:Update table1 set table1.field1=
(select table2.field2 fromtable2 where .field3= table2 .filed3)
3.insert
插入语句的规范问题
在sql server 2000,sqlserver 2005中
标准语句:insert into table(field) values (value)
提示:在access中不正确,原因sql语句不规范,因此在书写sql语句的过程中一定要按正规的语法来写。
4.delete
标准删除
标准语句:delete from tablewhere condition
提示:同insert
其它删除
truncate
语法:truncate table table_name
删除表中所有行,不记录单个行删除操作,不记录日志,,所有速度比Delete快。
drop
语句: Drop tabletable_name
删除表及相关,有fk约束的不能删,先去年fk;系统表不能使用。
order by
功能:排序
技巧:order by newid() 随机排序
05
动态SQL语句1基本原则
预编译问题
在EXECUTE执行之前,数据库不会编译 EXECUTE 语句内的语句,动态SQL语句就是放到存储过程中,它也不会预先编译。
什么时候使用动态SQL语句
字段名,表名,数据库名作为变量时,必须用动态SQl语句
2.exec[ute]
语法
exec (‘select * fromtable_name where name=’’’ @name ’’’’) --括号不能少
传递参数
假设存储过程test_sp中需要一个参数:类型nvarchar(50) 名称 @parm
Declare @parms nvarchar(50)
Set @parms=’测试变量’
Exec test_sp [@parm=]@parms –方括号内的可以省略
如果是批处理中的第一句,则可以省略Exec
输出参数
declare @num int, @field int,
@sqls nvarchar(4000)
Set @field=1
set @sqls='select @a=count(*)from table_name where field=@field'
exec sp_executesql @sqls,N'@aint output,@field int',@num output ,@field
select @num
3.sp_executesql
语法:exec[ute]sp_executesql N’select * from table_name where field=@field’,N’@field int’,@field=1
使用sp_exexutesql比使用exec更有效率
以上是SQL中常用的语句,及其执行时的顺序。不管是EXCEL,ACCESS,Oracle系列这些都基本相同。
如果要在数据库方面做高深的研究,则多看一下其自带的帮助,多练习,多看一些数据库原理方面的书。
欧芬克 | 思动力学院
技巧分享 课程总结