下面这个sqlsql修改语句怎么写写

下面这个SQL语句,请教一下的where部分怎么理解?_百度知道
下面这个SQL语句,请教一下的where部分怎么理解?
下面这个SQL语句,请教一下的where部分怎么理解?selectd.NameasDepartment,e.NameasEmployee,e.SalaryasSalaryfromEmployeeejoinDepartmentdone.DepartmentId=d.Idwhere(selectcount...
下面这个SQL语句,请教一下的where部分怎么理解?select d.Name as Department, e.Name as Employee, e.Salary as Salary from Employee e join Department d on e.DepartmentId = d.Id where (
select count(distinct Salary)
From Employee c
where c.DepartmentId = d.Id
and c.Salary & e.Salary) & 3重点在于:这个SQL语句的where部分跟了个括号,里面是一个“嵌套select”…… 而这个嵌套select的where条件部分,却又引用了括号外 主select的表Department d…… 这个要怎么理解?…… 【附】原题要求是这样子
上面代码执行提交正确
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
CASE表达式是在解决SQLServer查询问题上的一个强大的工具。你可能感觉到它在SELECT语句中的用法类似于IF/ELSE的处理。但是,相对与IF/ELSE,CASE表达式却没有那么多限制。在以下代码中将展示CASE表达式的用处:l
消除在UPDATE行时的游标循环。l
在使用聚集函数时,执行特殊处理。l
不使用动态SQL的动态ORDER BY 和WHERE子句让我们看看以下例子:首先,先创建一个名为Customer的表并插入数据:CREATE TABLE dbo.Customer (customerid INT IDENTITY PRIMARY KEY, firstname VARCHAR(40) NOT NULL, lastname VARCHAR(40) NOT NULL, statecode VARCHAR(2) NOT NULL, totalsales money NOT NULL DEFAULT 0.00)
亲,你答非所问啊……
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。各位高手,下面这个sql语句要 如何写才能得到表C的结果_百度知道
各位高手,下面这个sql语句要 如何写才能得到表C的结果
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:345
获赞数:661
参与团队:
select&a.登录名,&a.姓名,&a.部门,&&&&&&&&&&sum(case&when&b.请假类型='病假'&then&b.请假天数&else&0&end)&病假,&&&&&&sum(case&when&b.请假类型='事假'&then&b.请假天数&else&0&end)&事假&&from&tablea&a,&tableb&bwhere&a.登录名=b.登录名group&by&a.登录名,&a.姓名,&a.部门
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。看到别人写 SQL 会在 where 后面写 1=1,是什么意思? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
Great Sites on MySQL
推荐管理工具
MySQL 相关项目
看到别人写 SQL 会在 where 后面写 1=1,是什么意思?
11:46:49 +08:00 · 14040 次点击
SELECT * FROM
operation_log o
and o.operation_time&=''
and o.operation_time&''
这个 1=1 好像写不写都没关系哦?
77 回复 &| &直到
18:58:44 +08:00
& & 11:51:38 +08:00
感觉主要是有些人喜欢拼接 sql ,这样能保证一定有个 where 字段,其实没什么意义。
& & 11:53:38 +08:00
就是为了加 and   拼接 sql 语句
& & 11:55:49 +08:00
为了拼接方便
& & 11:57:21 +08:00
& & 12:01:12 +08:00
楼上说的都对,跟 2=2 没什么区别,为了语法凑字数用的。如果不加这个 1=1 ,那么在拼 sql 的时候你要判断拼上去的第一个条件是不带 and 的,然而很多查询都是多条件组合查询的,你并不知道哪一个条件会拼在第一个上,所以干脆把第一个条件写成 sql 认为的"true",其他所有条件都是 and
& & 12:03:08 +08:00
知道真像的我。。。。? 没有 ORM 你么肿么活下来的。。。
& & 12:09:45 +08:00
抱歉刚接触 SQL ,你们说的没听懂……SELECT * FROM operation_log owhere
o.operation_time&=''and o.operation_time&''这样写不也可以么?
& & 12:13:14 +08:00
$sql = "SELECT * FROm table WHERE 1=1":if($_GET['filed1']){
$sql .= "AND filed1=1":}if($_GET['filed2']){
$sql .= "AND filed2=2":}哈哈哈,曾经也是玩的很溜的
& & 12:13:49 +08:00 via Android
一般是这个方法里的 SQL 是根据入参动态生成的,比如有多个条件,这些条件又不是必填,那就在 where 1=1 ,后面接多个 and xxx 就行了。不然要是哪天 where 条件的参数变了,还要改 where xxx 。where 1=1
MySQL 查询分析器会自动优化,没有性能问题。
& & 12:20:25 +08:00
都是不会用 implode 的程序猿惹的祸
& & 12:33:04 +08:00
我看到都蛋疼
不说 直接上代码$conditions_str = implode(',', array_map(function($x){return sprintf('%s=:%s', $x, $x);}, array_keys($conditions)));
if (!empty($conditions_str)){
$conditions_str = " where {$conditions_str} ";
& & 12:35:40 +08:00
有人发现了吗。在座的发代码出来的全都是 phper
& & 12:41:24 +08:00
呵呵 我不是咧 主营不是拍好 p 我只是看到上面都用 php 举例子 也就去翻了下以前的代码
& & 13:19:49 +08:00
1.不需要判断有没有条件2.不需要判断第一个条件还是第 N 个条件
& & 13:23:37 +08:00
@ 因为 java 的话用 mybatis 会自动帮你去掉多余的 and 所以根本不需要写 1=1 去拼接
& & 13:34:29 +08:00 via Android
这个是为了保持语法正确,比如有很多文本框 txt ,但是不能保证用户都输入数值。比如temp="select * from a where 1=1"if txt&&"" then temp=temp+"and id=" +txt手机写的,大概就是这个意思。
& & 14:38:35 +08:00
上面说 为了拼接 SQL 方便的,
其实是 那个程序员太懒,太 LOW 而已。1 , 为何不用 ORM ?2 , 就算不用 ORM , 拼接那些 SQL 很难?
& & 14:49:50 +08:00
因为懒的判断。
& & 14:59:43 +08:00
我也挺喜欢用这种拼接 sql 的方式 进行查询,非常方便,但是得注意安全性问题
& & 15:17:12 +08:00
@ 1.ORM 底层也是拼 sql2.复杂的多表联查, ORM 就蛋疼了
& & 15:21:35 +08:00
为了拼 sql 的时候方便一点,不用判断是否为第一个条件。后面的条件,直接加 and 就可以了
& & 15:25:59 +08:00
同拼接 sql
& & 15:30:27 +08:00
@ 讲真,现在用 mybatis 有时候还会这么写 = =|| ,对 orm 老是有种本能的排斥
& & 15:31:44 +08:00
@ 为什么会 low 呢,某些场景下这么写可读性挺好的,也没有性能问题= =
& & 15:33:22 +08:00 via Android
& & 15:37:05 +08:00
& & 15:37:45 +08:00
一般用于条件的拼接, 在 mysql 里可以写成 where 1
, oracle 才需要
where 1=1 这么 low 的写法...哈哈
& & 15:44:02 +08:00
当初公司的 orm 也是这么写的,然后就被人注入了
& & 15:44:58 +08:00
@ MSSQL 也是 where 1=1 ,顺便问一下,哪儿 low 了?
& & 16:00:29 +08:00
开个玩笑, 因为非要写个表达式 , 如果别人写个 where 123 = 123 ,你说行不行, 当然行, 就是感觉上很 low
& & 16:01:26 +08:00
@ 哈哈,笑点一下变低了。。。
& & 17:01:54 +08:00
完全有点不知所措
& & 17:16:42 +08:00
一般直接写个 where 1 and XXX...
& & 17:20:27 +08:00
@ 别总是把性能挂在嘴上,
我说 low 指的是
拼接完全不需要 where 1 = 1 啊, 这样 LZ 就不会有这样的疑问了
& & 17:20:50 +08:00
@ 有的企业级报表的一条 sql 就 100 多行,各种联表各种嵌套,你不懒你 orm 搞一搞。你不 low 你搞一种比拼接字符串或者字符串匹配效率更高的方式出来。
& & 17:21:45 +08:00
@ 这个写法和注入没有任何关系
& & 17:21:50 +08:00
ORM 确实在 处理复杂查询, 写出来的 代码 比 raw sql 还要复杂。ORM 为啥 拼接的 SQL 就没有 where 1 =1 这种蛋疼的东西?
& & 17:22:26 +08:00
& & 17:22:47 +08:00
@ oracle 你不写 1=1 你试试
& & 17:22:56 +08:00
很早很早以前,在某些数据库使用不带条件的 delete 时不会返回删除记录数,就会有人给加上一个 where 1=1 ,这样会返回 affected rows 。至于 select 中的 1=1 的话,应该就是纯粹的方便串拼接吧
& & 17:24:28 +08:00
@ orm 浪费性能加了个判断,把拼好的条件的第一个 and 给 replace 了。用 1=1 的方式性能绝无问题
& & 17:25:20 +08:00
没有 ORM 不会用数据库
& & 17:27:15 +08:00
@ orm 用到最后会发现不会写 sql 了。而且复杂的 sql 用 orm 是做不到的
& & 17:28:01 +08:00
编程技巧而已。
& & 17:32:20 +08:00
@ 拼接无问题,做好变量绑定
& & 17:50:16 +08:00
我知道你的意思,
就是 添加一个新 条件, 就往老条件后面 + " and " + 新条件最后还要把 最前面的 and 去掉。 如果要判断 还有性能损失。1 , 在操作数据库, 有大量 IO 的情况下,
判断一个 空字符串
也能给你的程序 带来 性能担忧,
那也就不用讨论了, 我还没达到你的高度2 , 就算不判断, 也可以直接拼接 两个 API 罢了。 一个 初始化条件, 一个 append 其他条件#include &stdio.h&#include &stdlib.h&#include &string.h&void append_the_fucking_condition(char* conditon, const char* other){
strcat(conditon, " and ");
strcat(conditon, other);}char* make_condition(const char* first_condition){
char* conditon = (char*)malloc(sizeof(char) * 512);
strcat(conditon, first_condition);}int main(){
char* conditon = make_condition("o.operation_time&=\'\'");
append_the_fucking_condition(conditon, "o.operation_time&\'\'");
printf("%s\n", conditon);
free(conditon);
return 0;}
& & 20:51:49 +08:00
@ 程序有 bug?
& & 21:38:12 +08:00
这种 SQL ,我也醉了
& & 21:38:29 +08:00
用 1 AND 不是更方便。这样写还有一种原因,为了 debug 起来方便。
& & 21:40:16 +08:00
Python 大法好
& & 21:42:06 +08:00
拼接 sql 很容易出问题的,竟然还有人敢这么干!
& & 00:26:08 +08:00
从这么多回复看来很多人要么是强迫症或者自我感觉太良,要么从来没有维护过数据库事实上 1=1 已经几乎可以说成为了一种约定如果需要我要手写一个复杂一些的 SQL 语句,习惯上也都会在编辑器里面的条件前面加一个 1=1 然后回车,然后每个 AND 条件写一行,最后加上分号好处是什么呢?你后面继续写下面的 AND 条件根本无需担心关键字和顺序你可以随便交换两个 AND 条件(可能仅仅是为了更好看)可以随便复制粘贴一行条件到其它位置再修改可以随便删除一行条件包括第一个而不需要手工修正任何内容再举另一个例子java 或者 js 的数组都允许最后一个元素悬挂一个逗号目的也是为了可以让多行元素来定义数组的时候,能够保持对称性,去除首尾效应美观有时候并不是这么重要
& & 00:38:28 +08:00
我要是告诉你们还有 WHERE 1=2 OR 这种技巧,楼上几个有洁癖的是不是要炸
& & 03:00:50 +08:00
我写 SQL 一般是这样写的: select a
from tblewhere 1=1
and xxxxx逗号都写前面,方便调试。如果是程序里拼接,加判断当然可以。但是既然可以不加判断直接写,为什么非要多写个判断呢?
& & 06:07:01 +08:00 via iPhone
我说一个碰到的问题。项目使用 druid 做数据库连接池,自带某安全功能会校验永真条件,只要出现永真条件就不会让 SQL 跑,目的猜是为了防 SQL 注入,一般的 SQL 注入手法之一。然后问题来了, 1=1 就是一个永真条件……从安全觉度再讨论,是否不应该去建议这样拼 SQL 呢
& & 06:40:43 +08:00
按楼上很多人的说法,这样拼 sql 我用了 10 来年了,怎么就没出过问题呢?这是个问题。我看是你们满眼觉得 1=1 是何等的不爽,而忽略了更为重要的事情。这才是问题。
& & 07:40:09 +08:00 via iPhone
造成 sql 注入的根本原因是用户输入参数未转义,和 1=1 有什么关系?关键在于不要直接拼接参数,而是将其用占位符表示。难道 ORM 底层的 sql 不是拼接出来的吗?
& & 08:41:14 +08:00 via Android
@ 拼接 SQL ,然后参数转义并
Prepared Statements
化就没问题。
& & 08:51:21 +08:00
我一般 WHERE 1AND ....AND ....AND ....AND ....
& & 08:53:27 +08:00
@ 同意。。
& & 09:22:19 +08:00 via Android
原来还有这种方式, get 到了
& & 09:22:38 +08:00
有一种场景删表中全数据的时候DELETE FROM `table` WHERE 1=1
& & 10:14:41 +08:00 via iPhone
@ 问题是很多人拼着拼着就忘了,或者换个人开发不定按套路来。所以还是 orm 安全点
& & 10:21:09 +08:00
查询时偶尔也会这样写。为了调试...select xx from table where a=x? and b=y?我如果调试不要过滤条件是不是把 2 、 3 行干掉还得去把 where 删掉?我如果加了 1=1...至于性能...?和强迫症
& & 11:30:55 +08:00
一起写 Java 的时候经常这么干,并没有什么不好的。现在自己写 Rails 就不需要这么干了``&code&
@ = Topic.all
if params[:name] && !params[:name].empty?
@ = @.where("title like ?", "%#{params[:name]}%")
if params[:id] && !params[:id].empty?
@ = @.where("id = ?", "#{params[:id]}")
if params[:status] && !params[:status].empty?
@ = @.where("status = ?", params[:status])
end&/code&``顺便看看 V2 的编辑器能不能搞代码
& & 13:48:09 +08:00 via iPhone
复杂的 sql 虽然用的少,但是绝对是必要的,一般会写个自动拼接 sql 的助手类,可以避免注入
& & 20:47:48 +08:00 via Android
楼上写 Java 的各位,即使不用 ORM ,还有个东西叫 jOOQ
& & 00:12:08 +08:00
经常用 plsql ,写 1=1 美化后, and 在下一行,方便注释。。。
& & 09:45:33 +08:00
大家都在用 ORM 吗?如果有些平台或者库没有特别好的怎么办?
比如 iOS 平台,我不想用 CoreData ,想用 fmdb 。那怎么用 ORM? 自己开发一套 ORM?
& & 11:29:51 +08:00
为以后用填坑呢.如果哪天想要添加条件直接在 1=1 后面写,或者替换 1=1 就可以了
& & 09:03:15 +08:00
@ 不能赞同。:)
& & 09:23:26 +08:00
是为了拼接 sql !
& & 11:06:14 +08:00 via Android
SQL 注入欢迎您
& & 11:28:02 +08:00
看似简单的问题,其实不简单啊,在下输了,只知道方便拼接条件,却没想到能涉及那么多方面的知识……
& & 16:27:56 +08:00
这种 where 1 = 1 的写法我几年前年第一次见到同事写时觉得有点 low ,但发现确实很实用。ORM 在 SQL 比较复杂的情况下确实比较乏力,所以有时候用这种方式快捷方便,也容易理解, ORM 写出来的代码可能更难理解。另外,这个用法跟 SQL Injection 有半毛钱关系?
& & 16:30:33 +08:00
1=1 和注入没关系, 只是为了拼接方便, 拼接当然是拼接有占位符的 sql, 以下是我用 jfinal 的示例:String sqlExceptSelect = " from
t1 where 1=1 ";List & Object & paras = new ArrayList & Object & ( );if ( !"".equals ( pinfen1 ) ) {// /评分 start
sqlExceptSelect += " and {pinfen}&=?
paras.add ( pinfen1 );}if ( !"".equals ( pinfen2 ) ) {// /评分 end
sqlExceptSelect += " and {pinfen} &=? ";
paras.add ( pinfen2 );}sqlExceptSelect = sqlExceptSelect.replaceAll ( "\\{pinfen\\}" , "cast( `评分` as decimal(10,2))" )// /Page & Record & llpg = DB ( db ).paginate ( 1,20, "select * " , sqlExceptSelect , paras.toArray ( new Object [ paras.size ( ) ] ) );pinfen1 和 pinfen2 是界面输入的, 您看能注入么?
& & 18:58:44 +08:00
注入和 1=1 有毛关系
& · & 1801 人在线 & 最高记录 3762 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 26ms · UTC 09:37 · PVG 17:37 · LAX 02:37 · JFK 05:37? Do have faith in what you're doing.本篇来聊聊如何书写漂亮、整洁、优雅的SQL脚本,下面这些是我个人总结、整理出来的。姑且做个抛砖引玉吧,呵呵,欢迎大家一起来讨论。
我们首先来看看一段创建数据表的脚本(如下所示),你是否觉得有什么不妥或是不足呢?如果是你,你怎样书写呢?
CREATE&TABLE&[dbo].[TableDataDictionary](&&&&[TableID]&[int]&IDENTITY(1,1)&NOT&NULL,&&&&[IpAddress]&[nvarchar](15)&NOT&NULL,&&&&[DataBaseName]&[nvarchar](35)&NOT&NULL,&&&&[TableName]&[nvarchar](35)&NOT&NULL,&&&&[Description]&[nvarchar](150)&NULL,&CONSTRAINT&[PK_TableDataDictionary]&PRIMARY&KEY([Tableid]))
可能你也没有觉得它有什么不妥,因为你一直都是这样书写哦。而且更混乱、更杂的的脚本你也见过,也可能习惯了;那么来看看下面的脚本,
USE&[Test];GOIF&OBJECT_ID(N'TableDataDictionary')&IS&NULL&&&&&CREATE&TABLE&[dbo].[TableDataDictionary]&&&&(&&&&&&&&[TableID]&&&&&&&&&&&&INT&IDENTITY(1,1)&&NOT&NULL,&&&&&&&&[IpAddress]&& & & & &NVARCHAR(15)&&&&&&&NOT&NULL,&&&&&&&&[DataBaseName]&&&&&&&NVARCHAR(35)&&&&&&&NOT&NULL,&&&&&&&&[TableName]&& & & & &NVARCHAR(35)&&&&&&&NOT&NULL,&&&&&&&&[Description]&&&&&&&&NVARCHAR(150)&&&&&&NULL,&&&&&&&&CONSTRAINT&[PK_TableDataDictionary]&PRIMARY&KEY([Tableid])&&&&);ELSE&&&&PRINT&'This&table&have&been&exist&in&database';GO
&上面两段脚本比起来,你是否觉得下面的更美观、优雅呢?
接下来我们来看看四段申明变量的脚本,自己可以对比&
(一)DECLARE&@PayType&VARCHAR(50),&&@Rate&FLOAT,&@FeeRate&FLOAT&,@OtheFee&FLOAT;DECLARE&@StartDate&DATETIME,&&&@EndDate&DATETIME;DECLARE&@CmdSql&NVARCHAR(MAX);DECLARE&@MyCardBillFee&FLOAT,&@MyCardFee&&&&FLOAT;---------------------------------------------------------------------------------------------------------&& & & & & & & & & & & & & & & &(二)DECLARE&@PayType&VARCHAR(50);DECLARE&@Rate&FLOAT;DECLARE&@FeeRate&FLOAT;DECLARE&@OtheFee&FLOAT;DECLARE&@StartDate&DATETIME;DECLARE&@EndDate&DATETIME;DECLARE&@CmdSql&NVARCHAR(MAX);DECLARE&@MyCardBillFee&FLOAT;DECLARE&@MyCardFee&&&&FLOAT;---------------------------------------------------------------------------------------------------------&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(三)DECLARE&@PayType&& & & &&VARCHAR(50); & & & & & & &--支付类型DECLARE&@Rate&&&&&&&&&&&&FLOAT;&&&&&&&&&&&&&&&&&&&&--汇率比例DECLARE&@FeeRate&& & & &&FLOAT;&&&&&&&&&&&&&&&&&&&&--手续费比例DECLARE&@MyCardFee&&&&&&&FLOAT;&&&&&&&&&&&&&&&&&&&&--......DECLARE&@OtheFee&& & & &&FLOAT;&&&&&&&&&&&&&&&&&&&&--......DECLARE&@MyCardBillFee&&&FLOAT;&&&&&&&&&&&&&&&&&&&&--......DECLARE&@StartDate&&&&&&&DATETIME; & & & & & & & &&--......DECLARE&@EndDate&& & & &&DATETIME; & & & & & & & &&--......DECLARE&@CmdSql&& & & & &NVARCHAR(MAX);&&&&&&&&&&&&--......---------------------------------------------------------------------------------------------------------&&&&&&&&&&&&&&&&&&&&&&&&&&(四)DECLARE&&&&&@PayType&& & & &&AS&&&&VARCHAR(50);&&&&&&&&&&&&--支付类型&&&&@Rate&&&&&&&&&&&&AS&&&&FLOAT; & & & & & & & & &--汇率比例&&&&@FeeRate&& & & &&AS&& &FLOAT; & & & & & & & & &--手续费比例&&&&@MyCardFee&&&&&&&AS&& &FLOAT; & & & & & & & & &--......&&&&@OtheFee&& & & &&AS&& &FLOAT; & & & & & & & & &--......&&&&@MyCardBillFee&&&AS&& &FLOAT; & & & & & & & & &--......&&&&@StartDate&& & &&AS&& &DATETIME; & & & & & & & --......&&&&@EndDate&& & & &&AS&& &DATETIME;&&&&&&&&&&&&&&&--......&&&&@CmdSql&&&&&&&&&&AS&& &NVARCHAR(MAX); & & & & &--......-------------------------------------------------------------------------------------------------------
如果是你,你愿意运用哪种书写格式呢? 个人觉得(一)写得极极糟糕,不仅阅读不方便、而且也不方便注视。(二)则是我以前习惯书写的格式,一来没有注视、二来看起来没有(三)、(四)美观、大方。
存储过程、函数头部注视的样式(个人曾今用过的样式):&
&&&&&&&&(一)--=============================================================================================================--&&&&&&&&&&&&Function&&&&&&&& :&&&&&&&&&&&&dbo.USP_GetEmployeById&按Id获取雇员信息--&&&&&&&&&&&&Auhtor&&&&&&&&&&&&:&&&&&&&&&&&&Kerry--&&&&&&&&&&&&Create&Date & & & :&&&&&&&&&&&&--&&&&&&&&&&&&Description & & & :&&&&&&&&&&&&详细描述存储过程功能(对Function&功能补充)、以及参数、输出结果的描述--=============================================================================================================--&&&&&&&&&&&&&&&&&&&&: & & & & & 修改....增加........--&&&&&&&&&&&& & & & &: & & & & & &修改....增加.......--=============================================================================================================&&&&&&&&&&&&&&&&&&&&&&&&&&&&Function&&简要描述存储过程、函数功能。&Desctiption&详细描述存储过程、函数功能,以及参数、输出结果描述&&&&&&&&&&&&&&&&&&&&&&&&&&&&(二)--=============================================================================================================--&&&&&&&&Create&Date&&&&&&&&&&&&:&&&&&&&&--&&&&&&&&Author & & & & & & & & :&&&&&&&&Kerry--&&&&&&&&Modified&Date & & & & &:&&&&&&&&--&&&&&&&&Modified&Content & & & :&&&&&&&&修改表字段、增加汇率计算.....--&&&&&&&&Modified&Date & & & & &:&&&&&&&&--&&&&&&&&Modified&Content & & & :&&&&&&&&修改表字段、增加汇率计算.....--&&&&&&&&Description&&&&&&&&&&&&:&&&&&&&&计算抢车位社区游戏的月充值结构信息。&&&&--=============================================================================================================&&&&&&&&&&&&&&&&&&&&&&&&&&&&(三)/**************************************************************************************************************&&&&&&&&Auhtor & & & & & & & & :&&&&&&&&&&&&Kerry&&&&&&&&Create&Date&&&&&&&&&&&&:&&&&&&&&&&&&&&&&&&&&Modified&Date & & & & &:&&&&&&&&Modified&Content & & & :&&&&&&&&Description&&&&&&&&&&&&:&&&&&&&&&&&&如何书写漂亮、优雅的SQL脚本**************************************************************************************************************/&&&&&&&&&&&&&&&&&&&&&&&&&&&(&四)--&=============================================--&Author:&&&&&&&&&Author,,Name&--&Create&date:&&Create&Date,,&--&Description:&&&&&Description,,&--&=============================================
使用MSSMS新建存储过程,它自动生成的样式&
个人觉得(一) &= (二) & (三) & (四) ,不知道大家有没有更好的格式推荐。
下面看看这样一段脚本,一眼就觉得有点糟糕,其实实际开发中脚本比这个可能复杂得多,头痛吧
select&PermissionID&from&&Permission&where&resourceid=(&select&top&1&resourceid&from&[Resource]&where&resourcename=@resourcename)&and&actionid=(select&top&1&actionid&from&[Action]&where&actionname=@actionname)AND&SchemaId&in&(SELECT&SchemaId&FROM&dbo.BindToSchema&WHERE&DcUserID=@UserID)&&&&
首先就应该统一关键字大小写,不要一部分大写、一部分小写。然后从结构上面调整。 可能每个人的审美观、习惯的格式不同,这个无所谓,也没有必要统一。 但是你书写出来的脚本至少要结构清晰,一目了然。不要让别人费很大的劲去调整格式,然后才能理解它的逻辑,如果写出上面或是比上面更糟糕的脚本,我想项目经理真应该教训教训你。这样只会给后来维护的人痛苦不堪(实际开发中可能比这糟糕十倍呢,想必很多人是深受其害啊)&
SELECT&Permission&FROM&&Permission&WHERE&&&&&&resourceid&=(&SELECT&TOP&1&resourceid&FROM&[Resource]&WHERE&resourcename=@resourcename)&&&&&AND&actionid&=(SELECT&TOP&1&actionid&FROM&[Action]&WHERE&actionname=@actionname)&&&&AND&SchemaId&IN&(SELECT&SchemaId&FROM&dbo.DcUserBindToSchema&WHERE&DcUserID=@UserID)
动态组合语句是否让你的脚本看起来林乱不堪啊,你有没有试过让其在某些方面看起来美观点、优雅点啊、
'SELECT&&&Order_ID&=&@OrderID,&CampaignCode=&@CampaignCode,&ProductCode&=&@ProductCode,&StartDate=&SpotDate,&&&&&EndDate&=&EndDate,&StartTime=&Media_StartTime,&EndTime&=&Media_EndTime,&Duration&=&(CASE&WHEN&Media_Duration&IS&NULL&OR&&&ELSE&Media_Duration&END),&Adformat=&Media_Adformat&,&Color&=&Media_Color&,&--Media_Showing,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Size&&&=&Media_Size,&SpotType&&=&Media_SpotType,&URL&=&Media_URL&&,&ScheduleNo&&&=&ScheduleNo&,&&&&Plan_Insertion_ID&&=&Plan_Insertion_ID&&那下面书写格式是不是美观、整洁些呢&&SELECT&&&&&Order_ID&&&&&&&&&&=&@OrderID&&,&CampaignCode&&&&&&=&@CampaignCode&&,&ProductCode&&&&&&&=&@ProductCode&&,&StartDate&&&&&&&&&=&SpotDate&&,&EndDate&&&&&&&&&&&=&EndDate&&,&StartTime&&&&&&&&&=&Media_StartTime&&,&EndTime&&&&&&&&&&&=&Media_EndTime&&&,&Adformat&&&&&&&&&&=&Media_Adformat&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Color&&&&&&&&&&&&&=&Media_Color&&,&Impression&&&&&&&&=&Media_Impression&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Location&&&&&&&&&&=&Media_Location&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Material&&&&&&&&&&=&Media_Material&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Position&&&&&&&&&&=&Media_Position&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Program&&&&&&&&&&&=&Media_Program&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Scale&&&&&&&&&&&&&=&Media_Scale&&&&&&&&&--Media_Showing&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&Size&&&&&&&&&&&&&&=&Media_Size&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&SpotType&&&&&&&&&&=&Media_SpotType&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,&URL&&&&&&&&&&&&&&&=&Media_URL&&,&ScheduleNo&&& && &=&ScheduleNo&&,&Plan_Insertion_ID =&Plan_Insertion_ID&&,&Position&=&Media_Position
怎么样是否觉得下面的”清新脱俗“,眼前一亮啊,呵呵,不是在说美女啊。看看我以前一个同事写的吧,我只截取了一部分。
写着觉得有点天马行空、不着边际了,其实这个话题有点大,而且和个人习惯、审美观有莫大联系,所谓众口难调,不过有几点应该是一致的:
1:书写脚本的时候,多用空格、Tab键,不要让代码拥挤,杂糅在一起。
2:让代码看起来觉得舒服,一目了然,不要一看就觉得头痛,要细细看上好久,才了解逻辑结构
3:让代码看起来整洁、优美。凌乱不堪是大忌。
4:总结、学习一些书写漂亮的格式。&
限于篇幅,下面给出一些我见过的、写的比较优雅的脚本,大家也可以贴出自己写得优美的代码,一起学习探讨。
--&Construct&column&listSET&@sql&=&&N'SET&@result&=&'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&STUFF('&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&(SELECT&N'',''&+&'&&&&&&&&&&&+&N'QUOTENAME(pivot_col)&AS&[text()]'&&&&&&&+&@newline&+&&N'&&&&&FROM&(SELECT&DISTINCT('&&&&&&&&&&&+&@on_cols&+&N')&AS&pivot_col'&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&&&&&&FROM'&+&@query&+&N')&AS&DistinctCols'&&&+&@newline&+&&N'&&&&&ORDER&BY&pivot_col'&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&FOR&XML&PATH('''')),'&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&1,&1,&N'''');'EXEC&sp_executesql&&@stmt&&&=&@sql,&&@params&=&N'@result&AS&NVARCHAR(MAX)&OUTPUT',&&@result&=&@cols&OUTPUT;--&Create&the&PIVOT&querySET&@sql&=&&N'SELECT&*'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'FROM'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&(&SELECT&'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&'&+&@on_rows&+&N','&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&'&+&@on_cols&+&N'&AS&pivot_col,'&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&'&+&@agg_col&+&N'&AS&agg_col'&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&FROM&'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&'&+&@query&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&)&AS&PivotInput'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&PIVOT'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&(&'&+&@agg_func&+&N'(agg_col)'&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&FOR&pivot_col'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&&&&&IN('&+&@cols&+&N')'&&&&&&&&&&&&&&&&&&&&&&&&&+&@newline&+&&N'&&&&)&AS&PivotO'
DECLARE&&@schemaname&AS&NVARCHAR(128),&&@tablename&&AS&NVARCHAR(128),&&@colname&&&&AS&NVARCHAR(128),&&@sql&&&&&&&&AS&NVARCHAR(805);SET&@schemaname&=&N'dbo';SET&@tablename&&=&N'Orders';SET&@colname&&&&=&N'CustomerID';SET&@sql&=&N'SELECT&COUNT(DISTINCT&'&&+&QUOTENAME(@colname)&+&N')&FROM&'&&+&QUOTENAME(@schemaname)&&+&N'.'&&+&QUOTENAME(@tablename)&&+&N';';EXEC(@sql);
阅读(...) 评论()
友情链接: |}

我要回帖

更多关于 sql查询语句大全讲解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信