sql写法经验

博客围绕SQL展开,介绍了查找同一表内重复项的方法,如使用`in`和`count`;阐述了SQL中多条件分枝的`CASE`写法,包括简单CASE函数和CASE搜索函数;还讲解了触发器的使用,特别是INSTEAD OF类型触发器,其可使不可修改视图支持修改。

查找同一表内的重复项

1.select * from corp where 企业名称 in (select 企业名称 from corp gropu by 企业名称 where count(企业名称)>1 )

SQL中的多条件分枝写法

2

select flag=

case 企业名称 when '中国北京大学' then '1'

              when '北京大学哲学院' then '1'

              when '北大哲学院' then '1'

              else 企业名称 + '2' end,

企业名称,员工人数 ,企业资金,企业领导

into #temp

from corp

 

select 企业名称,员工人数 ,企业资金,企业领导

from #temp

where flag in (select flag from #temp gropu by flag where count(flag)>1 )

 

 

sql中使用case进行判断

 

select jyid,

CASE

计算条件列表并返回多个可能结果表达式之一。

CASE 具有两种格式:

  • 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。
  • CASE 搜索函数计算一组布尔表达式以确定结果。

两种格式都支持可选的 ELSE 参数。

语法

简单 CASE 函数:

CASE input_expression
    
WHEN when_expression THEN result_expression
        
[ ...n ]
    
[
        ELSE else_result_expression
    
END

CASE 搜索函数:

CASE
    
WHEN Boolean_expression THEN result_expression
        
[ ...n ]
    
[
        ELSE else_result_expression
    
END

参数
 

触发器的使用

当为表或视图定义了针对某一操作INSERT DELETE

UPDATE INSTEAD OF 类型触发器且执行了相应的操作时尽管触发器被触发但

相应的操作并不被执行而运行的仅是触发器SQL 语句本身

 

INSTEAD OF 触发器的主要优点是使不可被修改的视图能够支持修改

 

更新操作包括两个部分即先将更新的内容去掉然后将新值插入

因此对一个定义了更新类型触发器的表来讲当报告会更新操作时在删除表中存放了旧

值然后在插入表中存放新值

 

 

SQL Server中包含了几个可以访问系统注册表的扩展存储过程.但实际上这几个扩展存储过程是未公开的,sql server 7.0就有了,
SQL server 2000中仍然保留,他们以后可能会删除.但是这几个存储过程却提供了在当前的SQL Server版本中访问系统注册表的能力,
而且很多人利用SQL Server来进行攻击系统时,往往都会用到这几个扩展存储过程.所以最好在SQL Server中禁用他们.
### 高级 SQL 查询写法与技巧 #### 使用 `WITH AS` 提取公共子查询 当多个子查询需要重复使用相同的结果集时,可以利用 `WITH AS` 将其提取并赋予别名。这种方法不仅提高了代码可读性,还减少了冗余计算。例如,在订单表中筛选特定条件的数据: ```sql -- 使用 WITH AS 的示例 WITH t1 AS ( SELECT * FROM order_diy WHERE money > 30 ), t2 AS ( SELECT * FROM order_diy WHERE money > 60 ) SELECT * FROM t1 WHERE t1.id NOT IN (SELECT id FROM t2) AND t1.name = '周伯通'; ``` 此方法通过定义临时视图 `t1` 和 `t2` 来简化复杂查询逻辑[^1]。 --- #### 获取第二高薪水的解决方案 针对获取 Employee 表中第二高的薪水问题,可以通过窗口函数或嵌套查询来解决。以下是两种常见实现方式: ##### 方法 1:使用 LIMIT 和 OFFSET 适用于支持标准 SQL 的数据库(如 MySQL): ```sql SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1; ``` 该查询先按薪资降序排列,跳过最高值后选取下一个最大值[^2]。 ##### 方法 2:使用子查询过滤 另一种通用的方法是基于子查询排除最高薪资后再寻找最大值: ```sql SELECT MAX(Salary) AS SecondHighestSalary FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); ``` 如果不存在第二高的薪资,则返回 NULL。 --- #### 动态更新批量数据 在 MyBatis 中动态生成复杂的更新语句时,`<foreach>` 标签非常有用。以下是一个典型的例子,展示如何批量更新博客阅读计数器: ```xml <update id="update" parameterType="java.util.List"> UPDATE blog SET read_count = CASE id <foreach collection="blogs" item="blog" separator=" "> WHEN #{blog.id} THEN #{blog.readCount} </foreach> END WHERE id IN <foreach collection="blogs" item="blog" separator="," open="(" close=")"> #{blog.id} </foreach> </update> ``` 生成的实际 SQL 类似于: ```sql UPDATE blog SET read_count = CASE id WHEN 1 THEN 10 WHEN 2 THEN 20 WHEN 3 THEN 30 END WHERE id IN (1, 2, 3); ``` 这种技术显著提升了性能,因为它将多次独立的更新操作合并成单次执行[^3]。 --- #### 带有错误处理的事务管理 为了确保数据一致性,SQL Server 支持带错误捕获机制的事务控制流程。下面的例子展示了如何安全地完成转账操作,并在异常情况下自动回滚更改: ```sql BEGIN TRY BEGIN TRANSACTION; -- 更新账户余额 UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1; -- 模拟可能引发错误的操作 RAISERROR('模拟错误', 16, 1); UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2; COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; PRINT '事务回滚,错误信息:' + ERROR_MESSAGE(); END CATCH; ``` 这段脚本通过显式的 `TRY...CATCH` 结构实现了健壮的错误恢复策略[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值