设为首页 收藏本站
查看: 1513|回复: 0

[经验分享] SQL基础语句总结

[复制链接]

尚未签到

发表于 2016-11-10 04:54:22 | 显示全部楼层 |阅读模式
写在前面
  本节主要讲述一些基本的,常用的SQL语句,而非数据库方面的基本知识。数据库方面的知识留待以后再讲,现在就我们平常常用的一些SQL语句展开论述。
  本节会涉及到SQL的基本句法,SQL的执行顺序,SQL之间的组合,动态SQL语句四个方面。这四个方面之间没有前后顺序之分,是相辅相成,其内在还是有很多联系的。
一. 四种基本的SQL语句
1. 查询
  select * from table
2. 更新
  update table set field=value
3. 插入
  insert [into] table (field) values(value)
4. 删除
  delete [from] table
二.语句的执行顺序
1.语法分析
  分析语句中语法是否符合规范,衡量语句中各表达式的意义。
2.语义分析
  检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。
3.选择优化器
  不同的数据库有不同的算法(这个涉及到数据结构),数据库会根据自己的理解(数据库本身)为 SQL语句选择不同的优化器,不同的优化器会选择不同的“执行计划”
4.运行“执行计划”
  根据“执行计划”执行SQL语句。
  以上所述是数据执行时的大体路线。
5.select 语句的执行顺序
  借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技术内幕:T-SQL查询》的一段话足以说明:
  (8) select (9) distinct (11) <top_specification > <select_list>
  (1)from<lef t_table>
  (3) <join_type> join <right_table>
  (2) on <join _condition>
  (4) where <where_condition>
  (5)group by <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,并返回给调用者
  三. SQL语句扩展
1.select
1.1 选择性插入语句
1.1.1 Insert into  table1 (field1 )  Select field2 from table2
  要求table1必须存在。
1.1.2 select field1 into table1 from table2
  要求table1不存在,在运行时会自动创建表名为table1,字段名为field1的一个表。
1.2打开其它数据源
  /* OracleSvr为链接服务器名 ,本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。*/
  EXEC sp_addlinkedserver 'OracleSvr',  --链接服务器名OracleSvr,sysname类型
  'MSDAORA', --provider_name数据源提供程序,此处为oracle
  'ORCLDB' --数据源名称
  GO
  Select * from OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
  如果有多个sql server实例:
  SELECT *FROM  [servername\instancename.]pubs.dbo.authors.
  注意:一个对象的完整名称包括四个标识符:服务器名称、数据库名称、所有者名称和对象名称。其格式如下:
  [ [ [ server. ] [ database ] .] [ owner_name ] .] object_name
  中间的名称可以省略,但是.不可以省略。如:server…object_name
2.update
2.1多表更新
  Update table1 set  table1.field 1=table2.field2  from
  table1,table2 /*猜测下连接方式全联接 FULL [OUTER] JOIN */
  where  table1.field3= table2 .filed3
  知识:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法
  Oracle 中:Update  table1  set  table1.field1=
  (select table2.field2 from table2 where .field3= table2 .filed3)
3.insert
3.1 插入语句的规范问题
  在sql server 2000,sql server 2005中
  标准语句:insert into  table(field)  values (value)
  提示:在access中不正确,原因sql语句不规范,因此在书写sql语句的过程中一定要按正规的语法来写。
4.delete
4.1标准删除
  标准语句:delete from table where condition
  提示:同insert
4.2其它删除
4.2.1  truncate
  语法:truncate table  table_name
  删除表中所有行,不记录单个行删除操作,不记录日志,,所有速度比Delete快。
4.2.2  drop
  语句: Drop table table_name
  删除表及相关,有fk约束的不能删,先去年fk;系统表不能使用。
5.order by
  功能:排序
  技巧:order by newid() 随机排序
四. 动态SQL语句
4.1基本原则
4.1.1预编译问题
  在EXECUTE执行之前,数据库不会编译 EXECUTE 语句内的语句,动态SQL语句就是放到存储过程中,它也不会预先编译。
4.1.2什么时候使用动态SQL语句
  字段名,表名,数据库名作为变量时,必须用动态SQl语句
4.2.exec[ute]
4.2.1语法
  exec (‘select * from table_name where name=’’’+@name+’’’’) --括号不能少
4.2.2传递参数
  --假设存储过程test_sp中需要一个参数:类型nvarchar(50) 名称 @parm
  Declare @parms nvarchar(50)
  Set @parms=’测试变量’
  Exec test_sp  [@parm=]@parms –方括号内的可以省略
  如果是批处理中的第一句,则可以省略Exec
4.2.3输出参数
  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'@a int output,@field int',@num output ,@field
  select @num
4.3.sp_executesql
  语法:exec[ute] sp_executesql N’select * from table_name where field=@field’,N’@field int’,@field=1
  使用sp_exexutesql比使用exec更有效率.
结束语
  以上是SQL中常用的语句,及其执行时的顺序。不管是SQL Server系列,mysql,access,Oracle系列这些都基本相同。如果要在数据库方面做高深的研究,则多看一下其自带的帮助,多练习,多看一些数据库原理方面的书。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298036-1-1.html 上篇帖子: 连接sql server2005测试 下篇帖子: SQL事务回滚 写法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表