select 1 from和exists

本文详细解释了SQL中EXISTS子句的使用方法及其背后的原理,包括如何利用EXISTS优化查询效率,以及与COUNT和SELECT *等语句的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

EXISTS

指定一个子查询,检测行的存在。 

语法

EXISTS subquery

参数

subquery

是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见select中有关子查询的讨论。

结果类型

Boolean

结果值

如果子查询包含行,则返回 TRUE。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。exists引导的子句有结果集返回,那么exists这个条件就算成立了,

http://www.cnblogs.com/fredlau/articles/993829.html

http://www.cnblogs.com/mytechblog/articles/2105785.html

http://blog.csdn.net/xiwu1616/article/details/14160855/

[sql]  view plain  copy
  1. <span style="font-size:14px;"Insert into DGDISTRIBUTOR (DGDISTRIBUTORID,ORGCODE,ORGNAME,USERID,DATELASTUPDATED)   
  2.  select DGDISTRIBUTORseq.nextval,'52004096','丹东市第二人民医院',100005690,sysdate from DGDISTRIBUTOR  
  3.  where ROWNUM<=1 and not exists (select * from DGDISTRIBUTOR where orgcode = '52004096')</span>  

1、select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。

2、查看记录条数可以用select count(1) from mytable;等价于select count(*) from mytable;

select * from organization where 1=1 and exists(select 1 from organization where orgid >1999999);

1=1为保护作用,在拼装SQL语句时,当后面的条件不成立时有可能会导致整个语句异常。因为where后面不能为空。

当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似“select 1 from tblName”是一个很不错的SQL语句写法,它通常用于子查询。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。

下面举例示范这种写法的常见用法:

1)列出每个班的学生人数

常规写法

1
2
select  class, count  (*)  as  pax  from  students 
group  by  class;

更优写法

1
2
select  class, count  (1)  as  pax  from  students 
group  by  class;

2)列出每个班最年轻的学生资料

常规写法

1
2
3
select  a.*  from  students a  where  not  exists(
select  b.sid  from  students b  where  b.sid=a.sid 
and  b.date_birth>a.date_birth);

更优写法

1
2
3
select  a.*  from  students a  where  not  exists(
select  from  students b  where  b.sid=a.sid 
and  b.date_birth>a.date_birth);
<think>我们正在讨论MySQL中的SELECT查询,特别是带有WHERE子句的条件查询。 根据用户提供的引用,我们可以总结如下: 1. WHERE子句用于指定查询条件,可以包含多个条件,使用AND、OR连接。 2. 条件可以是精准匹配、模糊匹配(使用LIKE)、范围查询(使用BETWEEN...AND或IN)等。 3. 子查询可以作为WHERE子句的条件,例如使用IN子句。 用户的问题:MySQL SELECT * FROM table WHERE 条件 查询用法 我们将按照以下结构回答: 1. 基本语法 2. 条件类型(精准查询、模糊查询、范围查询等) 3. 组合条件(AND, OR, NOT) 4. 使用子查询作为条件 5. 注意事项(例如空值处理) 同时,我们根据引用中的内容进行说明,并在适当位置添加引用标识。 注意:用户提供的引用中,引用[1]是一个子查询的例子,引用[2][3][4]介绍了WHERE条件查询的基本用法,引用[5]提到了排序,但用户问题主要关注WHERE条件。 开始回答:</think>### MySQL SELECT 查询用法详解(WHERE 条件) **基本语法结构**: ```sql SELECT [字段列表] FROM [表名] WHERE [查询条件]; ``` - `SELECT *`:返回所有字段(实际开发中建议明确指定字段) - `WHERE`:过滤数据的核心子句,支持多种条件类型 --- #### 一、WHERE 条件类型 1. **精准匹配** ```sql SELECT * FROM users WHERE id = 1001; -- 数字精确匹配 SELECT * FROM products WHERE name = '手机'; -- 字符串精确匹配(注意引号) ``` 2. **模糊查询**(`LIKE` + 通配符) ```sql SELECT * FROM books WHERE title LIKE '%数据库%'; -- 包含"数据库"的标题 ``` - `%`:任意长度字符(例:`张%` 匹配"张三"、"张伟明") - `_`:单个字符(例:`user_` 匹配"user1"、"userA") 3. **范围查询** ```sql SELECT * FROM orders WHERE amount BETWEEN 100 AND 500; -- 金额在100到500之间 SELECT * FROM employees WHERE dept_id IN (101, 203, 307); -- 部门ID在指定集合内 ``` 4. **空值判断** ```sql SELECT * FROM customers WHERE phone IS NULL; -- 查找未填电话的客户 ``` --- #### 二、多条件组合 | 逻辑运算符 | 示例 | 说明 | |------------|------------------------------------------|--------------------------| | `AND` | `WHERE age>18 AND status='active'` | 同时满足两个条件 | | `OR` | `WHERE city='北京' OR city='上海'` | 满足任意一个条件 | | `NOT` | `WHERE NOT department='HR'` | 排除指定条件 | | `()` | `WHERE (score>90 OR award=true) AND grade=3` | 优先级控制 | **示例**: ```sql SELECT * FROM students WHERE (math_score > 90 OR english_score > 85) AND class_id = 'A203'; ``` --- #### 三、子查询作为条件 通过子查询动态生成条件值(引用[^1]): ```sql SELECT * FROM employees WHERE department_id IN ( SELECT dept_id FROM departments WHERE location = '北京总部' -- 子查询返回北京部门的ID列表 ); ``` --- #### 四、注意事项 1. **性能优化** - 避免 `SELECT *`,明确指定所需字段 - 对 `WHERE` 条件字段建立索引(如 `id`, `phone` 等高频查询字段) - 范围查询(`BETWEEN`, `>`)可能导致索引失效 2. **空值处理** - 使用 `IS NULL`/`IS NOT NULL` 判断空值(`= NULL` 无效) - 聚合函数(如 `COUNT()`)默认忽略 `NULL` 值[^3] 3. **日期比较** ```sql SELECT * FROM logs WHERE create_time > '2023-01-01 00:00:00'; -- 注意日期格式 ``` > 关键提示:复杂的 `WHERE` 条件建议先用 `EXPLAIN` 分析执行计划。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值