MySQL的子查询中FROM和EXISTS子句的使用教程

MySQL的子查询中FROM和EXISTS子句的使用教程,第1张

FROM

子查询

FROM

子句中的子查询

MySQL

FROM

子查询是指

FROM

子句作为子查询语句,主查询再到子查询结果中获取需要的数据。FROM

子查询语法如下:

SELECT

...

FROM

(subquery)

AS

name

...

子查询会生成一个临时表,由于

FROM

子句中的每个表必须有一个名称,因此

AS

name

是必须的。FROM

子查询也称为衍生数据表子查询。

FROM

子查询实例

table1:

s1

s2

1

5

2

12

3

20

FROM

子查询

SQL

如下:

SELECT

s1,s2

FROM

(SELECT

s1,

s2*2

AS

s2

FROM

table1)

AS

temp

WHERE

s1

>

1

查询返回结果如下所示:

s1

s2

2

24

3

40

提示

MySQL

FROM

子句中的子查询可以返回标量、列、行或表,但不能为有关联的子查询。

MySQL

子查询

EXISTS

NOT

EXISTS

MySQL

EXISTS

NOT

EXISTS

子查询

MySQL

EXISTS

NOT

EXISTS

子查询语法如下:

SELECT

...

FROM

table

WHERE

EXISTS

(subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE

FALSE)来决定主查询的数据结果是否得以保留。

MySQL

EXISTS

子查询实例

下面以实际的例子来理解

EXISTS

子查询。下面是原始的数据表:

article

文章表:

user

用户表:

我们要查出

article

表中的数据,但要求

uid

必须在

user

表中存在。SQL

语句如下:

SELECT

*

FROM

article

WHERE

EXISTS

(SELECT

*

FROM

user

WHERE

article.uid

=

user.uid)

返回查询结果如下:

从语句执行结果可以看出,article

表中第

4

条记录没有被保留,原因就是该条记录的数据在子查询中返回的结果是

FALSE

当上面的

SQL

使用

NOT

EXISTS

时,查询的结果就是

article

表中

uid

不存在于

user

表中的数据记录。

提示

EXISTS

(subquery)

只返回

TRUE

FALSE,因此子查询中的

SELECT

*

也可以是

SELECT

1

或其他,官方说法是实际执行时会忽略

SELECT

清单,因此没有区别。

EXISTS

子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。

EXISTS

子查询往往也可以用条件表达式、其他子查询或者

JOIN

来替代,何种最优需要具体问题具体分析。

在我们使用MySQL数据库时,比较常用也是查询,包括基本查询,关联查询,条件查询等等,对于同一个 *** 作,SQL语句的实现有很多种写法,但是不同的写法查询的性能可能会有很大的差异。这里主要介绍下select查询优化的要点。

1. 使用慢查询日志去发现慢查询。

2. 使用执行计划去判断查询是否正常运行。

3. 总是去测试你的查询看看是否他们运行在最佳状态下 –久而久之性能总会变化。

4. 避免在整个表上使用count(*),它可能锁住整张表。

5. 使查询保持一致以便后续相似的查询可以使用查询缓存。

6. 在适当的情形下使用GROUP BY而不是DISTINCT。

7. 在WHERE, GROUP BY和ORDER BY子句中使用有索引的列。

8. 保持索引简单,不在多个索引中包含同一个列。

9. 有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX。

10. 检查使用SQL_MODE=STRICT的问题。

11.对于记录数小于5的索引字段,在UNION的时候使用LIMIT不是是用OR.

12. 为了 避免在更新前SELECT,使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去实现。

3. 不要使用 MAX,使用索引字段和ORDER BY子句。

14. 避免使用ORDER BY RAND().

15. LIMIT M,N实际上可以减缓查询在某些情况下,有节制地使用。

16. 在WHERE子句中使用UNION代替子查询。

17. 对于UPDATES(更新),使用 SHARE MODE(共享模式),以防止独占锁。

18. 在重新启动的MySQL,记得来温暖你的数据库,以确保您的数据在内存和查询速度快。

19. 使用DROP TABLE,CREATE TABLE DELETE FROM从表中删除所有数据。

20. 最小化的数据在查询你需要的数据,使用*消耗大量的时间。

21. 考虑持久连接,而不是多个连接,以减少开销。

22. 基准查询,包括使用服务器上的负载,有时一个简单的查询可以影响其他查询。

23. 当负载增加您的服务器上,使用SHOW PROCESSLIST查看慢的和有问题的查询。

24. 在开发环境中产生的镜像数据中 测试的所有可疑的查询。

来源:PHP程序员雷雪松的博客

where和having的区别是

where子句对一个表的所有记录进行 *** 作,只搜索与指定条件相匹配的记录。

而having子句只对经过 *** 作的表记录进行检索,对结果集进行更进一步的筛选。

通常,having子句和group by子句相连,而where子句和select,delete和update语句相连。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7268637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存