MySql数据库_06

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表

在这里插入图片描述

这种输出并不会保持原表的主键,外键约束等其它属性。

在这里插入图片描述

原文地址:https://www.cnblogs.com/cqnswp/p/12568876.html