高级数据操作--子查询

一.子查询——标量子查询

子查询的概念

思考:

如何得到php_student表中成绩最高的学生的记录?

1 select * from php_student order by score desc limit 1;

但是,存在一个逻辑问题,如果最高分有很多人,怎么办!

1 insert into php_student values
2     (null,‘观世音‘,‘female‘,17,5000,‘南海‘,100),
3     (null,‘如来‘,‘male‘,17,6000,‘西天‘,100);

所以,必须换一个思维方式,分成两个步骤:

1 -- 1.先得到成绩的最高分
2 select max(score) from php_student;
3 -- 2.把成绩为最高分的人全部查询出来
4 select * from php_student where score = (select max(score) from php_student);

所谓的子查询,其实就是在一条select语句中又出现了另一条select语句!

子查询有一个最基本的语法要求,就是子查询语句需要用一对括号括起来!

子查询的分类

一般的,有两种不同的分类方式:

分类:
一般的两种不同的分类方式:

(1)根据子查询返回值的形式

子查询依然是一条完整的查询语句,只要是查询语句,其返回值就四种形式:
   1.单一值

   2.一列

   3.一行

   4.多行多列

上面四条select语句乳沟放在另一条select语句中,都叫做子查询语句
分别如下:
返回单一值的子查询叫: 标量子查询
返回一列的子查询: 列子查询
返回一行的子查询: 行子查询
返回多行多列的子查询: 表子查询

当然以上是人为的逻辑分类,对应mysql服务器,无论返回形式如何都是资源结果集

(2)根据子查询出现的位置

from型:    子查询语句出现在from之后,通常作为一个数据源出现
where型: 子查询语句出现在where之后,通常用来做条件判断
exists型:  子查询语句出现在exists之后

标量子查询

通常,就是把标量子查询的结果当成是一个值来使用,可以用来参与运算,或者用来做条件判断!

二.子查询——列子查询

概念

子查询的结果是一列数据的集合!也是一类数据的集合!

所以,通常就是配合in 和not in集合运算符来使用!

案例

找出php_student表中所有已经开班了的学生的信息!

 1 --案例:
 2 -- 找出php_student表中所有已经开班的学生的信息
 3 -- 1、找出所有已经开班的班级号(班级的集合)
 4 select class_id from php_class;
 5 -- 2、 找出符合条件的学生
 6 select * from php_student where class_id in  (select class_id from php_class);
 7
 8 in 就是=any 或=some
 9
10 select * from php_student where class_id in  (select class_id from php_class);
11 select * from php_student where class_id =any(select class_id from php_class);
12 select * from php_student where class_id =some(select class_id from php_class);

三.子查询——行子查询

概念:

 子查询的结果是一行的子查询叫做行子查询!

行子查询使用的不是很多,因为必须在查询的过程中,构造一个行元素才能与子查询的结果进行比较!

所谓的构造行元素,就是一个由多个字段组成的元素,形式上就将多个字段用一对小括号括起来!

1 -- 语法
2 select *|字段列表 from 表名 where(字段1,字段2 ...) = (行子查询语句);
3
4 -- 查询php_student 总年龄最大并且分数最高的记录
5 select * from php_student where(age,score) = (select max(age),max(score) from php_student);

四.子查询——表子查询

概念

返回的结果是多行多列的子查询就叫做表子查询!

表子查询一般就是用在from语句之后,当成一个数据源来使用,所以最常见的语法格式:

1 select * | 字段列表 from (表子查询语句) as 别名 where子句等五子句;
/*特别强调:
     当子查询语句出现在from之后作为一个数据源使用的时候,该语句必须起一个别名!
    案例:
     不使用任何的统计函数找出php_student 表中每个家乡home中分数score最低的一个学生!
*/

     select * from php_student group by home; -- 无法达到目的

     -- 1.先以score字段进行升序排序
     select * from php_student order by score asc;
     -- 2.对排序之后的数据表根据home字段进行分组(分组只拿第一条数据)
     select * from(select * from php_student order by score asc) as s group by home;

五. 子查询——exists型子查询

概念

exists主要是用来判断的,返回的是一个布尔值:true或者false,1或者0;

判断依据:

如果子查询的结果有数据返回(查询到了结果),用exists去判断的结果就为true!

如果子查询的结果没有数据返回(没有查询到结果),用exists去判断的结果就为false!

案例

 1 -- 案例:
 2 -- 查询年龄最大分数最高是否存在
 3 select exists(select * from php_student where(age,score) = (select max(age),max(score) from php_student));
 4
 5 -- 查询年龄最小分数最高是否存在
 6 select exists(select * from php_student where(age,score) = (select min(age),max(score) from php_student));
 7
 8 处理用户注册的时候判断用户输入的用户名是否语句存在!
 9 -- 假如用户输入的用户名是flybird,要作如下的判断
10 select exists(select * from user where user_name = ‘flybird‘);
查询年龄最大分数最高是否存在

查询年龄最小分数最高是否存在

时间: 2024-10-04 22:25:05

高级数据操作--子查询的相关文章

mysql 数据操作 子查询 带比较运算符的子查询

带比较运算符的子查询 #比较运算符:=.!=.>.>=.<.<=.<> #查询大于所有人平均年龄的员工名与年龄 思路 先拿到所有人的平均年龄然后 再用另外一条sql语句 进行比较 拿所有员工的年龄 > 所有人的平均年龄 做比较 mysql> select name,age from employee where age >(select avg(age) from employee) ; +------+------+ | name | age | +

高级数据操作--连接查询

一.连接查询——交叉连接 概念 表与表之间是有联系的! 所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示! 所以,从结果上看,字段数增加了! 分类 根据连接查询的性质不同,又可以分成交叉连接.内连接.外连接和自然连接! 交叉连接关键字:cross join  交叉连接含义: 交叉连接是最容易理解的,就是指从一张表中的每一条记录分别去连接另外一张表的所有的记录,并且保存所有的记录,其中也包括两张表的所有的字段! 所以说,交叉连接的本质就是两张数据表做笛卡尔积! 笛

高级数据操作--联合查询

一.联合查询 1 -- 关键字: union 2 3 -- 语法 4 select 语句1 5 union[union 选项] 6 select 语句2 7 union[union 选项] 8 ...... 9 union[union 选项] 10 select 语句n; 所谓的联合查询,就是将多个查询语句的结果进行纵向上的拼接,也就是将select语句2的查询结果放在select语句1的后面!很显然,总的记录数增加了,但是字段的数量并没有增加! 既然是多个查询记录的拼接,所以联合查询有一个最基

mysql学习之路_高级数据操作

关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 Id 姓名 性别 年龄 电话号码 1 张三 男 23 13320848263 一对多 一张表中有一条记录,对应另一张表多条记录但是反过来,另一张表的一条记录只能对应这张表的一条记录. 例母亲与孩子的关系 多对多 一张表中的一条记录对应另外一张表的多条记录,同时另一张表的一条记录对应另外一张表的多条

高级数据操作(上)

数据的操作也叫做CRUD C:Create R:Read U:Update D:Delete 一.插入数据 标准语法: 1 insert into 表名[字段列表] values(值列表): 思考: 1,如何以最快的速度向数据表中插入100万条数据? (1)蠕虫复制 含义:在已有的数据的基础之上,将原来的数据进行复制,插入到对应的表中(也可以插入到自己的表中): 1 -- 蠕虫复制 2 insert into 表名 select *|字段列表 from 表名; 3 4 create table

oracle-2-sql数据操作和查询

主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是表,表中常见的数据类型有: char(length):存储固定长度的字符串,length默认1,最长2000 varchar2(length):存储可变长度的字符串,length默认长度是1,最大4000 number(p,s)存储浮点数或者是整数,p表示的是最大位数(包含小数点),p默认是38,s表示小数位

记录操作 子查询 三表联查

内容:复制表.记录详细操作.group by关键字.having关键字.order by关键字.limit.多表查询.多对多 三表联查.子查询. 复制表 复制表结构+记录(不会复制:主键.外键和索引) create table new_table select * from old_table; 只复制表结构 create table new_table select * from old_table where 1=2; #条件为假,查不到任何记录 记录详细操作 增:    insert in

SQL中的高级数据操作

一.新增数据 1. 主键冲突:更新和替换 ① insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段 = 新值, 字段 = 值, ...; -- 更新 ② replace into 表名 [(字段列表)] values (值列表); -- 替换 2. 蠕虫复制 create table 表名A like 数据库.表名B; -- 从已有表中复制表结构(不复制数据), 如表B与表A在同一数据库,可活力数据库名; insert i

MySQL中常用操作--子查询

子查询就是SELECT 查询是另一个SELECT的附属,  此时, MySQL从最内层的查询开始, 再向外向上查询, 接着最外层的父查询被执行, 它的结果也指定给父查询. 带IN的子查询:只有子查询返回的结果列中包含一个值时, 比较运算符才适用. 假如一个子查询的返回结果集是值的列表, 这时比较运算符就必须用关键字IN代替IN运算符可以检测结果集中是否存在某个特定的值, 如果检测成功就执行外部的查询. mysql> select * from stu -> ; +----+----------