6-扩展内容
拷贝表结构及数据到新表
拷贝表结构及数据到新表使用的是CREATE TABLE…SELECT语句,其语法格式如下:
CREATE TABLE 新表名SELECT * | 字段列表FROM 旧表名[WHERE 查询条件]
说明:旧表中的主键、索引、自动递增属性等不能够拷贝到新表中。
示例:使用CREATE TABLE…SELECT语句拷贝student表的表结构到新表tempStudent,包含5个字段:学生ID(id)、学号(stuNo)、姓名(stuName)性别(sex)和班级名称(deptName)。
向表中插入子查询结果集
向表中插入子查询结果集使用的是INSERT INTO…SELECT语句,其语法格式如下:
INSERT INTO 新表名 [( 字段名1, 字段名2, ... , 字段名n )]SELECT * | 字段列表FROM 旧表名[WHERE 查询条件]
说明:
新表名后面指定的字段列表要与SELECT子句中查询的字段列表一一对应,即个数要相等,数据类型也要匹配。
INSERT语句也可以省略字段列表,但SELECT子句提供的字段必须按照新表中定义的字段顺序为全部字段提供值。
示例:在student表中查询“网络131”班的学生记录,将查询结果插入到tempStudent表中
带子查询的修改语句
带子查询的修改语句使用的是UPDATE…SELECT语句,其语法格式如下:
UPDATE 表名SET 字段名1=值1 [, 字段名2=值2, … , 字段名n=值n]WHERE 字段名 运算符 子查询
示例:在score表中,将“数据结构”课程的成绩统一减去5分。
带子查询的删除语句
带子查询的删除语句使用的是DELETE…SELECT语句,其语法格式如下:
DELETE FROM 表名WHERE 字段名 运算符 子查询
示例:在score表中,将“机电131”班的学生成绩记录全部删除。
多列子查询
示例:查询每个部门入职时间最早的部门编号,员工姓名,入职时间
SELECT deptno,ename,hiredate
FROM emp
WHERE (deptno,hiredate) IN (SELECT deptno ,MIN(hiredate) FROM emp GROUP BY deptno);
子查询中的空值
示例:查询不是经理的员工姓名。
SELECT ename
FROM emp
WHERE empno NOT IN(SELECT mgrFROM emp);
查询结果为:
- 上面的SQL语句试图查找出没有下属的雇员,逻辑上,这个SQL语句应该会返回8条记录,但是却一条也没返回,why?
- 因为子查询的结果中有一条空值,这条空值导致主查询没有记录返回。这是因为所有的条件和空值比较结果都是空值。
正确写法:
SELECT empno,ename
FROM emp
WHERE empno NOT IN(SELECT mgrFROM emp where mgr is not null);
在 FROM 子句中使用子查询
示例:查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
SELECT a.ename, a.sal, a.deptno, b.salavg
FROM emp a, (SELECT deptno, AVG(sal) salavgFROM empGROUP BY deptno) b
WHERE a.deptno = b.deptno AND a.sal > b.salavg;