电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

要养成良好的书写Sql的习惯

11页
  • 卖家[上传人]:m****
  • 文档编号:56348346
  • 上传时间:2018-10-11
  • 文档格式:DOCX
  • 文档大小:24.25KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、要养成良好的书写要养成良好的书写 SqlSql 的习惯的习惯我们做软件开发的,大部分人都离不开跟数据库打交道,特别是 erp 开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?我么还能保证下一个人能看懂我么的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和大家分享一下,希望对大家有帮助。要知道 SQL 语句,我想我们有必要知道 SQL Server 查询分析器怎么执行我们的SQL 语句的,我们很多人会看执行计划,或者用 Profiler 来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢?一、查询的逻辑执行顺序(1) FROM left_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 ha

      2、ving_condition(8) SELECT (9) DISTINCT (11) top_specification select_list(9) ORDER BY order_by_list标准的 SQL 的解析顺序为:(1) FROM 子句 组装来自不同数据源的数据(2) WHERE 子句 基于指定的条件对记录进行筛选(3) GROUP BY 子句 将数据划分为多个分组(4) 使用聚合函数进行计算(5) 使用 HAVING 子句筛选分组(6) 计算所有的表达式(7) 使用 ORDER BY 对结果集进行排序二、执行顺序1. FROM:对 FROM 子句中前两个表执行笛卡尔积生成虚拟表 vt12. ON: 对 vt1 表应用 ON 筛选器只有满足 join_condition 为真的行才被插入 vt23. OUTER(join):如果指定了 OUTER JOIN 保留表(preserved table)中未找到的行将行作为外部行添加到 vt2,生成 t3,如果 from 包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束。4. WHERE:对 vt3

      3、应用 WHERE 筛选器只有使 where_condition 为 true 的行才被插入 vt45. GROUP BY:按 GROUP BY 子句中的列列表对 vt4 中的行分组生成 vt56. CUBE|ROLLUP:把超组(supergroups)插入 vt6,生成 vt67. HAVING:对 vt6 应用 HAVING 筛选器只有使 having_condition 为 true 的组才插入 vt78. SELECT:处理 select 列表产生 vt89. DISTINCT:将重复的行从 vt8 中去除产生 vt910. ORDER BY:将 vt9 的行按 order by 子句中的列列表排序生成一个游标 vc1011. TOP:从 vc10 的开始处选择指定数量或比例的行生成 vt11 并返回调用者看到这里,那么用过 Linq to SQL 的语法有点相似啊?如果我们我们了解了 SQL Server 执行顺序,那么我们就接下来进一步养成日常 SQL 的好习惯,也就是在实现功能的同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实

      4、际就是批量运算,就是尽量减少在客户端进行大数据量的循环操作,而用SQL 语句或者存储过程代替。三、只返回需要的数据返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器、网络和客户端的无效劳动,其害处是显而易见的,避免这类事件需要注意:A、横向来看(1) 不要写 SELECT * 的语句,而是选择你需要的字段。(2) 当在 SQL 语句中连接多个表时, 请使用表的别名并把别名前缀于每个 Column上。这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误。1如有表 table1(ID,col1)和 table2(ID,col2)1Select A.ID, A.col1, B.col22- Select A.ID, col1, col2 不要这么写,不利于将来程序扩展3from table1 A inner join table2 B on A.ID=B.ID Where B、纵向来看(1) 合理写 WHERE 子句,不要写没有 WHERE 的 SQL 语句。(2) SELECT TOP

      5、N * - 没有 WHERE 条件的用此替代。四、尽量少做重复的工作A、控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的。天地棋牌 http:/B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。D、合并对同一表同一条件的多次 UPDATE,比如UPDATE EMPLOYEE SET FNAME=HAIWER WHERE EMP_ID= VPA30890FUPDATE EMPLOYEE SET LNAME=YANG WHERE EMP_ID= VPA30890F 这两个语句应该合并成以下一个语句UPDATE EMPLOYEE SET FNAME=HAIWER,LNAME=YANGWHERE EMP_ID= VPA30890FE、UPDATE 操作不要拆成 DELETE 操作+INSERT 操作的形式,虽然功能相同,但是性能差别是很大的。五、注意临时表和表变量的用在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:

      6、A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。B、如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据。C、如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。D、其他情况下,应该控制临时表和表变量的使用。E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现:(1) 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。(2) 执行时间段与预计执行时间(多长)F、关于临时表产生使用 SELECT INTO 和 CREATE TABLE + INSERT INTO 的选择,一般情况下:SELECT INTO 会比 CREATE TABLE + INSERT INTO 的方法快很多,但是 SELECT INTO 会锁定 TEMPDB 的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程。所以我的建议是,在并发系统中,尽量使用 CREATE TABLE + INSERT INTO,而大数据量的

      7、单个语句使用中,使用 SELECT INTO。六、子查询的用法子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。任何允许使用表达式的地方都可以使用子查询,子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。但是在性能上,往往一个不合适的子查询用法会形成一个性能瓶颈。如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。相关子查询可以用 IN、NOT IN、EXISTS、NOT EXISTS 引入。 关于相关子查询,应该注意:(1) NOT IN、NOT EXISTS 的相关子查询可以改用 LEFT JOIN 代替写法。比如:SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOTIN (SELECT PUB_ID FROM TITLES WHERE TYPE =BUSINESS)可以改写成:SELECT A.PUB_NAME FROM PUBLISHERS A LEFTJOIN TITLES B ON B.TYPE =BUSINESSAND A.PUB_

      8、ID=B. PUB_ID WHERE B.PUB_ID IS NULL比如 NOT EXISTS:SELECT TITLE FROM TITLES WHERE NOT EXISTS (SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)1可以改写成:SELECT TITLE FROM TITLES LEFTJOIN SALES ON SALES.TITLE_ID = TITLES.TITLE_ID WHERE SALES.TITLE_ID ISNULL2)如果保证子查询没有重复 ,IN、EXISTS 的相关子查询可以用 INNER JOIN 代替。比如:SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID IN (SELECT PUB_ID FROM TITLES WHERE TYPE =BUSINESS)1可以改写成:SELECT A.PUB_NAME -SELECT DISTINCT A.PUB_NAME FROM PUBLISHERS A INNERJOIN TITLES B

      9、ON B.TYPE =BUSINESSAND A.PUB_ID=B. PUB_ID(3) IN 的相关子查询用 EXISTS 代替,比如:SELECT PUB_NAME FROM PUBLISHERSWHERE PUB_ID IN(SELECT PUB_ID FROM TITLES WHERE TYPE =BUSINESS)可以用下面语句代替:SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS(SELECT1FROM TITLES WHERE TYPE =BUSINESSANDPUB_ID= PUBLISHERS.PUB_ID)4) 不要用 COUNT(*)的子查询判断是否存在记录,最好用 LEFT JOIN 或者EXISTS,比如有人写这样的语句:SELECT JOB_DESC FROM JOBSWHERE (SELECTCOUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0应该改成:SELECT JOBS.JOB_DESC FROM JOBS LEFTJOIN EMPLOYEEON EMPLOYEE.JOB_ID=JOBS.JOB_IDWHERE EMPLOYEE.EMP_ID ISNULLSELECT JOB_DESC FROM JOBSWHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)0应该改成:SELECT JOB_DESC FROM JOBSWHEREEXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)七:尽量使用索引建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。只要我们在查询语句中没有强制指定索引,索引的选择和使用方法是 SQLSERVER 的优化器自动作的选择,而它选择的根据是查询语句的条件以及相关表的统计信息,这就要求我们在写 SQL 语句的时候尽量使得优化器可以使用索引。为了使得优化器能高效使用索引,写语句的时候应该注意:(1)不要对索引字段进行运算,而要想办法做变换,比如:SELE

      《要养成良好的书写Sql的习惯》由会员m****分享,可在线阅读,更多相关《要养成良好的书写Sql的习惯》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.