mysql复杂查询--多表查询

mysql复杂查询--多表查询,第1张

多表查询是指基于两个和两个以上的表或是视图的查询.在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)

自连接是指在同一张表的连接查询

select * from emp where empno=(select mgr from emp where ename='ford')

子查询是指嵌入在其它sql查询语句中的select语句,也叫嵌套查询

单行子查询是 指只返回一行数据的子查询语句

select * from emp where deptno=(select deptno from emp where ename='smith')

多行子查询指返回多行数据的子查询 使用关键字 in

如果我们的一个子查询,返回的 结果是多列,就叫做列子查询

合并多个select语句的结果,可以使用集合 *** 作符 union,union all

1、首先,在一个查询中的查询结果作为外层查询的条件,可以用IN关键字,代码如下图所示。

2、其次,外层查询的条件不在内层查询结果,可以用NOT IN关键字,代码如下所示。

3、使用EXISTS关键字查询时,内层查询语句不返回查询的记录,而是返回一个Boolean值;当内层查询返回的值为true时,外层查询语句将进行查询,如果返回false时,将不进行查询或查询结果为空,代码如下所示。

4、由第三步可知,与EXISTS相对的是NOT EXISTS,当内层查询返回的值为false时,外层查询语句将进行查询,如果返回true时,将不进行查询或查询结果为空,代码如下。

5、满足其中的任一条件,就可以通过该条件来执行外层查询语句,用关键字ANY,代码如下。

6、满足所有条件,只有满足内层查询语句返回所有结果,代码如下所示,就完成了。

这边先给你提供一个动态SQL

select

*

from

table

where

1=1 //这一步是针对所有条件均未满足(where后必须跟子句)

if(name != "" and name!=null){ and name=条件一}

if(sex != "" and sex!=null){ and sex=条件二}

。。。。。。

个人解题思路

第一种:

不额外创建表(连接查询)

首先,将所有条件单独查询并将这些语句内连接

例:

select * from tb as t1

join

(select * from tb where name=条件) as t2

on

t1.id=t2.id

join

(select * from tb where age=条件) as t3

on

t1.id=t2.id

(join........ on .......)

where

t1.sex=条件

然后 将上面的查询结果看作一个表t

select t.*,count(t.id) from t

group by t.id // 以id分组

order by count(t.id) asc //以id数量为降序

limit(0,1) //取第一行值


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存