数据更新大概就以下三个函数
名称 | 函数 |
---|---|
插入 | INSERT |
更新 | UPDATE |
删除 | DELETE |
具体用法参考下列例题的解题中
以下例题都在Northwind(北风)数据库的基础上进行操作,该数据库资源很多,请自行下载
名称 | 信息 |
---|---|
出生日期 | 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
客户 | 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
分析题意
首先我们需要查询出东部地区业绩最好的员工,接着先删除业绩最好的员工负责的地区,再插入让业绩最好的员工负责南部地区,同时让新员工也来负责南部地区。至于为什么先删除后插入而不是通过数据更新来处理,那就应该从地区这张表来说起了,负责人负责某个地区指的是负责整个地区的所有区域,而不是其中的某个区域。这里的东部地区和南部地区可能区域数会不同,所以先删再插入。
解题如下
--同样的,我们需要先查询出东部业绩最好的员工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
一家之言
如有疏漏,还请指出,希望一同进步