2019年12月17日 星期二 CQCET
复杂数据查询-内部查询(子查询)
子查询效率相对多表连接查询效率更高,
子查询就是一个select中在包含一个select,外层select叫外部查询,内部的叫内内部查询或子查询
语法:
内部查询支持运算符查询
比如:列表运算符 IN ;比较运算符 大于 小于等…
比较运算符:
- IN的内部查询与应用
kc和xs_kc两个表应用in查询。
根据xs_kc来查询kc里的选修情况,查询那些课程被选修过了。
select 课程名,授课教师,学分 from kc where 课程号 in (select 课程号 from xs_kc);
根据xs_kc表里的课程号来查的
反之
select 课程名,授课教师,学分 from kc where 课程号 not in (select 课程号 from xs_kc);
- 使用ANY的内部查询
ANY子查询表示,只要查询中一行为真,则主查询where结果为真
any有三种表达方式
=ANY;>ANY(>=ANY)和<ANY(<=ANY)
其中=any和in子查询一样;>any表示返回记录中最大值;<any表示返回记录着最小值。
select * from xs_kc where 成绩>any (select 成绩 from xs_kc where 学号=2016110101 and 课程号 =101);
select * from xs_kc where 课程号=101 and 成绩<any (select 成绩 from xs_kc where 课程号=101 and 学号=2016110101);
- EXISTS子查询与应用
exists是一个布尔类型,返回True或 False,作用是检查查询是否有返回值。
- ALL的子查询
all查询有两种模式>all(>=all)和<all(<=all)
其中>all表示返回记录最大值要大,<any表示返回记录最小值要小。
它与any的不同点
Any:>Any 表示至少大于一个值,即大于最小值。
All: >All 表示大于每一个值。换句话说,它表示大于最大值
select * from xs_kc where 课程号=102 and 成绩>all (select 成绩 from xs_kc where 课程号 = 102 and 学号=2016110101);
- 合并查询
sql注入常用
语法:
select 列名 from 表名 union select 列名 from 表名2
union 会去掉同行
union all 不会去掉同行
- 查询结果输出到其他表
输出后它保持原有数据类型,属性保留非空属性和默认值属性。
语法:
create table 新表 select 列名 from 原表 where 条件;
备份xs_kc表
这种输出并不会保持原表的主键,外键约束等其它属性。