1. Select- subquery子查询

子查询:是将一条查询语句嵌套在另一条查询语句之中。

2. 案例

  需求:查询获得代课天数最多的那个老师的信息。

思路:先获得最多的代课天数是多少天,然后再判断哪个老师的代课天数和最大值是一样的。MySQL允许将上面的查询结果,作为一个值来使用。

即:

var1 = Select max(days) from teacher_class;/* 保存起来 */

Select  t_name,gender from teacher_class where days = var1;

Select  t_name,gender from teacher_class where days = ( Select max(days) from  teacher_class )

3. 子查询详解:

上面2中使用到就是子查询,子查询需要使用括号括起来。

(1)子查询的分类:

分类标准:

    • 子查询使用的结构:exists型,where型,from型

    • 子查询返回值形式:(1)单一值 (2)一列 (3)多列 (4)多行多列

                 

(2)标量子查询:

获得一个值之后,使用关系运算符,进行判断。

=   >    <    <=    >=    !=    

比如:Select t_name,gender from teacher_class where days < ( Select  max(days)  from  teacher_class );      

(3)列子查询:

获得一列 ,通常是多个行的一列值。

需求:获得所有带过0228班的讲师信息。

思路:先获得0228班讲师的姓名,再利用这姓名查询其所有的班记录。

select  t_name  from teacher_class  where  c_name ='php0228';

select  t_name,c_name,days from teacher_class where  t_name  in ( select  t_name  from teacher_class  where  c_name ='php0228' );

注意:

• 返回一列。

• 使用in / not in 

• 还可以使用其他的集合操作符:

       Any(集合):集合中的任何一个

       = any(集合):等于集合中的任何一个即可。等同与in

       all(集合):集合中所有的元素。

       !=all(集合):不等于集合中的任何一个即可。等同与 not in

      Some(集合):集合中的一些

--> 使用 in

--> 使用 any

--> 使用 !=any

!=any不等于集合中的任意一个就可以(注意不是要求和集合中所有的元素不相等),只要与集合中的一些元素不相等即可。

注意 !=any不是 not in

总结:

• = any   ----- in

• != all    ----- not in

• Some 和 any 同义词

                 

(4)行子查询:

使用 limit 1

行子查询案例:

在参与比较的时候,使用括号可以构建一行(field1, field2)

select t_name, gender,c_name  from teacher_class  where (gender,c_name) = (select  distinct  gender,c_name  from teacher_class where t_name='李白' and c_name='php0115');

这时候要求查询结果返回一行,如下:

select t_name, gender,c_name  from teacher_class  where (gender,c_name) = (select  distinct  gender,c_name  from teacher_class where t_name='李白' and c_name='php0115'  limit 1);

(5)表子查询:

通常用在from型语句中。

select * from (select  t_name ,c_name,days  from  teacher_class  where  days > 15);

在from子句中内,要求使用一个表,而不是一个结构,应该给这个查询结果起名,别名。

select * from (select  t_name ,c_name,days  from  teacher_class  where  days > 15) as  temp;

在上面的基础上,添加查询条件,如下:

select * from (select  t_name ,c_name,days  from  teacher_class  where  days > 15) as  temp  where  t_name  like '李%';

再次添加查询条件:

select  teacher  from (select  t_name  as  teacher ,c_name,days  from  teacher_class  where  days > 15) as  temp  where  teacher like '李%';

MySQL(18):Select- subquery子查询的更多相关文章

  1. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  2. SELECT使用子查询

    SELECT使用子查询   SELECT使用子查询,该子查询会执行多次,  次数是由记录数量决定.效率比较低,不推荐使用.  //查询部门编号,工资大于等于2000的人数,  //工资小于2000的人 ...

  3. subquery 子查询

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Enum ...

  4. MySQL(八)子查询和分组查询

    一.子查询 1.子查询(subquery):嵌套在其他查询中的查询. 例如:select user_id from usertable where mobile_no in (select mobil ...

  5. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  6. MySQL 使用JOIN优化子查询

    1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...

  7. mysql sql_safe_updates 不支持子查询的更新。

    考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...

  8. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

  9. MySQL锁类型以及子查询锁表问题、解锁

    MySQL中select * for update锁表的范围 MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主 ...

  10. MySQL使用存储过程代替子查询

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

随机推荐

  1. 我的WCF之旅(1):创建一个简单的WCF程序

    为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...

  2. gdi写的2048

    //-------------------------------------------[头文件及引用]----------------------------------------------- ...

  3. Timus 1746 Hyperrook

    题意:在一个n维坐标系中,坐标的范围是0到m - 1,如果两个点坐标只有一个维度的坐标不同则可以相互移动,给出p个点,问任意两个点之间路径为d的个数是多少,答案与p取模. 解法:只需要考虑两个点之间不 ...

  4. [King.yue]Ext.net 页面布局Flex

    此属性仅当父布局HboxLayout或使用VboxLayout.此配置选项被应用到子项目容器管理的布局.每个子项目以Flex属性被弯曲的水平根据每个项目的相对弹性值比较,都带有一个弯曲值指定项目金额. ...

  5. win7远程链接ubuntu 桌面版

    1.安装ubuntu 使用vagrant 添加了一个ubuntu12.04(xmanager好像只能控制最高这个版本,14.04没成功过) 2.安装xmanager 4 3.修改ubutu配置文件 s ...

  6. js基础第八天

    返回前面起第一个字符位置 indexOf("sdfsdf");它是从左边索引为0开始数,而且只找第一个,然后返回该字符的位置.返回是个数值.如果找不到该字符,那么就会返回-1. 返 ...

  7. 使用 cloc 统计代码行数

    可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释.空行所占用的文本行都统计在内.如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做 ...

  8. 导入showb时候出错--2015-12-4

    [root@cache-02 ~]# /opt/coreseek/csftweb-bash: /opt/coreseek/csftweb: is a directory[root@cache-02 ~ ...

  9. 取得Resultset的记录条数

    public Boolean exists(String sql) { try { stm = conn.createStatement( java.sql.ResultSet.TYPE_SCROLL ...

  10. Yum本地源配置

    1.mount -t auto /dev/cdrom /mnt      使用光驱 mount -t iso9660 -o loop /home/software/rhel-server-6.4-x8 ...