SQL必知必会 第四篇

第十五课

        这一课介绍如何利用SQL的INSERT语句将数据插入表中

        主要代码如下:

select *
into Custcopy
from Customers;
insert into Custcopy(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 into Custcopy(cust_id,
					 cust_name,
					 cust_address,
					 cust_city,
					 cust_state,
					 cust_zip,
					 cust_country)
values('1000000006',
	   'Toy Land',
	   '123 Any Street',
	   'New York',
	   'NY',
	   '11111',
	   'USA');
insert into Custcopy(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;

        1. INSERT用来将行插入(或添加)到数据库表中,插入有几种方式

  • 插入完整的行
  • 插入行的一部分
  • 插入某些查询的结果

        2. 使用INSERT语句可能需要客户端/服务器DBMS中特定的安全权限

        3. 在提供列名时,VALUES必须以指定的次序匹配指定的列名,必须给列出的每一个列一个值

        4. 如果表的定义允许,可以在INSERT操作中省略某些列,省略的列必须满足如下条件

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

        5. 如果表中不允许有NULL值或者默认值,这时却省略了表中的值,会发生错误

        6. 在INSERT SELECT语句中,只关心列的位置而不关心列名,两个表的主键值不能重复,SELECT语句可以包含WHERE语句用于过滤

        7. SELECT INTO语句可以把一个表的内容复制到一个新表

        8. 使用SELECT INTO时,应该注意

  • 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY
  • 可使用联结从多个表中插入数据
  • 不管从多少个表中插入数据,数据都只能插入到一个表中

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

小结:这一课介绍了如何将行插入到数据库表中。我们学习了如何使用INSERT的几种方法,为什么要明确使用列名,如何用INSERT SELECT从其他表中导入行,如何用SELECT INTO将行导出到一个新表


第十六课

        这一课介绍如何利用UPDATE和DELETE语句进一步操作表数据

        主要代码如下:

update custcopy
set cust_email = '[email protected]'
where cust_id = '1000000005';
update custcopy
set cust_contact = 'Sam Roberts',
    cust_email = '[email protected]'
where cust_id = '1000000006';
update custcopy
set cust_email = null
where cust_id = '1000000005';
delete from Custcopy
where cust_id = '1000000006';

        1. 更新(修改)表中的数据,可以使用UPDATE语句,有两种使用的方式

  • 更新表中的特定行
  • 更新表中的所有行

        2. 在使用UPDATE语句前,一定要细心,不要省略WHERE子句

        3. 使用UPDATE前,保证自己有足够的安全权限

        4. 基本的UPDATE语句由三部分组成,分别是

  • 要更新的表
  • 列名和它们的新值
  • 确定要更新哪些行的过滤条件

        5. 在UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据

        6. 要删除某个列的值,可设置它为NULL(假如表定义允许NULL值)

        7. 有的SQL实现支持在UPDATE语句中使用FROM子句,用一个表的数据更新另一个表的行

        8. 从一个表中删除(去掉)数据,使用DELETE语句,有两种使用的方式

  • 从表中删除特定的行
  • 从表中删除所有行

        9. 在使用DELETE语句前,一定要细心,不要省略WHERE子句

        10. 使用DELETE前,保证自己有足够的安全权限

        11. 外键可以确保引用的完整性,DBMS通常可以防止删除某个关系需要用到的行

        12. DELETE语句从表中删除行,甚至删除所有行,但不删除表本身

        13. 如果想从表中删除所有行,不要使用DELETE,可以使用更快的TRUNCATE TABLE

        14. 下面是一些使用UPDATE或DELETE时所遵循的重要原则

  • 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句
  • 保证每个表都有主键,尽可能像WHERE子句那样使用它
  • 在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录
  • 使用强制实施引用完整性的数据库
  • 有的DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的DELECT或UPDATE语句

小结:这一课讲述了如何使用UPDATE和DELETE语句处理表中的数据。我们学习了这些语句的语法,知道了它们可能存在的危险,了解了为什么WHERE子句对UPDATE和DELETE语句很重要,还学习了为保证数据安全而应该遵循的一些指导原则


第十七课

        这一课讲授创建,更改和删除表的基本知识

        主要代码如下:

create table products1
(
    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(100) NULL
);
create table orders1
(
    order_num    INTEGER    NOT NULL,
	order_date   DATETIME   NOT NULL,
	cust_id      CHAR(10)   NOT NULL
);
create table vendors1
(
    vend_id       CHAR(10)    NOT NULL,
	vend_name     CHAR(50)    NOT NULL,
	vend_address  CHAR(50)    ,
	vend_city     CHAR(50)    ,
	vend_state    CHAR(5)     ,
	vend_zip      CHAR(10)    ,
	vend_countyr  CHAR(50)    
);
create table orderitems1
(
    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
);
alter table vendors1
add vend_phone CHAR(20);
alter table vendors1
drop column vend_phone;
drop table custcopy;

        1. 利用CREATE TABLE创建表,必须给出下列信息:

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

        2. 代码安排在多个行上,列定义进行了恰当的缩进,更易阅读和编辑

        3. 在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表,SQL要求首先手工删除该表

        4. 在不指定NOT NULL时,多数DBMS认为指定的是NULL,但不是所有的DBMS都这样

        5. 只有不允许NULL的列可以作为主键,允许NULL值的列不能作为唯一标识

        6. NULL值是没有值,不是空字符串,不是' '

        7. SQL允许指定默认值,在插入行时如果不给出值,DBMS将自动采用默认值。默认值在CREATE TABLE语句的列定义中用关键字DEFAULT指定

        8. 默认值通常用于日期或时间戳列

        9. 更新表定义,可以使用ALTER TABLE语句。不同的DBMS所允许更新的内容差别很大,下面是使用ALTER TABLE时需要考虑的事情

  • 理想情况下,不要在表中包含数据时对其进行更新。在表的设计过程中充分考虑未来可能的需求
  • 所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制
  • 多数DBMS不允许删除或更改表中的列
  • 多数DBMS允许重新命名表中的列
  • 许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制

        10. 对表的结构能进行何种更改,请参阅具体的DBMS文档

        11. 使用ALTER TABLE更改表结构,必须给出下面的信息

  • 在ALTER TABLE之后给出要更改的表名(该表必须存在)
  • 列出要做哪些更改

        12. 复杂的表结构更改一般需要手动删除过程,它涉及以下步骤

  • 用新的列布局创建一个新表
  • 使用INSERT SELECT语句从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段
  • 检验包含所需数据的新表
  • 重命名旧表
  • 用旧表原来的名字重命名新表
  • 根据需要,重新创建触发器、存储过程、索引和外键

        13. 使用ALTER TABLE时要极为小心,应该在改动前做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似的,如果删除了不应该删除的列,可能会丢失该列中的所有数据

        14. 删除表非常简单,使用DROP TABLE语句即可

        15. 如果可以,使用关系规则防止意外删除

        16. 所有重命名操作的基本语法都要求指定旧表名和新表名。不过,不同的DBMS实现存在差异,具体的语法要参阅文档

小结:这一课介绍了几条新的SQL语句。CREATE TABLE原来创建新表,ALTER TABLE用来更改表列(或其他诸如约束或索引等对象),而DROP TABLE用来完整地删除一个表。这些语句必须小心使用,并且应该在备份后使用。由于这些语句的语法在不同的DBMS中有所不同,所以更详细的信息请参阅相应的DBMS文档





猜你喜欢

转载自blog.csdn.net/weixin_42048278/article/details/80205809