#进阶7:子查询
/*
含义: 出现在其他语句中的select语句,称为子查询或者内查询 外部的查询语句,称为主查询或外查询
分类:
按照子查询出现的位置:
select后面:只支持标量子查询
from后面:支持表子查询
重点:where或者having后面:
标量子查询,重点
列子查询,重点
行子查询(用的较少)
exists后面(相关子查询):表子查询
按照结果集的行列不同:
标量子查询(结果集中只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集为一行多列)
表子查询(结果集为多行多列)
*/ #一、where或者having后面
/*
1.标量子查询(单行子查询)
2.列子查询(一列多行)
特点:
(1)子查询放在小括号内
(2)子查询一般放在条件的右侧
(3)标量子查询,一般搭配着单行操作符使用
>,<,=,!=,<> 列子查询,一般搭配着多行操作符使用
in/not in,any/some等价于min(),all等价max()
*/ #1.标量子查询
#案例1: 谁的工资比Abel高
#(1)先查询Abel的工资
select salary from employees where last_name="Abel";
#(2)再查询员工的工资,且结果大于Abel的工资
select * from employees where salary>(select salary from employees where last_name="Abel"); #案例2:返回job_id与141号员工相同的,salary比143号多的员工姓名、job_id和工资
(1)查询141号员工的job_id
select job_id from employees where employee_id="141";
(2)查找143号的工资
select salary from employees where employee_id="143";
(3)查找salary比143号多的员工姓名、job_id和工资
select last_name,job_id,salary from employees where salary>(select salary from employees where employee_id="143");
(4)返回job_id与141号员工相同的,salary比143号多的员工姓名、job_id和工资
select last_name,job_id,salary from employees where job_id=(select job_id from employees where employee_id="141") and salary>(select salary from employees where employee_id="143"); #2.列子查询
#案例1:返回location_id是1400或者1700的部门中的所有员工姓名
(1)location_id是1400或者1700的部门
select distinct department_id from departments where location_id=1400 or location_id=1700;
(2)(1)部门中的所有员工姓名(使用 in )
select last_name from employees;
select last_name from employees where employees.department_id in (select distinct department_id from departments where location_id=1400 or location_id=1700); #3.行子查询(了解即可) #二、select 后面
#案例1:查询每个部门的员工个数
/*
(1)先对部门去重
select distinct department_id from employees where department_id is not null; (2)再查询每个部门的员工个数
select count(employee_id) from employees
select count(employee_id),department_id from employees group by (select distinct department_id from employees where department_id is not null);
*/ 思路不对 正确解:
select d.*,(select count(*) from employees e where d.department_id=e.department_id) 个数 from departments d; #案例2:查询员工号=102的部门名字
select department_id from employees where employee_id=102;
select department_name from departments where department_id=(select department_id from employees where employee_id=102); #三、from后面 #四、exists后面(相关子查询)
/*
exists是否存在,布尔值
语法:exists(完整的查询语句)
结果:1,或 0
*/
案例1:查询有员工的部门名
select department_name from departments d where exists(select * from employees e where d.department_id=e.department_id);

  

MySQL 查询语句--------------进阶7:子查询的更多相关文章

  1. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  2. MYSQL优化派生表(子查询)在From语句中的

    Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能 ...

  3. MySQL数据库查询操作进阶——多表查询

    多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...

  4. MySQL全面瓦解11:子查询和组合查询

    概述 子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询. 先做一下数据准备,这边建立三张表:班级.学生. ...

  5. mysql加强(6)~子查询简单介绍、子查询分类

    一.子查询简单介绍 1.什么是子查询? 一个查询之中嵌套了其他的若干查询. 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果. 子 ...

  6. 在 SQL Server 数据库的 WHERE 语句中使用子查询

    这是关于子查询语句的一系列文章中的第三篇.在这篇文章中我们将讨论WHERE语句中的子查询语句.其他的文章讨论了其他语句中的子查询语句. 本次课程中的所有例子都是基于Microsoft SQL Serv ...

  7. SQLite进阶-14.子查询

    目录 子查询 SELECT语句中的子查询 INSERT语句中的子查询 UPDATE语句中的子查询 DELETE语句中的子查询 子查询 子查询或内部查询或嵌套查询是在另一个SQLite查询内嵌入在WHE ...

  8. T-SQL查询语句(二):嵌套查询

    一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句中,称为嵌套查询.外层查询称为父查询,主查询.内层查询称为子查询 ...

  9. Entity Framework查询生成大量的子查询,如何避免?求救

    最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...

随机推荐

  1. Python 批量文件下载

    python文件 批量下载 .图片批量下载 ,批量请求.爬虫 #==================================================================== ...

  2. P2933 [USACO09JAN]气象测量The Baric Bovine

    传送门 挺显然的 $dp$ ,然鹅一开始想的是 $dfs$ 乱剪剪枝搞了 $70$ 分... 设 $f[i][j]$ 表示切了 $i$ 次,当前切的位置为 $j$ 的最小误差 那么转移显然枚举上一个切 ...

  3. vue数据响应式的一些注意点

    有关对象属性值不触发视图更新的情况: Vue 不能检测到对象属性的添加或删除,由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 ...

  4. Cannot change column 'id': used in a foreign key constraint

    原因:为表添加自增长,但由于该表有外键而报错 发现是因为外键的影响,不能随便的更改表结构. 要想更改表结构,首先要把基层的表修改了. A表 作为B表的外键,A表不能随便修改. B表 有A表的外键,必须 ...

  5. javascript实现快速排序算法

    忘记了快速排序的思路是怎样的了,复习一下,写了两个实例,发表博文备忘. 对于快速排序的思想,可以参考白话经典算法系列之六 快速排序 快速搞定,讲得比较通俗 prototype扩展的方式 /** * 对 ...

  6. JS中数组和字符串方法的简单整理

    一.数组: 数组的基本方法:              1.增:arr.unshift() /push()    前增/后增                  2.删:arr.shift() /pop ...

  7. 动态规划—distinct-subsequences

    题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subseque ...

  8. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  9. php 调用远程url

    // ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. // ; http://php.net/a ...

  10. [MethodImpl(MethodImplOptions.Synchronized)]、lock(this)与lock(typeof(...))

    对于稍微有点经验的.NET开发人员来说,倘若被问及如何保持线程同步,我想很多人都能说好好几种.在众多的线程同步的可选方式中,加锁无疑是最为常用的.如果仅仅是基于方法级别的线程同步,使用System.R ...