八、子查询
子查询
概念:
当进行一个查询时,需要的条件或数据要用另外一个select语句的查询结果, 这个select语句就叫子查询。子查询会优先于主查询而执行。
分类:
-
where型子查询
-
from型子查询
-
exists型子查询
-----------------------------------------------------------------------------------
WHERE型子查询
where型子查询即把内层的sql语句查询结果作为外层sql查询的条件
他有如下注意事项:
-
子查询要包含在括号内。
-
建议将子查询放在比较条件的右侧。
-
单行操作符对应单行子查询,多行操作符对应多行子查询。
-
单行操作符(单行比较运算符(=,>,>=,<,<=,<>)): 右边子查询必须返回的是单个值,
-
多行操作符(ALL, ANY,IN):右边子查询可以返回多行,但必须是单列, 其中,ALL和ANY运算符必须与单行比较运算符(=,>,>=,<,<=,<>)结合使用
IN
|
等于任何一个
|
ALL
|
和子查询返回的所有值比较。score > ALL(60,70,90) ==
score > 60 && score > 70 && score > 90;
|
ANY
|
和子查询返回的任意一个值比较。score > ANY(60,70,90) == score > 60 or score > 70 or score > 90;
|
EXISTS
|
判断子查询是否有返回结果(不关心具体行数和内容),如果返回则为TRUE,否则为FALSE。
|
IN
EXISTS
ANY
ALL
----------------------------------------------------------------------------
复制表子查询
复制表
-
拷贝表结构
CREATE TABLE newadmin LIKE admin;
-
拷贝表结构和数据(但约束与索引除外)
CREATE TABLE newadmin AS ( SELECT * FROM admin ) ;
-
拷贝表结构和数据
CREATE TABLE newadmin LIKE admin;
INSERT INTO newadmin SELECT * FROM admin;
-
跨数据库拷贝表
CREATE TABLE newadmin LIKE shop.admin;
CREATE TABLE newshop.newadmin LIKE shop.admin;
-
拷贝一个表中其中的一些字段(指定新名),其中一些数据
CREATE TABLE newadmin AS
(
SELECT id, username AS uname, password AS pass FROM admin WHERE id<10
);
-
在创建表的同时定义表中的字段信息。
CREATE TABLE TT
(
eid int primary key auto_increment
)
AS
(
select employee_id as eid,first_name,last_name,email f rom employees
);
----------------------------------------------------------------------------------------------
复制数据
在 INSERT 语句中加入子查询。不必书写 VALUES 子句。
子查询中的值列表应与 INSERT 子句中的列名对应。
-
INSERT INTO emp2
SELECT * FROM employees WHERE department_id = 90; (全部字段\列名对应)
-
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%'; (指定字段)