文档章节

子查询和高级子查询

bharals
 bharals
发布于 2017/05/19 17:03
字数 1193
阅读 1
收藏 0
--  谁的工资比 Abel 高
SELECT salary FROM employees WHERE last_name='Abel';
SELECT last_name, salary FROM employees WHERE salary>=11000;
SELECT last_name, salary FROM employees WHERE salary>=(SELECT salary FROM employees WHERE last_name='Abel');
--  子查询一般是哪个条件未知
--  子查询要包含在括号内。
--  将子查询放在比较条件的右侧。
--  单行操作符对应单行子查询,多行操作符对应多行子查询。

--  返回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);
--  在子查询中使用组函数    题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary
            FROM   employees
            WHERE  salary = 
                            (SELECT MIN(salary)
                             FROM   employees);
--  子查询中的 HAVING 子句     首先执行子查询。向主查询中的HAVING 子句返回结果。
--  题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT   department_id, MIN(salary)
FROM     employees
GROUP BY department_id
HAVING   MIN(salary) >
                       (SELECT MIN(salary)
                        FROM   employees
                        WHERE  department_id = 50);


--  多行子查询   IN: 等于列表中任意一个   ANY:  和子查询返回的某个值比较  ALL:和子查询返回的所有值比较
--  1、在多行子查询中使用 ALL 操作符  
--  题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary
                        FROM   employees
                        WHERE  salary < ALL
                                            (SELECT salary
                                             FROM   employees
                                             WHERE  job_id = 'IT_PROG')
                        AND    job_id <> 'IT_PROG';
--  2、子查询中的空值问题
SELECT emp.last_name
                        FROM   employees emp
                        WHERE  emp.employee_id NOT IN
                                                     (SELECT mgr.manager_id
                                                      FROM   employees mgr);

--  NO ROWS selected




--  高级子查询
SELECT last_name
FROM   employees
WHERE  salary > 
                (SELECT salary
                 FROM   employees
                 WHERE  employee_id = 149) ;

--查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_id, manager_id, department_id  
--成对比较
SELECT	employee_id, manager_id, department_id
FROM	employees
WHERE  (manager_id, department_id) IN
                      (SELECT manager_id, department_id
                       FROM   employees
                       WHERE  employee_id IN (141,174))
AND	employee_id NOT IN (141,174);
--不成对比较举例
SELECT  employee_id, manager_id, department_id
FROM    employees
WHERE   manager_id IN                   (SELECT  manager_id
                   FROM    employees
                   WHERE   employee_id IN (174,141))
AND     department_id IN                   (SELECT  department_id
                   FROM    employees
                   WHERE   employee_id IN (174,141))
AND	employee_id NOT IN(174,141);
--在 FROM 子句中使用子查询
--问题:返回比本部门平均工资高的员工的last_name, department_id, salary及平均工资
-- 方法一:
select last_name,department_id,salary,
(select avg(salary)from employees e3 
where e1.department_id = e3.department_id 
group by department_id) avg_salary
from employees e1
where salary > 
         (select avg(salary)
          from employees e2  
          where e1.department_id = e2.department_id
          GROUP BY department_id
          );
--方法二:
SELECT  a.last_name, a.salary, 
        a.department_id, b.salavg
FROM    employees a, (SELECT   department_id, 
                      AVG(salary) salavg
                      FROM     employees
                      GROUP BY department_id) b
WHERE   a.department_id = b.department_id
AND     A.salary > b.salavg;

--单列子查询应用举例
--在 CASE 表达式中使用单列子查询
--问题:显式员工的employee_id,last_name和location。其中,
--若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’。
SELECT employee_id, last_name,
       (CASE
        WHEN department_id =
                
                 
        THEN 'Canada' ELSE 'USA' END) LOCATION
FROM   employees;
--在 ORDER BY 子句中使用单列子查询
--问题:查询员工的employee_id,last_name,要求按照员工的department_name排序
SELECT   employee_id, last_name
FROM     employees e
ORDER BY(SELECT department_name
 FROM departments d
 WHERE e.department_id = d.department_id);


--相关子查询举例
--问题:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
SELECT last_name, salary, department_id
FROM   employees outer
WHERE  salary >(SELECT AVG(salary)
                   FROM   employees
                   WHERE  department_id =  
                          OUTER.department_id) ;
--问题:若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id
SELECT e.employee_id, last_name,e.job_id
FROM   employees e 
WHERE  2 <= (SELECT COUNT(*)
             FROM   job_history 
             WHERE  employee_id = e.employee_id);


--EXISTS 操作符检查在子查询中是否存在满足条件的行
--如果在子查询中存在满足条件的行:
--不在子查询中继续查找
--条件返回 TRUE
--如果在子查询中不存在满足条件的行:
--条件返回 FALSE
--继续在子查询中查找

--问题:查询公司管理者的employee_id,last_name,job_id,department_id信息
SELECT employee_id, last_name, job_id, department_id
FROM   employees outer
WHERE  EXISTS ( SELECT 'X'
                 FROM   employees
                 WHERE  manager_id = 
                        OUTER.employee_id);
--问题:查询departments表中,不存在于employees表中的部门的department_id和department_name
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT 'X'
                  FROM   employees
                  WHERE  department_id 
                         = d.department_id);

--相关更新应用举例
ALTER TABLE employees
ADD(department_name VARCHAR2(14));
UPDATE employees e
SET    department_name = 
              (SELECT department_name 
	       FROM   departments d
	       WHERE  e.department_id = d.department_id);
--问题:删除表employees中,其与emp_history表皆有的数据
DELETE FROM employees E
WHERE employee_id =  
           (SELECT employee_id
            FROM   emp_history 
            WHERE  employee_id = E.employee_id);


--使用 WITH 子句, 可以避免在 SELECT 语句中重复书写相同的语句块
--WITH 子句将该子句中的语句块执行一次并存储到用户的临时表空间中
--使用 WITH 子句可以提高查询效率

--问题:查询公司中各部门的总工资大于公司中各部门的平均总工资的部门信息
WITH dept_costs  AS (
   SELECT  d.department_name, SUM(e.salary) AS dept_total
   FROM    employees e, departments d
   WHERE   e.department_id = d.department_id
   GROUP BY d.department_name),
avg_cost    AS (
   SELECT SUM(dept_total)/COUNT(*) AS dept_avg
   FROM   dept_costs)
SELECT * 
FROM   dept_costs 
WHERE  dept_total >
        (SELECT dept_avg 
         FROM avg_cost)
ORDER BY department_name;

© 著作权归作者所有

共有 人打赏支持
bharals
粉丝 0
博文 26
码字总数 46307
作品 0
私信 提问
ylb: SQL表的高级查询-子查询

ylbtech-SQL Server: SQL Server- SQL表的高级查询-子查询 SQL Server 表的高级查询-子查询。 1,ylb:表的高级查询-子查询返回顶部 --================================-- ylb:表的高级查询...

吞吞吐吐的
2017/09/06
0
0
ylb:SQL 表的高级查询-多表连接和子查询

ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询。 1,ylb:表的高级查询-多表连接和子查询返回顶部 --========================...

吞吞吐吐的
2017/10/14
0
0
Hibernate高级查询

@Test DDL创建表 hibernate标准化对象查询(QBC) 也即是把查询条件封装成一个对象,它支持运行时动态生成查询语句 Criteria接口 存放查询条件的容器 Critertion接口 代表一个查询条件,可以...

嘿嘿!!
2016/09/16
0
0
功能表单之树形选择字段类型的高级使用——JEPLUS软件快速开发平台

JEPLUS功能表单之树形选择字段类型的高级使用 JEPLUS功能表单中树形选择字段类型的目标字段在开发过程中还有一些高级配置和高级应用,如果知晓怎么配置也许能解决我们系统开发过程的大问题,...

JEPLUS
06/13
0
0
OrientDB 3.0.9 发布,多模 NoSQL 数据库

OrientDB 3.0.9 发布了,OrientDB 是兼具文档数据库的灵活性和图形数据库管理链接能力的可深层次扩展的文档-图形数据库管理系统。可选无模式、全模式或混合模式。支持许多高级特性,诸如 AC...

h4cd
10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(三)之NioEventLoop的线程(或者reactor线程)启动(一)

在第一章中,我们看关于NioEventLoopGroup的初始化,我们知道了NioEventLoopGroup对象中有一组EventLoop数组,并且数组中的每个EventLoop对象都对应一个线程FastThreadLocalThread,那么这个...

天空小小
今天
3
0
PHP动态扩展Redis模块

查看已有模块 [root@test-a ~]# /usr/local/php/bin/php -m[PHP Modules]bz2Core...zlib[Zend Modules] 下载包,解压,生成configure文件 [root@test-a ~]# cd /usr/local/src/[ro......

野雪球
今天
4
0
在Ignite中使用线性回归算法

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。 如果要找合适的数据集,会发现可用的有很多,但是对于...

李玉珏
今天
5
0
Mybatis应用学习——简单使用示例

1. 传统JDBC程序中存在的问题 1. 一个简单的JDBC程序示例: public class JDBCDemo {public static void main(String[] args) {Connection con=null;PreparedStatement statemen...

江左煤郎
今天
4
0
使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部