工作经常使用的SQL整理,实战篇(二)

原文:工作经常使用的SQL整理,实战篇(二)[原创]

工作经常使用的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整理,实战篇(三)”~

  如果您有什么问题,欢迎在下面评论,我们一起讨论,谢谢~

  如果您觉得还不错,不妨点下右下方的推荐,有您的鼓励我会继续努力的~

 

 

 

 

 

 

时间: 2024-11-16 10:48:29

工作经常使用的SQL整理,实战篇(二)的相关文章

工作经常使用的SQL整理,实战篇(一)

原文:工作经常使用的SQL整理,实战篇(一)[原创] 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三)   目录概览: 1.数据库 2.表 3.临时表 4.索引和约束 5.范式 6.增删改查 7.连接 8.分组和排序 9.通配符 10.视图 11.存储过程和事务 12.游标 13.触发器 14.作业   自己亲手编写的一些常用的SQL,希望对大家有用喔,废话不多说了,直接入正题~

工作经常使用的SQL整理,实战篇(三)

原文:工作经常使用的SQL整理,实战篇(三)[原创] 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇(三)   接着本系列前面两篇继续讨论. 有时候当你需要定时处理数据库数据时,你会怎么做呢?当然你可以手工编写一个程序去完成任务,但写程序既需要时间也需要考验程序的稳定性,这里,介绍一种快捷的方法,这里只介绍SQL SERVER数据库中建立作业的方法,其他数据库我相信也有这个功能. 14

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

jqGrid 学习笔记整理——进阶篇(一 )_jquery

 在浏览导航栏添加所需按钮 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>DEMO</title> <link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css" /> <link rel=

JBuilder9+Weblogic7实战篇之工具篇(JDBC 1)

JBuilder9+Weblogic7实战篇<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 工具篇(配置JDBC 1)                                                                              作者:黄 凯         E_mail:hk_sz@163.com Weblogic7中配置J

高可用的MongoDB集群-实战篇

1.概述 最近有同学和网友私信我,问我MongoDB方面的问题:这里我整理一篇博客来赘述下MongoDB供大家学习参考,博客的目录内容如下: 基本操作 CRUD MapReduce 本篇文章是基于MongoDB集群(Sharding+Replica Sets)上演示的,故操作的内容都是集群层面的,所以有些命令和单独的使用MongoDB库有异样.具体集群搭建可以参考我写的<高可用的MongoDB集群>. 2.基本操作 常用的 Shell 命令如下所示: db.help() # 数据库帮助 db.

菜鸟也能飞:SQL数据库实战专业教程(三)

七.详细设计 详细设计还得从数据库开始.作为专业菜鸟,我们要把所有的SQL语句都放在存储过程当中,不要放在程序里.这样做的好处是:容易修改.维护,执行速度快.减少数据传输量.存储过程可以简单的理解为在SQL服务器上创建小函数,它们有名字.参数,通过调用这些小函数,我们可以完成对表的增.删.查.改操作,相当于把SQL语句放在了服务器上,并且是经过编译的,执行速度快.在程序中,我们不必再写复杂的SQL语句,直接写存储过程名称就可以了. 具体如何使用存储过程,可以参考这篇博文:http://www.5

学习 ASP.NET MVC (第三回)实战篇

本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回)实战篇 学习 ASP.NET MVC (第五回)理论篇 创建Controllers和Views我们再次回顾下ASP.NET MVC的基本工作流程:URL-->Controller(会执行一个方法Action)-->从数据库中获取一个Model对象-->将Model作为ViewData传递给V

关于下载GAE High Replication Datastore数据[实战篇]下

通过bulk loader可以批量上传下载数据,GAE支持xml,csv格式数据批量上传,以及xml,csv和文本 格式下载. 你可以选择自动生成一个bulkloader.yaml,或者手动编码来写一个bulk loader.谷歌不推荐手动编 写,个人也觉得自动生成才是王道. 如何自动生成bulkloader.yaml bulkloader.yaml是一个描述数据格式的配置文件,格式例如xml或csv.bulk loader进行数据导入时 需要这个配置文件来将外部数据(xml或csv)转换为中间