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

[经验分享] [SQL SERVER系列]工作经常使用的SQL整理,实战篇(二)[原创]

[复制链接]

尚未签到

发表于 2015-6-27 09:13:40 | 显示全部楼层 |阅读模式
  工作经常使用的SQL整理,实战篇,地址一览:
  工作经常使用的SQL整理,实战篇(一)
  工作经常使用的SQL整理,实战篇(二)
  工作经常使用的SQL整理,实战篇(三)
  
  接着上一篇“工作经常使用的SQL整理,实战篇(一)”继续讨论,这一篇中主要讨论增删改查,连接,分组和排序,通配符,视图,存储过程和事务,游标,触发器这些东西。
6.增删改查
插入
--插入用户表数据
insert into Tse_User(UserID, UserName, RealName, Email, Mobile)
values(111, 'zhangsan', 'zhangsan', 'zs@126.com', '')

--插入产品表数据
INSERT INTO Tse_Product(ProductID, ProductName, Price, Storage)
VALUES('PD00030', 'Benz', 500500.0, 30000)
 
--插入订单表数据
declare @OrderID VARCHAR(64)

--将年,月,日,时,分,秒,毫秒以字符串形式连接起来作为订单号
  SET @OrderID = DATENAME(YEAR, GETDATE()) + DATENAME(MONTH, GETDATE()) +DATENAME(DAY, GETDATE())+
  DATENAME(HOUR, GETDATE()) + DATENAME(MINUTE, GETDATE())+DATENAME(SECOND, GETDATE()) +DATENAME(MILLISECOND, GETDATE())
  INSERT INTO Tse_Order(OrderID,  UserID,  ProductID,  Number,  PostTime)
  VALUES(@OrderID,  115,  'PD00040',  10,  GETDATE())

修改
Update Tse_User set RealName = '李四' where UserID = 112

删除
Delete from Tse_User Where UserID = 111

简单查询
select * from Tse_User with(nolock)
select * from Tse_Order with(nolock) where ID >= 2

7.连接
内连接
--左右表匹配的行
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
INNER JOIN Tse_User AS U WITH(NOLOCK) ON O.UserID = U.UserID
WHERE U.UserID = 111

左连接(左外连接)
--左边表中所有行,右边匹配左边, 右边为空的补NULL
SELECT * FROM Tse_User AS U WITH(NOLOCK)
LEFT JOIN Tse_Order AS O WITH(NOLOCK) ON U.UserID = O.UserID

右连接(右外连接)
--右边表中所有行,左边匹配右边,左边为空的补NULL
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
RIGHT JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID

全连接
--左右表所有行,为空的补NULL
SELECT * FROM Tse_Order AS O WITH(NOLOCK)
FULL JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID

8.分组和排序
按UserID分组
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID

按UserID分组,订单数量大于等于3
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID HAVING COUNT(0) >=3

按UserID分组,订单数量大于等于1,按订单数量升序
SELECT UserID, COUNT(0) AS Number FROM Tse_Order WITH(NOLOCK) GROUP BY UserID HAVING COUNT(0) >=1 ORDER BY Number ASC

9.通配符
LIKE:匹配多个未知字符
_:匹配一个未知字符

--匹配126邮箱的
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@126.com'

  --匹配所有包含@的邮箱
  SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@%'

  --匹配16开头,后面跟一个任意字符的邮箱
  SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email LIKE '%@16_.com'

--匹配除126以外的所有邮箱
SELECT * FROM Tse_User WITH(NOLOCK) WHERE Email NOT LIKE '%@126.com'

10.视图
  删除视图
  IF EXISTS (SELECT * FROM SYSOBJECTS WHERE Name = 'V_Tse_TotalInfo')
  DROP VIEW V_Tse_TotalInfo

  创建视图
--包含用户表,产品表和订单表关联后的所有信息
  CREATE VIEW V_Tse_TotalInfo
  AS
  SELECT O.OrderID, O.UserID, O.ProductID, O.PostTime, U.UserName, U.RealName,
  U.Email, U.Mobile, P.ProductName, P.Price FROM Tse_Order AS O WITH(NOLOCK)
  INNER JOIN Tse_User AS U WITH(NOLOCK) ON O.UserID = U.UserID
  INNER JOIN Tse_Product AS P WITH(NOLOCK) ON O.ProductID = P.ProductID

11.存储过程和事务
创建存储过程,先删除订单表(外键表)中的记录,再删除产品表(主键表)中的记录



  CREATE PROCEDURE [dbo].[SC_Tse_DeleteProduct]
  (
      @ProductID VARCHAR(64),
      @Result int output
  )
  AS
  BEGIN
      SET NOCOUNT ON;
  
      BEGIN TRAN   --开始事务
      BEGIN
          DELETE FROM Tse_Order WHERE ProductID = @ProductID
          
          DELETE FROM Tse_Product WHERE ProductID = @ProductID
          
          IF (@@ERROR  0)
          BEGIN
              SET @Result = -999
              ROLLBACK TRAN   --回滚
          END
          ELSE
          BEGIN
              SET @Result = 888
              COMMIT TRAN     --提交
          END
      END
  END

12.游标
获取所有产品的名字,以‘|’分隔,包含在输出参数@Names中



  CREATE PROCEDURE SC_Tse_GetProductNames
(
@Names varchar(max) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
declare @ProductName varchar(64)
declare curTest cursor
for (select ProductName from Tse_Product)
open curTest                --打开游标
fetch next from curTest into @ProductName
while @@fetch_status = 0   --获取成功
begin
if (@ProductName is not null and @ProductName  '')
begin
if (@Names is null or @Names = '')
begin
set @Names = @ProductName
end
else
begin
set @Names = @Names + '|'+ @ProductName
end
end
fetch next from curTest into @ProductName
end
close curTest            --关闭游标
deallocate curTest        --释放游标
END
  
13.触发器
因为用户编号在订单表中为外键,所以,直接删除某个用户时,如果该用户下了订单,就会提示有外键不能删除。针对这种情况,可以考虑使用触发器。
创建触发器,删除用户表中用户时,会自动先删除订单表中的订单



  CREATE TRIGGER TR_Tse_DelUser
ON Tse_User
INSTEAD OF DELETE  --代替默认的删除
AS
BEGIN
SET NOCOUNT ON
DELETE FROM Tse_Order WHERE UserID IN (SELECT UserID FROM Deleted)
DELETE FROM Tse_User WHERE UserID IN (SELECT UserID FROM Deleted)
  END
     使用触发器,添加订单时,产品表库存相应减少



CREATE TRIGGER TR_Tse_ADDOrder
ON Tse_Order
AFTER INSERT
AS
BEGIN
UPDATE Tse_Product SET Storage = Storage - (SELECT Number FROM INSERTED)
WHERE ProductID IN (SELECT ProductID FROM INSERTED)
  END
  关于SQL定时作业部门的介绍,请看“工作经常使用的SQL整理,实战篇(三)”~
  如果您有什么问题,欢迎在下面评论,我们一起讨论,谢谢~
  如果您觉得还不错,不妨点下右下方的推荐,有您的鼓励我会继续努力的~

  


  

运维网声明 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-80879-1-1.html 上篇帖子: Sql Server之旅——第三站 解惑那些背了多年聚集索引的人 下篇帖子: SQL Server的 排序规则(collation)冲突和解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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