mysql 连表查询和连接查询的区别

mysql 连表查询和连接查询的区别,第1张

多表查询

SELECT * FROM a,b WHERE a.val = b.val

连接查询

SELECT * FROM a LEFT JOIN b ON a.val = b.val

重点:其实两种都是连接查询

多表查询即自然连接查询,如下

SELECT * FROM a join b WHERE a.val = b.val

自然连接查询:默认使用主键进行连接,且不能改变(即不需要on关键字),可通过where子句进行条件筛选,这也是和其他连接查询最大的不同

要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT

*

FROM

tablename

ORDER

BY

RAND()

LIMIT

1。

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER

BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL

3.23版本中,仍然可以通过ORDER

BY

RAND()来实现随机。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER

BY

子句中会被执行多次,自然效率及很低。

复制代码

代码如下:

You

cannot

use

a

column

with

RAND()

values

in

an

ORDER

BY

clause,

because

ORDER

BY

would

evaluate

the

column

multiple

times.

搜索Google,网上基本上都是查询max(id)

*

rand()来随机获取数据。

复制代码

代码如下:

SELECT

*

FROM

`table`

AS

t1

JOIN

(SELECT

ROUND(RAND()

*

(SELECT

MAX(id)

FROM

`table`))

AS

id)

AS

t2

WHERE

t1.id

>=

t2.id

ORDER

BY

t1.id

ASC

LIMIT

5

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

下面的语句采用的是JOIN,mysql的论坛上有人使用

复制代码

代码如下:

SELECT

*

FROM

`table`

WHERE

id

>=

(SELECT

FLOOR(

MAX(id)

*

RAND())

FROM

`table`

)

ORDER

BY

id

LIMIT

1

再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。

完整查询语句是:

复制代码

代码如下:

SELECT

*

FROM

`table`

2

WHERE

id

>=

(SELECT

floor(

RAND()

*

((SELECT

MAX(id)

FROM

`table`)-(SELECT

MIN(id)

FROM

`table`))

+

(SELECT

MIN(id)

FROM

`table`)))

3

ORDER

BY

id

LIMIT

1

复制代码

代码如下:

SELECT

*

FROM

`table`

AS

t1

JOIN

(SELECT

ROUND(RAND()

*

((SELECT

MAX(id)

FROM

`table`)-(SELECT

MIN(id)

FROM

`table`))+(SELECT

MIN(id)

FROM

`table`))

AS

id)

AS

t2

WHERE

t1.id

>=

t2.id

ORDER

BY

t1.id

LIMIT

1

最后在php中对这两个语句进行分别查询10次,

前者花费时间

0.147433

后者花费时间

0.015130

看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。


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

原文地址: http://outofmemory.cn/zaji/8729142.html

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

发表评论

登录后才能评论

评论列表(0条)

保存