|
在SQL中,最常用的向表格中添加数据的方法是使用INSERT语句。但是,用INSERT语句每次只能插入一个元组。用带子查询插入语句,一个次可以插入一个或多个元组。
● 插入一个元组的语句格式:
INSERT INTO 表名[(列名[,列名]…)]
VALUES(值[,值]…..)
插入单个元组,按顺序在表名后给出表中每个列名,在VALUES后给出对应的每个列值。插入一个完整的新元组时,可省略表的列名。插入部分列值,必须在表名后给出要输入值的列名。
|
例1,插入单个元组,按顺序给出表中每个列值。
INSERT INTO DEPT VALUES( "CS","计算机","888",
"10区" ) |
|
例2,插入一个学生的部分列值,必须在表名后给出要输入值的列名。
INSERT INTO STUDENT (sno ,sname)
VALUES( "J20045", "刘琉") |
在使用INSERT语句的时候,VALUES列表中的值或表达式必须匹配表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT
NULL,那么在插入时该列必须要出现在VALUES的列表中,否则插入会失败。
● 用子查询插入多个元组值的语句格式:
INSERT INTO 表名[(列名[,列名]…)]
子查询
注意:在使用子查询的结果插入元组时,子查询的结果必须匹配待插入表中的列数,并和相应各列数据类型兼容。如果表格中存在某些列定义为NOT
NULL,那么子查询的结果在该列上必须有值,否则插入会失败。
|
例3,建立一个新表,存放每个学生的学号、姓名和平均成绩。把子查询结果插入新表中。
CREATE TABLE savg( sno CHAR(8),sname CHAR(20), avage REAL )
INSERT INTO savg (sno,sname,avage)
( SELECT sno,sname,AVG(grade)
FROM SC,STUDENT
WHERE SC.sno = STUDENT.sno
GROUP BY sno ) |
|
例4,在表Studio中插入属性name,这些name是在表Movie中提到,但没有在表Studio中出现的studioName。
INSERT INTO Studio(name)
SELECT DISTINCT studioName
FROM Movie
WHERE studioName NOT IN
(SELECT name FROM Studio); |
考虑上述例子如果去掉DISTINCT会是什么样子?和你想象的一样吗? |
|