丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

9. 添加、修改和删除数据记录

本章主题

l        添加数据记录 INSERT

l        修改数据记录 UPDATE

l        删除数据记录 DELETE

 

SQl语言必学部分!这一章内容非常重要!!★★★

 

与我的学生共勉:比金钱重要的是时间,比时间重要的是时机,比时机重要的是你要抓住时机的决心,动力和准备!            

9.1. 101   添加数据记录

9.1.1. INSERT …VALUES单行插入一条记录

注:插入的数据除了必须与数据与数据类型相符合外,还不能违反表的各项约束,否则插入操作将会失败。

 

范例1:先建立表,然后增加记录,最后显示记录并删除表。

/* 档案名称: Demo991.sql */

USE NorthwindSQL

SET DATEFORMAT mdy

 

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

        WHERE TABLE_NAME = 'MyTable')

    DROP TABLE MyTable

 

-- 建立资料表

CREATE TABLE MyTable

(

姓名 nvarchar(12),

性别 bit,

出生日期 datetime,

联络地址 nvarchar(60),

电话号码 nvarchar(16),

薪资 money

)

 

-- 新增资料记录

INSERT MyTable    --大家喜欢INSERT INTO MyTable 这种写法吗?

  (姓名,性别,出生日期,联络地址,电话号码,薪资)

  VALUES

  (

   '章立民',1,'09/26/1967',

   '台北市重庆南路 100 ','(02)2345-0988',32000.00

  )

 

INSERT MyTable  --还是INSERT INTO MyTable好看些~J

  (姓名,性别,出生日期,联络地址,电话号码,薪资)

  VALUES

  (

   '郭子仪',1,'02/18/1963',

   '桃园市中山路 10 ','(04)234-2929',42000.00

  )

 

INSERT MyTable

  (姓名,性别,出生日期,联络地址,电话号码,薪资)

  VALUES

  (

   '叶蝉娟',0,'07/28/1969',

   '高雄市中正路 120 ','(03)234-9339',38000.00

  )

 

SELECT * FROM MyTable

DROP TABLE MyTable

 

1.        关键字NULL

如果某个字段允许NULL值,而且你希望将NULL值添加到该字段,请用NULL关键字作为数据值。

范例2:添加记录时,直接添加NULL值。

/* 档案名称: Demo992.sql */

USE NorthwindSQL

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

        WHERE TABLE_NAME = 'MyTable')

    DROP TABLE MyTable

 

-- 建立资料表

CREATE TABLE MyTable

  (姓名 nvarchar(12),电话号码 nvarchar(16) NULL)

 

-- 新增资料记录

INSERT MyTable (姓名,电话号码) VALUES ('章立民',NULL)

INSERT MyTable (姓名,电话号码) VALUES ('陈光友',NULL)

 

SELECT * FROM MyTable

DROP TABLE MyTable

2.        关键字DEFAULT

如果在使用INSERT命令时,使用DEFAULT关键字:

·          如果字段拥有默认值,SQL Server会将其默认值添加到字段中。

·          如果字段无默认值,而且该字段允许NULL值,SQL Server会将NULL值添加到字段中。

·          如果字段无默认值,而且该字段不允许NULL值,则INSERT失败。

范例3:添加记录时,使用DEFAULT关键字添加默认值。

/* 档案名称: Demo993.sql */

USE NorthwindSQL

SET DATEFORMAT mdy

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

        WHERE TABLE_NAME = 'MyTable')

    DROP TABLE MyTable

 

-- 建立资料表

CREATE TABLE MyTable

  (姓名 nvarchar(12) NULL,

   出生日期 nvarchar(16) NULL DEFAULT GETDATE())

 

-- 新增资料记录

INSERT MyTable (姓名,出生日期) VALUES ('章立民',DEFAULT)

INSERT MyTable (姓名,出生日期) VALUES (DEFAULT,DEFAULT)

INSERT MyTable (姓名,出生日期) VALUES ('陈光友','09/26/1997')

 

SELECT * FROM MyTable

DROP TABLE MyTable

 

3.        若仅添加部分字段的数据

如果在使用INSERT命令时,若仅添加部分字段的数据,则其余字段:

·          如果字段拥有默认值,SQL Server会将其默认值添加到字段中。

·          如果字段无默认值,而且该字段允许NULL值,SQL Server会将NULL值添加到字段中。

·          如果字段无默认值,而且该字段不允许NULL值,则INSERT失败。

 

4.        自动编号字段

对自动编号字段不需要也不能

 

9.1.2. INSERT …SELECT多行/已有的表

最大的特色是将查询结果直接存储到一个现有表中。

范例1:先创建一个“北区客户”表,然后从“客户”表查询所得的数据记录存入“北区客户”表中。

/* 档案名称: Demo996.sql */

USE NorthwindSQL

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

        WHERE TABLE_NAME = '北区客户')

   DROP TABLE 北区客户

 

CREATE TABLE 北区客户

(

客户编号 nvarchar(5) NOT NULL ,

公司名称 nvarchar(40) NOT NULL ,

连络人 nvarchar(30) NULL ,

连络人职称 nvarchar(30) NULL ,

地址 nvarchar(60) NULL ,

城市 nvarchar(15) NULL ,

行政区 nvarchar(15) NULL ,

邮递区号 nvarchar(10) NULL ,

国家地区 nvarchar(15) NULL ,

电话 nvarchar(24) NULL ,

传真电话 nvarchar(24) NULL

)

 

INSERT  北区客户

  SELECT * FROM 客户

    WHERE 城市 IN ('台北市','台北县','宜兰市','新竹市')

    ORDER BY 公司名称

 

SELECT * FROM 北区客户

 

DROP TABLE 北区客户

 

范例2:先将数据计算后再存入另外一个表中。

/* 档案名称: Demo997.sql */

USE NorthwindSQL

 

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

        WHERE TABLE_NAME = 'AnnualScore')

   DROP TABLE AnnualScore

 

CREATE TABLE AnnualScore

  (grade char(1),class char(2),score decimal(5,2))

 

INSERT AnnualScore

  SELECT grade,class,AVG(chinese+english)/2

    FROM stud87

    GROUP BY grade,class

    ORDER BY 1,3

 

INSERT AnnualScore

  SELECT grade,class,AVG(chinese+english)/2

    FROM stud88

    GROUP BY grade,class

    ORDER BY 1,3

 

INSERT AnnualScore

  SELECT grade,class,AVG(chinese+english)/2

    FROM stud89

    GROUP BY grade,class

    ORDER BY 1,3

 

SELECT * FROM AnnualScore

  ORDER BY 1,3

DROP TABLE AnnualScore

 

9.1.3. SELECT …INTO自动创建一张表

最大的特色:自动新建一个表,然后将查询结果存入其中。

/* 档案名称: Demo998.sql */

USE NorthwindSQL

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','TRUE'

 

SELECT产品,单价 INTO高于平均单价的产品

  FROM 产品资料

  WHERE 单价 >

        (SELECT AVG(单价) FROM 产品资料)

  ORDER BY 单价

 

SELECT * FROM 高于平均单价的产品

 

DROP TABLE 高于平均单价的产品

 

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','FALSE'

 

 

9.2. 修改数据记录

UPDATE MyTable SET name=’张三’;

注:UPDATE命令默认的更新范围为“所有”记录,除非用WHERE子句指定范围。

如:

UPDATE MyTable

  SET Salary=Salary-10000

  WHERE Salary>80000

 

范例1:将薪资低于平均薪资员工的薪资调成平均薪资:

/* 档案名称: Demo999.sql */

USE NorthwindSQL

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','TRUE'

 

SELECT * INTO 我的员工

  FROM 飞狐工作室

 

-- 将薪资低于平均薪资的员工,调薪至平均薪资

UPDATE我的员工  --看看下面,使用了子查询

  SET 目前薪资 = (SELECT AVG(目前薪资) FROM 我的员工)

  WHERE 目前薪资 < (SELECT AVG(目前薪资) FROM 我的员工)

 

SELECT姓名,目前薪资 FROM我的员工

 

DROP TABLE 我的员工

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','FALSE'

 

范例2:找出性别为男性且姓名为“许建仁”的员工,并将其姓名更改为“章立民”,目前薪资则更改成起薪的2.5倍。

/* 档案名称: Demo9100.sql */

USE NorthwindSQL

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','TRUE'

 

SELECT * INTO 我的员工

  FROM 飞狐工作室

 

UPDATE我的员工

  SET 姓名 = '章立民',

      目前薪资 = 起薪 * 2.5

  WHERE 姓名 = '许建仁' AND 性别 = 1  --假设1表示男性

 

DROP TABLE 我的员工

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','FALSE'

 

范例3:更新某列的表达式中用到了其它表的字段内容。

/* 档案名称: Demo9103.sql */

USE NorthwindSQL

SET NOCOUNT ON

 

CREATE TABLE MyTable1(id1 int PRIMARY KEY, number1 int)

CREATE TABLE MyTable2(id2 int PRIMARY KEY, number2 int,

                                           number3 int)

 

INSERT INTO MyTable1 VALUES (1, 10)

 

INSERT INTO MyTable2 VALUES (1, 20, 30)

INSERT INTO MyTable2 VALUES (2, 40, 60)

 

 

UPDATE MyTable1 SET number1 = MyTable2.number2 + MyTable2.number3

  FROM MyTable2 

--因为number1的值是MyTable2的字段值运算的结果

  WHERE MyTable2.id2 = 1  --指明限定条件

 

SELECT number1 FROM MyTable1

 

DROP TABLE MyTable1

DROP TABLE MyTable2

 

9.3. 删除数据记录

9.3.1. DELETE命令

DELETE MyTable  --将删除表MyTable中的所有记录但是表的结构不变

DELETE命令默认的删除范围是“所有”的数据记录,除非用WHERE子句指定范围。

如:

DELETE 飞狐工作室 WHERE 目前薪资<2000

 

范例1:将薪资为倒数十名且年龄在26岁以上的员工数据删除。

/* 档案名称: Demo9101.sql */

USE NorthwindSQL

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','TRUE'

SET NOCOUNT ON

 

SELECT * INTO 我的员工

  FROM 飞狐工作室

 

SELECT COUNT(*) FROM 我的员工

 

DELETE我的员工

  WHERE 目前薪资 IN (SELECT TOP 10 目前薪资 FROM 我的员工 ORDER BY 1)  AND  DATEDIFF(yyyy,出生日期,GETDATE()) >= 26

 

SELECT COUNT(*) FROM 我的员工

 

DROP TABLE 我的员工

EXEC sp_dboption 'NorthwindSQL','select into/bulkcopy','FALSE'

 

范例2:将未下过订单的客户数据删除。

/* 档案名称: Demo9105.sql */

USE NorthwindSQL

SET NOCOUNT ON

 

BEGIN TRANSACTION MyTransaction  --开始事务

SELECT COUNT(*) FROM 客户

 

DELETE客户

  WHERE 客户编号 NOT IN

      (SELECT DISTINCT 客户编号 FROM 订货主档)  --子查询

 

SELECT COUNT(*) FROM 客户

 

ROLLBACK TRANSACTION MyTransaction  --回滚事务

 

范例3:将年龄最大的10位员工数据删除:

/* 档案名称: Demo9106.sql */

USE NorthwindSQL

SET NOCOUNT ON

BEGIN TRANSACTION mytransaction    --开始事务

 

SELECT COUNT(*) FROM 飞狐工作室

 

DELETE飞狐工作室

 WHERE 飞狐工作室.身份证字号 IN

    (SELECT TOP 10 身份证字号 FROM 飞狐工作室 ORDER BY 出生日期)

 

SELECT COUNT(*) FROM 飞狐工作室

 

ROLLBACK TRANSACTION mytransaction   --回滚事务

9.3.2. TRUNCATE TABLE命令

格式:

TRUNCATE  TABLE 表名称

将表中的所有数据记录删除,但速度比DELETE命令快得多。

因为DELETE命令是一条一条删除记录,并且会将每一条被删除的记录存入事务日志(Transaction Log)中。而TRUNCATE TABLE命令直接重新配置表的数据页来删除数据,并且不记录入事务日志中。

DELETETRUNCATE TABLE命令只删除数据记录,并不将表的结构及相关对象删除,那么若想将表整个删除,用什么命令?

与我的学生共勉:大多数人想要改造这个世界,但却罕有人想改造自己。

温一军

 

9章 结束

 

posted on 2007-07-21 18:37  丁保国  阅读(361)  评论(0编辑  收藏  举报