sql语句中where条件的嵌套子查询性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句中where条件的嵌套子查询性能相关的知识,希望对你有一定的参考价值。
select * from table1 where ID in (select ID from table2 where ID is not null)
table1中有10行数据
上面的语句被执行时.嵌套子语句被执行10次还是1次?
查询时,table1表中的每个元组会依次跟table2中的满足条件的元组进行比较,所以嵌套子语句被执行的次数为10K次。 参考技术A 10次!
嵌套子语句 是 被 主语句调用 而筛选 满足条件
所以 嵌套子语句 是被调用了10次 !本回答被提问者采纳 参考技术B 子查询:
使用子查询的原则
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; 参考技术C 1次
SQL语句where多条件查询怎么写
select * from table where a=b or b=c or c=d and id>100用or 和 and,
上面的意思是找到TABLE表里,条件为:A=B或者B=C或者C=D,而且这条数据ID>100的。。。
注意不同数据库用法不同,不过比较类似MSSQL MYSQL,只是一些语法上的不一样。
条件用
OR,或者,只要满足一个条件,
AND条件都满足,
看你自己需求来写。
select * from a
where b like '%1%'
and b like '%2%'
and b like '%3%'
and c not like '%4%'
以上是关于sql语句中where条件的嵌套子查询性能的主要内容,如果未能解决你的问题,请参考以下文章