实例简析SQL嵌套子查询

   实例简析SQL嵌套子查询:

  一些初级程序员常常对SQL语法中的子查询,由其对嵌套子查询(子查询中包含一个子查询)的使用比较生疏,本文就此做一个基本讲解,相信新手会有一定收获。

  使用子查询的原则

  1.一个子查询必须放在圆括号中。

  2.将子查询放在比较条件的右边以增加可读性。

  子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,

  并且如果指定了它就必须放在主 SELECT 语句的最后。

  ORDER BY 子句可以使用,并且在进行 Top-N 分析时是必须的。

  3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。

  子查询的类型

  单行子查询:从内 SELECT 语句只返回一行的查询

  多行子查询:从内 SELECT 语句返回多行的查询

  单行子查询

  单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中列出了单行操作符。

  例

  显示那些 job ID 与雇员 141 相同的雇员。

  SELECT last_name, job_id

  FROM employees

  WHERE job_id =

  (SELECT job_id

  FROM employees

  WHERE employee_id = 141);

  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);

  显示 job ID 与雇员 141 相同,并且薪水 高于雇员 143 的那些雇员。

  注:外和内查询可以从不同的表中取得数据。

  SELECT last_name, job_id, salary

  FROM employees

  WHERE salary =

  (SELECT MIN(salary)

  FROM employees);

  求所有人谁的工资最小。

  SELECT department_id, MIN(salary)

  FROM employees

  GROUP BY department_id

  HAVING MIN(salary) >

  (SELECT MIN(salary)

  FROM employees

  WHERE department_id = 50);

  求每个部门的最小工资,但是要高于50号部门的工资。

  SELECT employee_id, last_name

  FROM employees

  WHERE salary =

  (SELECT MIN(salary)

  FROM employees

  GROUP BY department_id);

  问题出现在:单行子查询返回了多个查询值;

  应改为:

  SELECT employee_id, last_name

  FROM employees

  WHERE salary in

  (SELECT MIN(salary)

  FROM employees

  GROUP BY department_id);

  SELECT last_name, job_id

  FROM employees

  WHERE job_id =

  (SELECT job_id

  FROM employees

  WHERE last_name = ’Haas’);

  如果子查询返回的是零值,不会对主程序造成影响;

  如果子查询返回的是空值,那么会影响主程序的返回值;

  SELECT employee_id,

  last_name

  FROM employees

  WHERE employee_id NOT IN

  (SELECT manager_id

  FROM employees)

  SELECT employee_id,

  last_name

  FROM employees

  WHERE employee_id NOT IN

  (SELECT manager_id

  FROM employees

  WHERE manager_id IS NOT NULL)

  放在select下的子查询的返回值必须是一个具体值,

  from后面也可以加子查询;

  having后面也可以加子查询;

  order by后面也可以;

  多列子查询适应于:成对比较;非成对比较。

  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 (178,174))

  AND employee_id NOT IN (178,174);

  输出:176 149 80

  只有要查询的东西和你子查询返回的东西一一对应上了,你的查询才能成功。

  如果有一个 对应不上那么你的查询不会成功。

  非成对的子查询:

  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);

  输出:144 124 50

  143 124 50

  142 124 50

  176 149 80

  上面两个程序就是成对子查询和非成对子查询两者之间的区别。

  如果我想去显示员工信息,要求:员工的工资高于本部门的平均工资。

  SELECT a.last_name,

  a.salary,

  a.department_id

  FROM employees a

  WHERE a.salary >

  (SELECT AVG(salary)

  FROM employees b

  WHERE b.department_id = a.department_id);

  in line view(内联视图)

  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;

  数据分散于多个表中需要进行拼合

  SELECT DISTINCT c.LastName, c.FirstName

  FROM Person.Contact c JOIN HumanResources.Employee e

  ON e.ContactID = c.ContactID WHERE EmployeeID IN

  (SELECT SalesPersonID

  FROM Sales.SalesOrderHeader

  WHERE SalesOrderID IN

  (SELECT SalesOrderID

  FROM Sales.SalesOrderDetail

  WHERE ProductID IN

  (SELECT ProductID

  FROM Production.Product p

  WHERE ProductNumber LIKE 'FW123%')));

时间: 2024-09-11 23:42:46

实例简析SQL嵌套子查询的相关文章

如何使用SQL Server嵌套子查询

很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询).现在,就让我们追本溯源地探究这个问题. 有两种子查询类型:标准和相关.标准子查询执行一次,结果反馈给父查询.相关子查询每行执行一次,由父查询找回.在本文中,我将重点讨论嵌套子查询(nested subqueries)(我将在以后介绍相关子查询). 试想这个问题:你想生成一个卖平垫圈的销售人员列表.你需要的数据分散在四个表格中:人员.联系方式(Person.Contact)

SQL Server数据库嵌套子查询的使用

很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询).现在,就让我们追本溯源地探究这个问题. 有两种子查询类型:标准和相关.标准子查询执行一次,结果反馈给父查询.相关子查询每行执行一次,由父查询找回.在本文中,我将重点讨论嵌套子查询(nested subqueries)(我将在以后介绍相关子查询). 试想这个问题:你想生成一个卖平垫圈的销售人员列表.你需要的数据分散在四个表格中:人员.联系方式(Person.Contact)

常用SQL语句(嵌套子查询/随机等等)详细整理_MsSql

1.SQL 插入语句得到自动生成的递增ID值 复制代码 代码如下: insert into Table1(Name,des,num) values ('ltp','thisisbest',10); select @@identity as 'Id' 2.实现是1 或0 想显示为男或女 复制代码 代码如下: select name,Sex=(case Sex when '1' then '男' when '0' then '女' end) from Tablename 3.嵌套子查询 复制代码 代

使用SQL Server数据库嵌套子查询的方法_MsSql

很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询).现在,就让我们追本溯源地探究这个问题.  有两种子查询类型:标准和相关.标准子查询执行一次,结果反馈给父查询.相关子查询每行执行一次,由父查询找回.在本文中,我将重点讨论嵌套子查询(nested subqueries)(我将在以后介绍相关子查询).  试想这个问题:你想生成一个卖平垫圈的销售人员列表.你需要的数据分散在四个表格中:人员.联系方式(Person.Contac

常用SQL语句(嵌套子查询/随机等等)详细整理

1.SQL 插入语句得到自动生成的递增ID值 复制代码 代码如下: insert into Table1(Name,des,num) values ('ltp','thisisbest',10); select @@identity as 'Id' 2.实现是1 或0 想显示为男或女 复制代码 代码如下: select name,Sex=(case Sex when '1' then '男' when '0' then '女' end) from Tablename 3.嵌套子查询 复制代码 代

使用SQL Server数据库嵌套子查询的方法

很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询).现在,就让我们追本溯源地探究这个问题.  有两种子查询类型:标准和相关.标准子查询执行一次,结果反馈给父查询.相关子查询每行执行一次,由父查询找回.在本文中,我将重点讨论嵌套子查询(nested subqueries)(我将在以后介绍相关子查询).  试想这个问题:你想生成一个卖平垫圈的销售人员列表.你需要的数据分散在四个表格中:人员.联系方式(Person.Contac

sql server子查询 问题

问题描述 sql server子查询 问题 一张表,现在多加一个字段 f__name ,sql server怎么通过子查询 插入进去f__name 解决方案 子查询的定义是:嵌入到其它SQL语句的select语句,又称为嵌套查询. 每个子查询语句都是一个select语句,所以它都有一个返回值. 这个返回值有以下3种情况: ①单个值 ②一个字段 ③一张表 使用子查询的目的,在于利用它的返回值. 图1 employee表 以下,我就根据它的3个返回值各举一个实例说明: 例①:显示employee表中

select-oracle 嵌套子查询求助

问题描述 oracle 嵌套子查询求助 select t.topic_id topicId, t.topic_tags topicTags, t.topic_content topicContent, t.topic_user topicUser from t_mm_topic t where t.topic_title like '%' and exists( select 1 from ( SELECT REGEXP_SUBSTR(t.topic_tags, '[^|]+', 1, LEVE

性能为王:SQL标量子查询的优化案例分析

黄廷忠(网名:认真就输) 云和恩墨技术专家 个人博客:http://www.htz.pw/ 本篇整理内容是黄廷忠在"云和恩墨大讲堂"微信分享中的讲解案例,SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能,从而为解决性能问题打下根基. 本篇为系列案例之一:标量子查询优化   以下案例来自于某省电信系统EDW性能优化实践,数据库版本为11.2.0.3,运行在ORACLE Exadata一体机上,是个典型的OLAP环境,表上