文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发SQL 学院 → 实例简析SQL嵌套子查询

实例简析SQL嵌套子查询

时间:2010/2/6 17:31:00来源:本站整理作者:我要评论(0)

实例简析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%')));

相关视频

    没有数据

相关阅读 Mac OS X 系统上如何升级 Mysql 数据库?PLSQL Developer怎么导出数据库PLSQL Developer配置Oralce11g连接plsql developer怎么使用 plsql developer使用教程plsql developer怎么连接数据库 plsql developer连接数据库教程SQL2008全部数据导出导入两种方法mysql数据库root密码忘记的修改方法SQL报表错误“未能为SSL/TLS安全通道建立信任关系”解决方法

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 sql 2000升级到sql 20sql server安装教程 安装sql 2005时visual studio just-in-timesql server停止和重启命令SQL Server备份和灾难恢复MySQL数据库十大优化技巧

人气排行 如何轻松解决MYSQL数据库连接过多的错误sql server停止和重启命令SQL报表错误“未能为SSL/TLS安全通道建立信sql 2000升级到sql 2005后访问速度变慢图文安装sql 2005时visual studio just-in-timeSqlServer2000获取当前日期及格式SQL的排序,分组,统计常用语句解决MySQL中文模糊查询问题