【从Northwind学习数据库】数据更新

【从Northwind学习数据库】数据更新

前言

数据更新大概就以下三个函数

名称 函数
插入 INSERT
更新 UPDATE
删除 DELETE

具体用法参考下列例题的解题中

以下例题都在Northwind(北风)数据库的基础上进行操作,该数据库资源很多,请自行下载

例题

1.最近新公司新进一名销售代表(Sales Representative)“Susan Huak”女士,请你为她登记相关信息

名称 信息
出生日期 1979-1-8
入职日期 2013-7-1
来自 美国的“Seattle”区,现住“3356 - 9th Ave. S.E.”
电话 (206) 322-4435

“Andrew”是她的上司,她需要向“Andrew”报告她的销售业绩。

分析题意

公司新来一名员工,那么肯定在员工表进行操作,在一些未知的地方需要进行查询操作

解题如下

--首先在左侧的对象资源管理器中找到要进行操作的表格
--右键编写表脚本为INSERT到剪贴板,然后粘贴到创建的查询中
--INSERT INTO 后面的是你插入信息的表格对应的列,此处可以删去不插入信息的列,会自动生成 NULL
--注意,此处没有对应的主码信息,因为单主码的表格无法人为干预主码
INSERT INTO [Northwind].[dbo].[Employees]
           ([LastName]
           ,[FirstName]
           ,[Title]
           ,[TitleOfCourtesy]
           ,[BirthDate]
           ,[HireDate]
           ,[Address]
           ,[City]
           ,[Region]
           ,[PostalCode]
           ,[Country]
           ,[HomePhone]
           ,[Extension]
           ,[Photo]
           ,[Notes]
           ,[ReportsTo]
           ,[PhotoPath])
-- VALUES后面是你插入上述列的对应信息,若有某个信息当前为空可直接输入NULL(注意NULL不要有引号)           
     VALUES
           ('Hauk'
           ,'Susan'
		   ,'Sales Representative'
           ,'Mrs.'
           --时间要有引号,不然会进行减法运算,别问我怎么知道的
		   ,'1979-1-8'
		   ,'2013-7-1'
		   ,'3356-9th Ave.S.E'
		   ,'Seattle'
		   --根据之前我们对表格的了解,此处的Region应该与前面的城市相对应,所以进行了以下的查询
           ,
           (SELECT DISTINCT Region
           FROM Employees
           WHERE City = 'Seattle')
           ,NULL
           ,'USA'
           ,'(206)322-4435'
           ,NULL
           ,NULL
           ,NULL
           --此处的Reports to是指向谁报告,对应的是上司的EmployeeID
           ,
           (SELECT EmployeeID 
			FROM Employees
			WHERE FirstName = 'Andrew'
			OR LastName = 'Andrew')
           ,NULL)
GO

2.下面这笔订单是由“Andrew”拿到的,要求一个月内完成订单,并由“United Package”承运,将这条信息输入到数据库

客户 Centro commercial Moctezuma 订购日期 2013-6-28
装运 按原客户送达地点完成装运送达。运费:80.00
产品 单价 数量 折扣率
Gravad lax 25.80 50 0.15
Chocolade 13.00 300 0.20

分析题意

首先前两行的数据在Orders表中,而后两行的数据却在Products表中,如何同时插入两个表格中的数据并保证自动生成的ID能填充到关联表格中呢?此处就要用到一个全局变量了,那就是 @@INDENTITY

@@IDENTITY:返回上次插入表格的ID值

解题如下

--解题到一半时你会发现,后面一堆ship开头的信息都是老客户上次的信息
--如果每个都查询一遍,那么效率实在太低太低
--因此我们定义一些全局变量,让那些信息一次性查询出来
--nvarchar()是变长的Unicode编码的字符串,多出来的空间会删去
DECLARE @ShipName nvarchar(50)
DECLARE @ShipAddress nvarchar(50)
DECLARE @ShipCity nvarchar(50)
DECLARE @ShipCountry nvarchar(50)
DECLARE @ShipRegion nvarchar(50)
DECLARE @ShipPostalCode nvarchar(50)
--TOP 1是为了取最近一次的订单信息
SELECT TOP 1 
@ShipName = ShipName,
@ShipAddress = ShipAddress,
@ShipCity = ShipCity,
@ShipRegion = ShipRegion,
@ShipPostalCode = ShipPostalCode,
@ShipCountry = ShipCountry
FROM Orders 
WHERE CustomerID IN
(SELECT CustomerID
FROM Customers
WHERE CompanyName = 'Centro comercial Moctezuma')
ORDER BY OrderDate DESC
--插入第一张表格的信息,相关查询的注释略去,请自行理解
INSERT INTO [Northwind].[dbo].[Orders]
           ([CustomerID]
           ,[EmployeeID]
           ,[OrderDate]
           ,[RequiredDate]
           ,[ShippedDate]
           ,[ShipVia]
           ,[Freight]
           ,[ShipName]
           ,[ShipAddress]
           ,[ShipCity]
           ,[ShipRegion]
           ,[ShipPostalCode]
           ,[ShipCountry])
     VALUES
           (
           (SELECT CustomerID
           FROM Customers
           WHERE CompanyName = 	
           'Centro comercial Moctezuma')
           ,
           (SELECT EmployeeID
           FROM Employees
           WHERE LastName = 'Andrew' OR FirstName = 'Andrew')
           ,'2013-6-28'
           ,DATEADD(MONTH,1,'2013-6-28')
           ,NULL
           ,
           (SELECT ShipperID
           FROM Shippers
           WHERE CompanyName = 'United Package')
           ,80
           ,@ShipName
           ,@ShipAddress
           ,@ShipCity
           ,@ShipRegion
           ,@ShipPostalCode
           ,@ShipCountry)
           
GO
DECLARE @OrderID nvarchar(50)
SET @OrderID=@@IDENTITY
INSERT INTO [Northwind].[dbo].[Order Details]
           ([OrderID]
           ,[ProductID]
           ,[UnitPrice]
           ,[Quantity]
           ,[Discount])
     VALUES
           (@OrderID
           ,
           (SELECT ProductID
           FROM Products
           WHERE ProductName = 'Gravad lax')
           ,25.80
           ,50
           ,0.15)
           ,@OrderID
           ,
           (SELECT ProductID
           FROM Products
           WHERE ProductName = 'Chocolade')
           ,13.00
           ,300
           ,0.20)
GO

3.由于南部地区(Region)的销售人员人手不够,将负责东部地区业绩最好的员工派往南区负责,并且将新来的“Susan Huak”也派往南部地区负责

分析题意

首先我们需要查询出东部地区业绩最好的员工,接着先删除业绩最好的员工负责的地区,再插入让业绩最好的员工负责南部地区,同时让新员工也来负责南部地区。至于为什么先删除后插入而不是通过数据更新来处理,那就应该从地区这张表来说起了,负责人负责某个地区指的是负责整个地区的所有区域,而不是其中的某个区域。这里的东部地区和南部地区可能区域数会不同,所以先删再插入。

解题如下

--同样的,我们需要先查询出东部业绩最好的员工ID放到后面用,所以先定义全局变量
DECLARE @EmployeeID nvarchar(50)
SELECT TOP 1 @EmployeeID=E.EmployeeID
FROM Employees E
JOIN Orders O ON E.EmployeeID = O.EmployeeID
JOIN [Order Details] OD ON O.OrderID = OD.OrderID
WHERE City IN 
		(SELECT TerritoryDescription FROM Territories
		WHERE RegionID = 
		(SELECT RegionID FROM Region
		WHERE RegionDescription = 'Western'))
--此处我们需要让查询出来的那个人不是新员工(虽然这并不实际,但上司转给她的实在是太多了)
AND FirstName != 'Susan'
GROUP BY E.EmployeeID
ORDER BY SUM(UnitPrice*Quantity*(1-Discount))DESC
--删除业绩最好的员工的负责区域信息
DELETE
FROM EmployeeTerritories
WHERE EmployeeID = @EmployeeID
--插入业绩最好的员工的负责区域信息
--这里我细说一下,员工负责区域这张表为双主码的表,所以当两个主码都相同时才能确定一条信息
--也就是说,这个主码是可以更改的,只不过改后不能两行的两个主码都相同
INSERT INTO [Northwind].[dbo].[EmployeeTerritories]
           ([EmployeeID]
           ,[TerritoryID])
     --这里是批量插入,需要原表和插入表的信息格式相同
     --下面我使用查询来把所需信息变成一张新的表格,并且查询出我想要的信息
     SELECT E,TerritoryID
     FROM (SELECT @EmployeeID AS E,TerritoryID
           FROM Territories
           WHERE RegionID IN
           (SELECT RegionID
           FROM Region
           WHERE RegionDescription = 'Southern'))AS A
GO
--以下为插入新员工的负责区域信息,操作基本同上
DECLARE @EmployeeID nvarchar(50)
SELECT @EmployeeID = EmployeeID FROM Employees
WHERE FirstName = 'Susan'

INSERT INTO [Northwind].[dbo].[EmployeeTerritories]
           ([EmployeeID]
           ,[TerritoryID])
		   SELECT EI,TerritoryID
		   FROM (SELECT @EmployeeID EI,TerritoryID
		   		FROM Territories
		   		WHERE RegionID IN
		   		(SELECT RegionID
		   		FROM Region
		   		WHERE RegionDescription = 'Southern'))AS B
		
GO

结尾

一家之言
如有疏漏,还请指出,希望一同进步

你可能感兴趣的:(数据库,sql,数据库)