《SQL必知必会》笔记三:15-17课

三、插入、更新、删除数据与创建和操纵表

3.1 插入数据

INSERT 用来将行插入(或添加)到数据库表。插入有几种方式:
   插入完整的行;
   插入行的一部分;
   插入某些查询的结果。
/*列名应与VALUES中的值相对应*/
INSERT INTO Customers(cust_id, 
 cust_name, 
 cust_address, 
 cust_city, 
 cust_state, 
 cust_zip, 
 cust_country, 
 cust_contact, 
 cust_email) 
VALUES('1000000006', 
 'Toy Land', 
 '123 Any Street', 
 'New York', 
 'NY', 
 '11111', 
 'USA', 
 NULL, 
 NULL);

 

如果表的定义允许,则可以在 INSERT 操作中省略某些列。省略的列必须满足以下某个条件。
   该列定义为允许 NULL 值(无值或空值)。
   在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果表中不允许有 NULL 值或者默认值,这时却省略了表中的值,DBMS 就会产生错误消息,相应的行不能成功插入。
 
/*INSERT可以和SELECT语句一起使用。
INSERT SELECT 中 SELECT 语句可以包含 WHERE 子句,以过滤插入的数据。*/
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;
INSERT 通常只插入一行。要插入多行,必须执行多个 INSERT 语句。
INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被 INSERT 插入。

 

/*与 INSERT SELECT 将数据添加到一个已经存在的表不同,SELECT INTO将数据复制到一个新表*/
/*这条 SELECT 语句创建一个名为 CustCopy 的新表,并把 Customers 表的整个内容复制到新表中*/
SELECT * 
INTO CustCopy 
FROM Customers;

/*SELECT INTO 是试验新 SQL 语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试 SQL 代码,而不会影响实际的数据。*/

 

3.2 更新数据

有两种使用 UPDATE的方式:
   更新表中的特定行;
   更新表中的所有行。
基本的 UPDATE 语句由三部分组成,分别是:
   要更新的表;
   列名和它们的新值;
   确定要更新哪些行的过滤条件。
/*更新单列*/
UPDATE Customers 
SET cust_email = 'kim@thetoystore.com' 
WHERE cust_id = '1000000005';

/*更新多个列*/
UPDATE Customers 
SET cust_contact = 'Sam Roberts', 
 cust_email = 'sam@toyland.com' 
WHERE cust_id = '1000000006';

/*要删除某列的值,可以设为NULL*/
UPDATE Customers 
SET cust_email = NULL 
WHERE cust_id = '1000000005';

 

3.3 删除数据

有两种使用 DELETE的方式:
   从表中删除特定的行;
   从表中删除所有行。
/*删除某行*/
DELETE FROM Customers 
WHERE cust_id = '1000000006';
DELETE 不需要列名或通配符。DELETE 删除整行而不是删除列。要删除指定的列,请使用 UPDATE 语句。
DELETE 语句从表中删除行,甚至是删除表中所有行。但是,DELETE不删除表本身。
 
下面是许多 SQL 程序员使用 UPDATE 或 DELETE 时所遵循的重要原则。
   除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。
   保证每个表都有主键,尽可能像 WHERE 子句那样使用它(可以指定各主键、多个值或值的范围)。
   在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
   使用强制实施引用完整性的数据库,这样 DBMS 将不允许删除其数据与其他表相关联的行。
   有的 DBMS 允许数据库管理员施加约束,防止执行不带 WHERE 子句的 UPDATE 或 DELETE 语句。如果所采用的 DBMS 支持这个特性,应该使用它。

 

3.4 创建表

一般有两种创建表的方法:
   多数 DBMS 都具有交互式创建和管理数据库表的工具;
   表也可以直接用 SQL 语句操纵。
 
利用 CREATE TABLE 创建表,必须给出下列信息:
   新表的名字,在关键字 CREATE TABLE 之后给出;
   表列的名字和定义,用逗号分隔;
   有的 DBMS 还要求指定表的位置。
 
/*创建表Products*/
CREATE TABLE Products 
( 
 prod_id    CHAR(10)      NOT NULL, 
 vend_id    CHAR(10)      NOT NULL, 
 prod_name  CHAR(254)     NOT NULL, 
 prod_price DECIMAL(8,2)  NOT NULL, 
 prod_desc  VARCHAR(1000) NULL 
);
/*在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表,SQL 要求首先手工删除该表(请参阅后面的内容),然后再重建它,而不是简单地用创建表语句覆盖它。*/
/*给定默认值*/
CREATE TABLE OrderItems 
( 
 order_num  INTEGER      NOT NULL, 
 order_item INTEGER      NOT NULL, 
 prod_id    CHAR(10)     NOT NULL, 
 quantity   INTEGER      NOT NULL   DEFAULT 1, 
 item_price DECIMAL(8,2) NOT NULL 
);

 

3.5 更新表

以下是使用 ALTER TABLE 时需要考虑的事情。
   理想情况下,不要在表中包含数据时对其进行更新。应该在表的设计过程中充分考虑未来可能的需求,避免今后对表的结构做大改动。
   所有的 DBMS 都允许给现有的表增加列,不过对所增加列的数据类型(以及 NULL 和 DEFAULT 的使用)有所限制。
   许多 DBMS 不允许删除或更改表中的列。
   多数 DBMS 允许重新命名表中的列。
   许多 DBMS 限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。
 
使用 ALTER TABLE 更改表结构,必须给出下面的信息:
   在 ALTER TABLE 之后给出要更改的表名(该表必须存在,否则将出错);
   列出要做哪些更改。
/*增加列*/
ALTER TABLE Vendors 
ADD vend_phone CHAR(20);
 
复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
  (1) 用新的列布局创建一个新表;
  (2) 使用 INSERT SELECT 语句从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段;
  (3) 检验包含所需数据的新表;
  (4) 重命名旧表(如果确定,可以删除它);
  (5) 用旧表原来的名字重命名新表;
  (6) 根据需要,重新创建触发器、存储过程、索引和外键。

 

3.6 删除表

DROP TABLE CustCopy;

 

 

 

posted @ 2022-03-11 16:06  零纪年  阅读(35)  评论(0编辑  收藏  举报