1.15将查询结果存入表中
INTO子句的语法格式为:
INTO新表名
INTO子句跟在SELECT子句之后、FROM子句之前。SELECT
<列名> INTO新表名FROM。
新表名是要存放查询结果的表名,SELECT INTO语句包含两个操作:首先按查询列表创建新表,然后执行查询语句,并将结果保存到新表中。
用INTO子句创建的新表可以是永久表,也可以是临时表。临时表又分为两种:局部临时表和全局临时表。局部临时表要在表名前加#,它只能用在当前的连接中;全局临时表要在表名前加##,它的生存期为创建全局临时表的连接的生存期
1.16合并查询
使用UNION的格式为:
SELECT语句1
UNION
SELECT语句2
UNION[ALL]
SELECT语句n
使用UNION的两个基本规则是:
A、所有查询语句中的列个数和列的顺序必须相同。
B、所有查语句中的对应列的数据类型必须兼容。
1.17子查询
A、使用子查询进行比较测试
使用子查询进行比较测试时,通过比较运算符(=、!=、<、>、<=、>=),将一个表达式的值与子查询返回的单值进行比较。如果比较运算的结果为True,则比较测试也返回True。
使用子查询进行的比较测试要求子查询语句必须是返回单值的查询语句。
例1:查询修了"c02"课程的且成绩高于此课程的平均成绩的学生的学号和成绩。
SELECT学号,成绩FROM SC
WHERE课程号=‘c02’
and成绩>(
SELECT AVG(成绩) from SC
WHERE课程号=‘c02’)
B、使用子查询基于集合的测试
使用子查询进行基于集合的测试时,通过运算符IN和NOT IN,将一个表达式的值与子查询返回的结果集进行比较。这同前边在WHERE子句中使用的IN作用完全相同。使用IN运算符时,如果该表达式的值与集合中的某个值相等,则此测试为True;如果该表达式与集合中的所有值均不相等,则返回False。
注意:使用子查询进行基于集合的测试时,由该子查询返回的结果集是仅包含单个列的一个列表,该列必须与测试表达式的数据类型相同。当子查询返回结果之后,外层查询将使用这些结果。
C、 使用子查询进行存在性测试
使用子查询进行存在性测试时,往往使用EXISTS谓词。带EXISTS谓词的子查询不返回查询的数据,只产生逻辑真值和逻辑假值。
例6:查询选修了‘‘c01”号课程的学生姓名。
SELECT姓名FROM
Student
WHERE EXISTS
(SELECT * FROM SC
WHERE学号=Student.学号
AND课程号=‘c01’)
注1:带EXISTS谓词的查询是先执行外层查询,然后再执行内层查询。由外层查询的值决定内层查询的结果;内层查询的执行次数由外层查询的结果数决定。
上述查询语句的处理过程为:
(1)找外层表Student表的第一行,根据其学号的值处理内层查询;
(2)用外层的值与内层的结果比较,由此决定外层条件的真、假值;如果为真,则此记录为符合条件的结果;
(3)顺序处理外层表Student表中的第2、3、…行。
注2:由于EXISTS的子查询只能返回真或假值,因此在这里给出列名无意义。所以在有EXISTS的子查询中,其目标列表达式通常都用“*”。
2.数据更新
SQL语言的数据更新语句DML主要包括插入数据、修改数据和删除数据三种语句。
2.1插入一行新记录
INSERT INTO <表名>[(<列名1>[,<列名2>…])] VALUES(<值>)
2.2插入一行的部分数据值
只写上部分列名,没有写上的列名值自动为空,如果列是NOT NULL则必需赋值。
2.3插入多行记录
INSERT INTO <表名> [(<列名1>[,<列名2>…])] 子查询
2.4修改数据
UPDATE <表名>
SET <列名>=<表达式>
[,<列名>=<表达式>]…
[WHERE <条件>]
2.5删除记录
DELETE
FROM<表名>
[WHERE <条件>]