- 浏览: 1311560 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (732)
- Java_about (146)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (22)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
数据库sql语句的exists总结 sql exists in 学习
先来比较下语法:
--deals=交易表,areas=地域表,例如香港;我们的目的:查看有交易的地域
select * from areas where id in (select city_id from deals);
select * from areas where id in (select city_id from deals where deals.city_id = areas.id);
select * from areas where exists (select null from deals where deals.city_id = areas.id);
区别:
EXISTS语法并没有说哪个字段落在了子查寻的结果中,而是说exists后面的语句执行的结果是不是有记录,只要有记录,则主查询语句就成立。它代表‘存在’,用来引领嵌套查询的子查询,它不返回任何数据,只产生逻辑真值‘true’与逻辑假值‘False’。由EXISTS引出的子查询,其目标列表达式通常都用*(用null也可以),因为带有EXISTS的子查询只返回真值或假值,给出列名没有实际意义。
select * from areas where id in (select city_id from deals where deals.city_id = areas.id);
--子查询的关联其实是一样的,但子查询只要查到一个结果,就返回了,所以效率还是比较高些的
select * from areas where exists (select null from deals where deals.city_id = areas.id);
1.
EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then OUTPUT THE RECORD end if end loop 对于in和exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。 其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
另外IN时不对NULL进行处理
如: select 1 from dual where null in (0,1,2,null)
2.NOT IN与NOT EXISTS:
NOT EXISTS的执行流程 select ..... from rollup R where not exists ( select 'Found' from title T where R.source_id = T.Title_ID); 可以理解为: for x in ( select * from rollup ) loop if ( not exists ( that query ) ) then OUTPUT end if; end; 注意:NOT EXISTS与 NOT IN不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。 例如下面语句,看他们的区别: select x,y from t; x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 select * from t where x not in (select y from t t2 ) no rows select * from t where not exists (select null from t t2 where t2.y=t.x ) x y ------ ------ 5 NULL 所以要具体需求来决定 对于not in和 not exists的性能区别: not in只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join. 如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN在基于成本的应用中较好 比如: select ..... from rollup R where not exists ( select 'Found' from title T where R.source_id = T.Title_ID); 改成(佳) select ...... from title T, rollup R where R.source_id = T.Title_id(+) and T.Title_id is null; 或者(佳) sql> select /*+ HASH_AJ */ ... from rollup R where ource_id NOT IN ( select ource_id from title T where ource_id IS NOT NULL ) |
问题和解决
问题1:
--users表有1000条记录,id自增,id都大于0
select * from users where exists (select * from users limit 0); --输出多少条记录?
select * from users where exists (select * from users where id < 0); --输出多少条记录?
答案(请选中查看):
10000条
0条
原因:
exists查询的本质,只要碰到有记录,则返回true;所以limit根本就不会去管,或者说执行不到。
问题2:
exists可以完全代替in吗?
不能。
例如:
--没有关联字段的情况:枚举常量
select * from areas where id in (4, 5, 6);
--没有关联字段的情况:这样exists对子查询,要么全true,要么全false
select * from areas where id in (select city_id from deals where deals.name = 'xxx');
举个相关exists的sql优化例子:
9、用exists替代in(发现好多程序员不知道这个怎么用):
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。
在这种情况下,使用exists(或not exists)通常将提高查询的效率。
举例:
(低效)
select ... from table1 t1 where t1.id > 10 and pno in (select no from table2 where name like 'www%');
(高效)
select ... from table1 t1 where t1.id > 10 and exists (select 1 from table2 t2 where t1.pno = t2.no and name like 'www%');
10、用not exists替代not in:
在子查询中,not in子句将执行一个内部的排序和合并。
无论在哪种情况下,not in都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。
为了避免使用not in,我们可以把它改写成外连接(Outer Joins)或not exists。
11、用exists替换distinct:
当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct. 一般可以考虑用exists替换
举例:
(低效)
select distinct d.dept_no, d.dept_name from t_dept d, t_emp e where d.dept_no = e.dept_no;
(高效)
select d.dept_no, d.dept_name from t_dept d where exists (select 1 from t_emp where d.dept_no = e.dept_no);
exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.
12、用表连接替换exists:
通常来说,采用表连接的方式比exists更有效率。
举例:
(低效)
select ename from emp e where exists (select 1 from dept where dept_no = e.dept_no and dept_cat = 'W');
SELECT ENAME
(高效)
select ename from dept d, emp e where e.dept_no = d.dept_no and dept_cat = 'W';
R
R
R
R
R
R
发表评论
-
【Mysql】Windows下data文件迁移到别的磁盘,win10_win7开发机磁盘满了怎么办?
2022-01-04 17:21 219= = = 网上的处理办法是: 1备份数据。 ... -
【转】MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结
2020-04-12 15:54 677= = = (一) 数据类型测试 (1). 布尔类型 ... -
IDEA连接mysql又报错!Server returns invalid timezone.
2020-04-08 11:10 410= 解决方法: 在sql ... -
mysql.sock作用-解决mysql.sock直接找不到了的问题-重新生成mysql.sock
2018-04-11 14:48 4899= = = mysql.sock作用-解决mysql. ... -
Mybatis之foreach批量insert返回主键id列表_Jdbc批量插入并返回主键id列表
2017-01-17 17:35 24332016/05/14 14:14 然而官方已经修复了 @a ... -
Mysql的wait_timeout解决-MySQL查看和修改wait_timeout
2015-07-23 19:45 6219mysql存在一项属性“wait_timeout”, ... -
Ubuntu_Mysql_移动数据存储位置_软连接失败_软连接var目录失败
2013-06-10 23:48 2194linux系统对权限的控制很好,但也成为各种问题的多 ... -
DB-Mysql-Can't connect to local MySQL server through socket '/var/run/mysqld/mys
2013-04-24 11:03 1627错误病症: Error: Can't connec ... -
(摘)DB_MySql_命令行_SQL结果_导出到文本_方法小结
2012-05-20 00:01 1491点评:第3个方法很好阿! 有时候需要把数据 ... -
MySQL_使用group_distinct后_如何得到总记录数(行数)
2012-03-22 19:48 2033MySQL_使用group_distinct ... -
MySQL_用一条SQL语句删除重复记录
2011-12-08 13:51 1655MySQL 一条SQL语句删除重复记录 不正确的 ... -
MySQL_导入导出工具mysqlimport用法详解
2011-09-30 17:00 2924MySQL_导入导出工具mys ... -
Mysql_mysqldump命令错误解决_
2011-09-30 16:16 1571Error|错误: mysqldump: Got er ... -
Mysql_不能用ip链接_能用localhost127.0.0.1链接_Ubuntu
2011-09-30 13:57 2929Mysql_不能用ip链接_能用localhost 和 ... -
Mysql_字符集设置
2011-09-20 22:48 1262Linux Ubuntu ubuntu上mys ... -
Mysql_字符串函数大全
2011-08-23 16:41 1098如果结果的长度大于服务器参数max_allowed ... -
查看memcache状态及缓存命中_持续整理中
2011-08-04 15:44 1920先占个位置: 之前是在使用网上有人用 ... -
Sql_拾疑_整理_搜集
2011-08-03 19:24 1168MYSQL是目前用的,如有变化,会说明。 #Union ... -
Mysql_AddOrUpdate_A better way to add or update MySQL rows
2011-03-03 13:11 1463有时候,这个东西能省略不少事情~ INSERT I ... -
Mysql_关联表update
2011-03-02 21:34 3063Mysql中的update语句,可以关联表,可以同时更新几张表 ...
相关推荐
下面将对ORACLE数据库SQL语句编写优化进行详细的总结。 首先,选择适合的ORACLE优化器至关重要。ORACLE提供了三种优化器模式:RULE(基于规则)、COST(基于成本)和CHOOSE(选择性)。在实际应用中,数据库管理员...
根据给定的信息,本文将对“全国省市区数据库SQL语句”进行详细的解析与扩展,以便更好地理解如何创建和管理一个包含中国所有省份信息的数据库。 ### 一、数据库及表结构创建 #### 1. 创建数据库 在SQL Server中,...
MYSQL数据库SQL语句的基本使用 MYSQL数据库SQL语句是MYSQL数据库管理系统中使用的标准语言,用于管理和操作数据库。下面是MYSQL数据库SQL语句的基本使用知识点: 一、数据库操作 * 创建数据库:create database ...
本资料“ORACLE数据库SQL语句编写优化总结”深入探讨了如何有效地编写和优化SQL语句,以达到最佳的查询效率。 1. **理解执行计划** - **执行计划**是Oracle解析SQL语句后确定的数据获取策略,了解执行计划可以帮助...
SQL 数据库常用语句详解 在本篇文章中,我们将对 SQL 数据库常用语句进行详细的解释和分析。这些语句涵盖了基本的查询语句、连接语句、聚合函数、子查询等多方面的内容,旨在帮助读者更好地掌握 SQL 语言的使用。 ...
SQL 语句全解 VF 数据库 SQL(Structured Query Language),即结构化查询语言,是一种特殊目的的编程语言,设计用于管理关系数据库管理系统(RDBMS)。SQL 语句是 DBMS 的核心语言,用于存储、修改和检索数据。 ...
Oracle数据库SQL语句的编写和优化对于提升数据库性能至关重要。以下是对这些优化策略的详细解释: 1、**选用适合的Oracle优化器**:Oracle数据库有多种优化器,如成本基于的优化器(CBO)和规则基于的优化器(RBO)...
### Oracle数据库SQL语句优化策略 #### 一、Oracle优化器模式 Oracle数据库提供了三种主要的优化器模式:基于规则的优化器(RULE)、基于成本的优化器(COST)和基于选择的优化器(CHOOSE)。这三种模式分别对应着...
Oracle数据库的SQL语句优化是提升数据库性能的关键环节,它涉及到多个方面,包括查询规划、数据访问策略、语句简洁性以及事务管理等。以下是对这些优化策略的详细阐述: 1. **选用适合的ORACLE优化器**:Oracle...
数据库SQL语句是数据库管理的核心,它用于创建、更新、查询和操纵数据库中的数据。以下是一些关于SQL语句的重点知识: 1. **定义表**: 使用`CREATE TABLE`语句来创建一个新的表,例如: ```sql CREATE TABLE ...
《关系数据库SQL语句的设计优化研究》这篇论文深入探讨了如何优化关系数据库中的SQL语句以提高性能。SQL,即结构化查询语言,是数据库管理系统的基石,用于高效获取和维护数据,确保数据的安全性、完整性和可用性。...
本篇文章将全面总结SQL语句的基础知识,为数据库学习者提供基础指导。 1. **查询操作** - **查表结构**:使用`DESC 数据表名`可以查看表的字段名称、数据类型和是否允许为空等信息。 - **单表查询** - **简单...
通过以上内容的学习,我们可以看到SQL语言的强大之处,它不仅能够帮助我们管理数据库,还能让我们灵活地处理数据,进行高效的数据查询与操作。无论是对于初学者还是高级用户来说,掌握这些基本的SQL命令都是非常重要...
根据给定的信息,我们可以总结出一系列重要的SQL语句,这些语句涵盖了数据库操作中的多种常见场景,包括数据查询、数据插入、数据更新与删除等核心功能。下面将对这些SQL语句进行详细解释。 #### 1. 复制表结构及...
在Oracle数据库中,SQL语句的性能调整是系统优化的关键环节,尤其是在面对大量数据时,高效的SQL能够显著提升系统的响应速度和可用性。Oracle数据库通过使用索引来加快对表的遍历,但SQL语句的编写方式直接影响到...
- 每次循环中,都会生成并执行一个检查表中是否存在匹配项的SQL语句。 ```sql FETCH NEXT FROM tbcursor INTO @s WHILE @@FETCH_STATUS = 0 BEGIN EXEC (@s) FETCH NEXT FROM tbcursor INTO @s END ``` ##...
Oracle数据库SQL优化是一个关键的技能,对于提升数据库性能和应用响应速度至关重要。以下是一些针对非DBA的Oracle SQL优化技巧: 1. **选择最有效的表名顺序**:在FROM子句中,应将记录最少的表放在最前面,基础表...
SAP HANA数据库SQL参考手册详细介绍了这些规则和约定,为数据库管理员和开发人员提供了一个全面的指南,帮助他们在SAP HANA平台上有效地执行SQL操作。该手册不仅涵盖了基础知识,如数据类型、操作符和函数,还包括...
本篇将详细介绍C#如何与SQL Server数据库进行连接,并探讨基本的SQL语句,包括增、删、改、查等操作。 首先,建立C#与SQL Server数据库的连接是所有操作的基础。这通常通过ADO.NET框架中的SqlConnection类来实现。...