一、在Navicat中调试嵌套查询语句时总是报错,自己没有理解哪些地方要加括号,哪些地方要使用别名,总是报有语法错误,但是不知所云具体原因
只有这个知道其意义:
MySql 1248 - Every derived table must have its own alias
二、查询资料
一个查询中嵌套另一个查询,称为子查询
1、子查询必须放在小括号里
2、子查询可以出现在任意的位置。如(select,from,where,having等)
语法:
select(子查询)
from(子查询) 别名
where(子查询)
group by
having(子查询)
例:
查询工资比7566高的雇员工资
select * from emp where sal>(select sal form emp where empno = 7566);
总结
1、一般来说,多表连接查询都可以使用子查询替代,但有的子查询不能使用多表查询替代
2、子查询特点:灵活,方便,一般常作为增,删,该,查操作条件,适合于操作一个表数据
3、多表连接查询更适合于查看夺标中数据
select FAULT_ID, FAULT_NAME, DEVICE_NAME, FAULT_INFO, orderCondition
FROM
(
SELECT * FROM
(select id AS FAULT_ID, device_id, name AS FAULT_NAME, info AS FAULT_INFO from fdp_fault) as A
LEFT JOIN
(
SELECT * FROM
(select diagnose_faultid , count(diagnose_faultid) as orderCondition from FDP_TASK group by diagnose_faultid) AS B
)
AS C
ON A.FAULT_ID=C.diagnose_faultid
LEFT JOIN
(SELECT id, NAME as DEVICE_NAME FROM fdp_device) as D
ON A.device_id=D.id
ORDER BY orderCondition DESC
) AS E
如上使用了嵌套查询 和 多表连接。
另外在使用模糊查询是,使用concat进行字符串连接处理,当传入字符串为空时,效果如 like '%%' 即查询所有信息
<select id="pageSelectByFaultName" parameterType="string" resultMap="FaultResultMap">
select A.ID AS FAULT_ID, A.NAME AS FAULT_NAME, B.NAME AS DEVICE_NAME, A.INFO AS FAULT_INFO
from
(select id, device_id, name, info from fdp_fault where name like
concat(concat("%",#{faultName}),"%")
or
info like
concat(concat("%",#{faultName}),"%")
)
as A
JOIN fdp_device B
ON A.DEVICE_ID=B.ID
</select>
路漫漫....