sql子查询

子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念。

子查询返回结果

子查询可以返回的数据类型一共分为四种:

    1. 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
    2. 单行多列:返回一行数据中多个列的内容;
    3. 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
    4. 多行多列:查询返回的结果是一张临时表;

在WHERE子句中使用子查询

在WHERE子句之中处理单行单列子查询、多行单列子查询、单行多列子查询。

单行单列子查询

示例一、查询公司之中工资最低的雇员的完整信息

--查询公司之中工资最低的雇员的完整信息 SELECT * FROM emp e WHERE e.sal=( SELECT MIN(sal) FROM emp);

示例二、查询出基本工资比ALLEN低的全部雇员信息

-- 查询出基本工资比ALLEN低的全部雇员信息 SELECT * FROM emp e WHERE e.sal<( SELECT sal FROM emp WHERE ename=‘ALLEN‘ );

示例三、查询基本工资高于公司平均薪金的全部雇员信息

--查询基本工资高于公司平均薪金的全部雇员信息 SELECT * FROM emp e WHERE e.sal>( SELECT AVG(sal) FROM emp);

单行多列子查询。

示例四、查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,

--查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息, SELECT * FROM emp e WHERE e.job=( SELECT job FROM emp WHERE ename=‘ALLEN‘) AND e.sal>( SELECT sal FROM emp WHERE empno=7521);

示例五、查询与SCOTT从事同一工作且工资相同的雇员信息

SELECT * FROM emp e WHERE (e.job,e.sal) = ( SELECT job,sal FROM emp WHERE ename=‘SCOTT‘) AND ename<>‘SCOTT‘;

示例六、查询与雇员7566从事同一工作且领导相同的全部雇员信息

--查询与雇员7566从事同一工作且领导相同的全部雇员信息 SELECT * FROM emp e WHERE (e.job,e.mgr) =( SELECT job,mgr FROM emp WHERE empno=7566 );

示例七、查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)

--查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN) SELECT * FROM emp e WHERE (e.job,to_char(e.hiredate,‘yyyy‘))=( SELECT job,to_char(hiredate,‘YYYY‘) FROM emp WHERE ename=‘ALLEN‘ );

多行单列子查询

主要使用三种操作符:IN、ANY、ALL

IN操作

示例八、查询出与每个部门中最低工资相同的全部雇员信息

--查询出与每个部门中最低工资相同的全部雇员信息 SELECT * FROM emp e WHERE e.sal IN( SELECT MIN(sal) FROM emp GROUP BY deptno );

示例九、查询出不与每个部门中最低工资相同的全部雇员信息

--查询出不与每个部门中最低工资相同的全部雇员信息 SELECT * FROM emp e WHERE e.sal NOT IN( SELECT MIN(sal) FROM emp GROUP BY deptno );

ANY在使用中有如下三种使用形式:

=ANY:表示与子查询中的每个元素进行比较,功能与IN类似(然而<>ANY不等价于NOT IN)

>ANY:比子查询中返回结果的最小的要大(还包含了>=ANY)

<ANY:比子查询中返回结果的最大的要小(还包含了<=ANY)

示例十、查询出每个部门经理的工资

--查询出每个部门经理的工资 SELECT * FROM emp WHERE sal = ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

示例十一、查询出每个部门大于经理的工资

--查询出每个部门大于经理的工资 SELECT * FROM emp WHERE sal > ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

示例十二、查询出每个部门小于经理的工资

--查询出每个部门小于经理的工资 SELECT * FROM emp WHERE sal < ANY ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

ALL操作符有以下三种用法:

<>ALL:等价于NOT IN(但是=ALL并不等价于IN)

>ALL:比子查询中最大的值还要大(还包含了>=ALL)

<ALL:比子查询中最小的值还要小(还包含了<=ALL)

示例十三、查询出每个部门不等于经理的工资

--查询出每个部门不等于经理的工资 SELECT * FROM emp WHERE sal <> ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

示例十四、

SELECT * FROM emp WHERE sal < ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

示例十五、

SELECT * FROM emp WHERE sal >ALL ( SELECT MIN (sal) FROM emp WHERE job=‘MANAGER‘ GROUP BY deptno );

空数据判断

在SQL之中提供了一个exists结构用于判断子查询是否有数据返回。如果子查询中有数据返回,则exists结构返回true,反之返回false。

示例十五、验证exists结构

--验证exists结构 SELECT * FROM emp WHERE EXISTS( --返回空值,没有内容输出 SELECT * FROM emp WHERE empno=9999); --没有这个编号的员工

示例十六、

SELECT * FROM emp WHERE EXISTS(SELECT * FROM emp);--有内容将返回数据

示例十七、

SELECT * FROM emp WHERE NOT EXISTS(SELECT * FROM emp);--有数据,但取返,没有内容输出

时间: 2024-10-25 21:48:29

sql子查询的相关文章

sql子查询 嵌套SELECT语句

嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在select list中,作为一个字段值来返回. 1.单行子查询 :单行子查询是指子查询的返回结果只有一行数据.当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较. 例:select ename,deptno,salfrom

sql子查询和嵌套查询

子查询和嵌套查询 标签: it   嵌套查询就是在外部还有一个查询. 子查询是在select 内部还有一个select 查询常常也被称为内查询 下面的错误示例: select name from [user] where age <= (select age from [user] where id>1 ) 子查询返回的值多于一个.当子查询跟随在 =.!=.<.<=.>.>= 之后,或子查询用作表达式时,这种情况是不允许的. 1.语法 子查询的句法如下: (SELECT

sql子查询 嵌套SELECT实用语句

嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在select list中,作为一个字段值来返回. 1.单行子查询 :单行子查询是指子查询的返回结果只有一行数据.当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较. 例:select ename,deptno,sal fro

SQL ---子查询

子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数: 另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表. (一)子查询 (1).not 的使用 (二).分页查询 (三).知识点 (1).转换 (2). (3).查看所有人员的生日 (4).单独查看 (5).

SQL 子查询,连接查询复习

use lianxi0720 go --创建部门表 create table bumen ( bcode int primary key,--部门编号 bname varchar(20), --部门名称 bceo varchar(20), --部门负责人 btel varchar(20), --部门电话 ) go --创建人员表 create table renyuan ( code int primary key identity(10001,1),--人员编号,自增长用identity,从1

SQL 子查询,索引优化

场景 索引优化 单列索引 多列索引 索引覆盖 排序 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 数据100条 学生表: create table Student( id int PRIMARY KEY, name varchar(10) ) 数据70000条 学生成绩表SC CREATE table SC( sc_id int PRIMARY KEY

关于SQL子查询的一个问题

今天在翻看工具书的时候,发现了一个sql语句: select cust_name, cust_state, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name; 在子查询中居然可以直接使用外部的customers表中的cust_id字段进行where条件限制,瞬间就感觉到好像哪里不对劲. 真的可以这样写吗?明天到环境上执

图解SQL子查询实例

1 创建示例表 先创建示例表: ------------------------- -- Create Customers table ------------------------- CREATE TABLE Customers ( cust_id char(10) NOT NULL , cust_name char(50) NOT NULL , cust_address char(50) NULL , cust_city char(50) NULL , cust_state char(5)

sql:判断+sql+子查询+关联查询

孵化园页面: public class MeimsServiceImpl implements MeimsService { private ParkinfoDomain parkinfoDomain; /**   * 动态监测主控查询   *   * @param parkName   *            孵化园名称   * @param parkType   *            孵化园类型   * @return List<Parkinfo>   */ @Override pu