T-SQL入门(三)——增删改(INSERT、DELETE、UPDATE)
创建了表之后之后的操作就是增删改查,但是查询需要用很大的篇幅描述,所以这次先写增删改。
一、插入
INSERT INTO 表名(字段1,字段2) VALUES(字段1的值,字段2的值)
VALUES后跟的值的顺序要和表名后的字段顺序相同,格式相同。
需要注意的是:所有不可为空的字段都要填写,不然添加不成功。
错误如下:
消息515,级别16,状态2,第1 行
不能将值NULL 插入列'tname',表'stuDB.dbo.student';列不允许有空值。INSERT 失败。字符类型、时间类型要加单引号'',数值类型不用。
上面的语句可以简化为
INSERT INTO 表名 VALUES(字段1的值,字段2的值……)
这种写法是要全部填写表中的字段,并顺序一一对应,不推荐这种写法。
现在往上次建立的student表中添加数据
INSERT INTO student(tname,tage,tInterTime) VALUES('张三',15,'2013-03-03 17:50:23')
多条插入一:
但是如果我要添加张三,李四,王五,是不是要写成下面这个样子?
INSERT INTO student(tname,tage,tInterTime) VALUES('张三',15,'2013-03-03 17:50:23')
INSERT INTO student(tname,tage,tInterTime) VALUES('李四',15,'2013-03-03 17:50:23')
INSERT INTO student(tname,tage,tInterTime) VALUES('王五',15,'2013-03-03 17:50:23')
INSERT INTO student(tname,tage,tInterTime) VALUES('李四',15,'2013-03-03 17:50:23')
INSERT INTO student(tname,tage,tInterTime) VALUES('王五',15,'2013-03-03 17:50:23')
有一个较为简单“点儿”的语法:
INSERT INTO student(tname,tage,tInterTime)
SELECT 'name1',15,'2013-03-03 17:50:23' UNION
SELECT 'name2',16,'2013-03-03 17:50:23' UNION
SELECT 'name3',17,'2013-03-03 17:50:23'
SELECT 'name1',15,'2013-03-03 17:50:23' UNION
SELECT 'name2',16,'2013-03-03 17:50:23' UNION
SELECT 'name3',17,'2013-03-03 17:50:23'
可以一次性插入多行。
sql server 2008中进行了增强,可以这样写:
INSERT INTO student(tname,tage,tInterTime) VALUES('name1',15,'2013-03-03 17:50:23'),('name2',16,'2013-03-03 17:50:23'),('name3',17,'2013-03-03 17:50:23')
但是在2005是不可以的。
多条插入二:
插入多条语句还有两个变种的语句,但涉及到了查询,所以就先说一下简单查询:
SELECT * FROM student --查询所有数据
SELECT tName,tAge,tInterTime FROM student --查询student表中的tName,tAge和tInterTiem字段
SELECT tName,tAge,tInterTime FROM student --查询student表中的tName,tAge和tInterTiem字段
这样就可以讲新的多条插入:
INSERT INTO student(tname,tage,tInterTime) SELECT tName,tAge,tInterTime FROM student
把查询出来的数据插入到student表中的对应字段中,这种插入可以把多个表的数据联合起来放入新表中,而且可以进行很大的数据流操作,很强大。
多条插入三:
第三种也是相当强大:
SELECT student.tName,student.tAge,student.tInterTime
INTO newstu
FROM student
INTO newstu
FROM student
可以创建新表newstu,然后把student表中的对应字段作为数据插入到新表中。
然后我们可以得到一个新表newstu,里面有所有student中的对应数据。
但是有一个问题,如果我想在新表中有主键ID,并且ID可以自增长,那么可以通过下面的语句实现:
SELECT student.tName,student.tAge,student.tInterTime,IDENTITY(int,1,1) As StudentID
INTO newstu2
FROM student
INTO newstu2
FROM student
这样就可以在newstu2中创建了新的主键自增长的字段StudentID。如下图:
二、删除
1:
插入就说这么多,插入了就可能删除,删除的语法很简单:
DELETE FROM student
很简单,但是破坏力也很强大,这条语句会情况student表中的所有数据,所以一般删除都要加条件。
DELETE FROM student WHERE tName='张三'
这样就只会把姓名为张三的数据删掉,WHERE后跟的是条件,用来判断你要操作的数据。至于操作符后面会详细讲一下,这里只需记住简答的,=、!=、> 、<、>=、<=即可。
2:
TRUNCATE TABLE newstu2
Truncate和delete from 不带where的功能接近。但是区别也很明显。
首先Truncate的速度要比delete更快。
Truncate table后不能跟条件,只能清空表中的全部数据。
另外Truncate清空数据后,自增长的数值也清空,再添加从初始值开始;delete则不会,它会保留自增信息,下次填写是会从上次的接触上继续增加。
比如你有一个个列,起始值为1,自增长为1,最初里面有10条记录,最后一条记录为10,用Truncate删除后,下次添加还是从1开始;用delete删除后,下次添加从11开始。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
TRUNCATE TABLE 不能用于参与了索引视图的表。
对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。
如果有ROLLBACK语句,DELETE操作将被撤销,但TRUNCATE不会撤销。
3:
ALTER TABLE newstu2 DROP COLUMN tInterTime
删除表中的某一列,上例为删除newstu2中的tInterTime列。
三、更新
现在我们要把student表中,tid为1的学生的名字改为“刘八”,那么我们该怎么做?
UPDATE student SET tname='刘八' WHERE tid=1
语法:UPDATE 表名 SET <列名=值> WHERE 条件