MySQL子查询(关键字any,all,exist,in,以及算术运算符的使用)
先引入子查询的基本概念,它实际上是一个完整的条件查询语句,只是这个语句恰好又是外面语句的一个查询的条件,即查询的嵌套问题。在子查询中通常可以使用比较和运算符这些,以及in,any,all,exists等的关键字。下面我们进入学习关键字。
准备测试数据:
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;
-- 创建班级表
CREATE TABLE class(
cid int (4) NOT NULL PRIMARY KEY,
cname varchar(20)
);
-- 创建学生表
CREATE TABLE student (
sid int (4) NOT NULL PRIMARY KEY,
sname varchar (20),
sage int (2),
classid int (4) NOT NULL
);
-- 向班级表插入数据
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');
INSERT INTO class VALUES(1005,'Android');
-- 向学生表插入数据
INSERT INTO student VALUES(1,'刘婷婷',20,1001);
INSERT INTO student VALUES(2,'王琴琴',21,1002);
INSERT INTO student VALUES(3,'杨洋洋',24,1003);
INSERT INTO student VALUES(4,'李霞霞',23,1004);
INSERT INTO student VALUES(5,'吴桃桃',21,1001);
INSERT INTO student VALUES(6,'高倩倩',26,1001);
INSERT INTO student VALUES(7,'甘丽丽',27,1002);
基本算术运算符的子查询
子查询中使用>,<,=,>=,!=等的比较运算符
示例:查询刘婷婷同学所在班级的信息
select cla.* from class as cla where cla.cid=(select s.classid from student as s where s.sname='刘婷婷' );
运行结果:
示例:查询比刘婷婷同学所在班级编号还大的班级信息
select cla.* from class as cla where cla.cid > (select s.classid from student as s where s.sname='刘婷婷');
运行结果为:
关键字in的子查询
使用not in 关键字进行子查询时内层查询语句仅仅返回一个数据列,这个数据列中的值供外层查询语句进行操作
示例:查询年纪大小为24的学生的所在班级的信息
select cla.* from class as cla where cla.cid in(select s.classid from student as s where sage=24);
示例:查询年纪大小不为24的学生所在的班级信息
select cla.* from class as cla where cla.cid not in(select s.classid from student as s where sage != 24);
运行结果:
关键字exists关键字的子查询
exists 关键字后面的参数可以是任意一个子查询,它不产生任何数据只返回true或者false.当返回为true时才会执行外层循环。
示例:假若刘婷婷同学在学生表中则从班级表查询所有班级信息
注意书写规范:where exists(子查询)
select cla.* from class as cla where exists(select s.classid from student as s where s.sname='刘婷婷');
运行结果:
关键字any关键字的查询
any关键字表示满足其中任意一个条件就返回一个查询结果作为外层查询的条件
示例:查询比任一学生所属班级号还大的班级编号
select * from class where cid > any (select classid from student);
关键字all关键字的查询
all关键字与any有点类似,只不过all关键字的查询子查询返回的结果需同时满足所有内层查询的条件
示例:查询比所有学生所属班级号还大的班级编号
select * from class where cid > all (select classid from student);
同时满足所有内层查询的条件
示例:查询比所有学生所属班级号还大的班级编号
select * from class where cid > all (select classid from student);