图片 8

SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML

触发器是数据库应用中的重用工具,它的应用很广泛,这几天写一个化学数据统计方面的软件,需要根据采样,自动计算方差,在这里,我使用了触发器。
下面我摘录了SQL
Server官方教程中的一段关于触发器的文字,确实有用的一点文字描述。

1 创建和操纵表(CREATE)

1、SQL INSERT INTO 语句(在表中插入)

INSERT INTO 语句用于向表中插入新记录。

______________________________________________________________________________________________________________

1.1 创建表CREATE

利用CREATE TABLE创建表,需给出以下信息:

  1. 新表的名字,在关键字CREATE TABLE之后给出。
  2. 表列的名字和定义,用逗号分隔。
  3. 有的DBMS还要求指定表的位置。

创建产品Products表:

CREATE TABLE Products
(
 prod_id      char(10)       NOT NULL ,
 vend_id      char(10)       NOT NULL ,
 prod_name    char(255)      NOT NULL ,
 prod_price   decimal(8,2)   NOT NULL ,
 prod_desc    text           NULL 
);

图片 1

添加默认值的时候,使用关键字DEFAULT。

创建订单明细OrderItems表:

CREATE TABLE OrderItems
(
 order_num    int             NOT NULL ,
 order_item   int             NOT NULL ,
 prod_id      char(10)        NOT NULL ,
 quantity     int             NOT NULL      DEFAULT 1,
 item_price   decimal(8,2)    NOT NULL 
);

图片 2


SQL INSERT INTO 语法

INSERT INTO 语句可以用两种形式编写。
第一个表单没有指定要插入数据的列的名称,只提供要插入的值:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中的列顺序相同。INSERT
INTO语法如下所示:

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

可以定义一个无论何时用INSERT语句向表中插入数据时都会执行的触发器。

1.2 更新表ALTER

利用ALTER TABLE更新表,要考虑:

  1. 理想情况下,不要在表中包含数据的时候对其进行更新,应该在创建表的时候,考虑未来的扩展性,避免对表的结构做大改动。
  2. 所有的DBMS都允许对现有表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。
  3. 多数DBMS允许重命名表中的列,不允许删除或更改表中的列。

给供应商Vendors表添加vend_phone列:

ALTER TABLE Vendors
ADD vend_phone CHAR(20);

图片 3

删除供应商Vendors表的vend_phone列:

ALTER TABLE Vendors
DROP COLUMN vend_phone;

图片 4


演示数据库

以下是”Customers” 表中的数据:

CustomerID CustomerName ContactName Address City PostalCode Country
87 Wartian Herkku Pirkko Koskitalo Torikatu 38 Oulu 90110 Finland
88 Wellington Importadora Paula Parente Rua do Mercado, 12 Resende 08737-363 Brazil
89 White Clover Markets Karl Jablonski 305 – 14th Ave. S. Suite 3B Seattle 98128 USA
90 Wilman Kala Matti Karttunen Keskuskatu 45 Helsinki 21240 Finland
91 Wolski Zbyszek ul. Filtrowa 68 Walla 01-012 Poland

当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。

2 插入数据(INSERT)

INSERT INTO 实例代码

假设我们想在”Customers”表中插入一个新行。

我们可以使用以下SQL语句:

日志记录了所有修改数据的动作(INSERT、UPDATE和DELETE语句),但在事务日志中的信息是不可读的。然而,inserted表允许你引用由INSERT语句引起的日志变化,这样就可以将插入数据与发生的变化进行比较,来验证它们或采取进一步的动作。也可以直接引用插入的数据,而不必将它们存储到变量中。

2.1 数据插入

INSERT用来将行插入(或添加)到数据库表。

插入有几种方式:

  1. 插入完整的行。
  2. 插入行的一部分。
  3. 插入某些查询的结果。

实例

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway');

现在,选自 “Customers” 表的数据如下所示:

CustomerID CustomerName ContactName Address City PostalCode Country
87 Wartian Herkku Pirkko Koskitalo Torikatu 38 Oulu 90110 Finland
88 Wellington Importadora Paula Parente Rua do Mercado, 12 Resende 08737-363 Brazil
89 White Clover Markets Karl Jablonski 305 – 14th Ave. S. Suite 3B Seattle 98128 USA
90 Wilman Kala Matti Karttunen Keskuskatu 45 Helsinki 21240 Finland
91 Wolski Zbyszek ul. Filtrowa 68 Walla 01-012 Poland
92 Cardinal Tom B. Erichsen Skagen 21 Stavanger 4006 Norway

 

2.2 插入完整的行

INSERT指定表名和插入到新行中的值。

INSERT INTO Customers
VALUES('1000000006','Toy Land','123 Any Street',
       'New York','NY','11111','USA',NULL,NULL);

图片 5

插入数据时,各列必须以它们在表定义中出现的次序填充。

上面的SQL语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全的。

实际上,在插入数据的时候,最好给出填充列的顺序。

INSERT INTO Customers(cust_id,cust_contact,cust_email,
                      cust_name,cust_address,cust_city,
                      cust_state,cust_zip)
VALUES('1000000006',NULL,NULL,'Toy Land','123 Any Street',
       'New York','NY','11111');

图片 6

注意:不管使用哪种INSERT语法,VALUES的数目都必须正确。


仅在指定的列中插入数据

我们还可以只在指定的列中插入数据。

以下SQL语句插入一个新行,但只在“CustomerName”、“City”和“Countryn”列中插入数据(CustomerID字段将自动更新):

示例

2.3 插入部分行

插入部分行,表示可以只给某些列提供值,其他列不提供值。

INSERT INTO Customers(cust_id,cust_name,cust_address,
                      cust_city,cust_state,cust_zip)
VALUES('1000000006','Toy Land','123 Any Street',
       'New York','NY','11111');

图片 7

省略的列必须满足以下某个条件:

  1. 该列定义为允许NULL值(无值或空值)。
  2. 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

实例

INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');

现在,选自 “Customers” 表的数据如下所示:

CustomerID CustomerName ContactName Address City PostalCode Country
87 Wartian Herkku Pirkko Koskitalo Torikatu 38 Oulu 90110 Finland
88 Wellington Importadora Paula Parente Rua do Mercado, 12 Resende 08737-363 Brazil
89 White Clover Markets Karl Jablonski 305 – 14th Ave. S. Suite 3B Seattle 98128 USA
90 Wilman Kala Matti Karttunen Keskuskatu 45 Helsinki 21240 Finland
91 Wolski Zbyszek ul. Filtrowa 68 Walla 01-012 Poland
92 Cardinal null null Stavanger null Norway

在本例中,将创建一个触发器。无论何时订购产品(无论何时向Order
Details表中插入一条记录),这个触发器都将更新Products表中的一列(UnitsInStock)。用原来的值减去订购的数量值即为新值。

2.4 插入检索出的数据

INSERT可以将SELECT语句的查询结果插入表中,这就是所谓的INSERT
SELECT。它由一条INSERT语句和一条SELECT语句组成。

假如想把另一个表中的顾客列合并到Customers表中。

INSERT INTO Customers(cust_id,cust_contact,cust_email,
                      cust_name,cust_address,cust_city,
                      cust_state,cust_zip,cust_country)
SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,
       cust_city,cust_state,cust_zip,cust_country
FROM CustNew;

图片 8

INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。

INSERT通常只插入一行,需要插入多行,必须执行多个INSERT语句。INSERT
SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。