select * from enp e left join student s on s.eid in(select n.id from enp n where n.pid = e.id and n.pid!=0) where e.pid=0
时间: 2024-04-23 19:22:19 浏览: 169
这是一个带子查询和左连接的SQL语句,其作用是查询所有pid为0的企业(enp)信息,同时将其下属的学生(student)信息也一并查询出来。
具体执行过程如下:
1. 执行子查询,查找所有pid不为0且与当前查询的企业(enp)id相同的企业(enp)id,得到一个结果集。
2. 将子查询的结果集与学生(student)表进行左连接,连接条件为学生表中的eid等于子查询结果集中的id。
3. 将左连接的结果集再与企业(enp)表进行左连接,连接条件为企业表中的id等于学生表中的eid。
4. 在左连接的结果集中筛选出pid为0的企业(enp)信息。
需要注意的是,该SQL语句中使用了子查询,可以导致查询效率较低,需要谨慎使用。
相关问题
SELECT id FROM ex_exam a LEFT JOIN ex_exam_statistic_enp_evaluate b ON a.id = b.qlh_exam_id WHERE a.type IN ("EXAM_EX_NORMAL_TYPE_NORMAL", "EXAM_TYPE_RZ") AND b.qlh_exam_id IS NULL 分批查
对于数据量比较大的查询,可以考虑分批查询,将查询结果分批返回,以降低单次查询的数据量,避免超时等问题。以下是一种分批查询的方法:
1. 首先确定每次查询的数据量,例如每次查询 1000 条数据。
2. 在查询语句中增加一个分页参数,例如 LIMIT offset,limit,其中 offset 表示查询的起始位置,limit 表示每次查询的数据量。初始时,offset 的值为 0,limit 的值为每次查询的数据量。
3. 执行查询语句,并将查询结果返回。如果查询结果的行数等于 limit 的值,则说明还有更多数据需要查询,此时将 offset 的值增加 limit,继续执行查询,直到查询结果的行数小于 limit 的值为止。
4. 将所有查询结果合并成一个结果集,并将其返回给客户端。
例如,对于上述查询语句,可以进行如下分批查询:
```
// 每次查询 1000 条数据
const batchSize = 1000
let offset = 0
let limit = batchSize
// 保存所有查询结果的数组
const result = []
while (true) {
const sql = `SELECT id
FROM ex_exam a
LEFT JOIN ex_exam_statistic_enp_evaluate b
ON a.id = b.qlh_exam_id
WHERE a.type IN ("EXAM_EX_NORMAL_TYPE_NORMAL", "EXAM_TYPE_RZ")
AND b.qlh_exam_id IS NULL
LIMIT ${offset}, ${limit}`
// 执行查询语句
const rows = db.query(sql)
// 如果查询结果的行数小于 limit,则说明已经查询完毕
if (rows.length < limit) {
result.push(...rows)
break
}
// 将查询结果保存到结果数组中
result.push(...rows)
// 更新 offset 和 limit 的值,继续查询下一批数据
offset += limit
}
// 返回所有查询结果
return result
```
需要注意的是,分批查询可能会增加查询的复杂度,同时也会占用更多的资源和时间。因此,需要根据实际情况评估是否需要进行分批查询。
SELECT id FROM ex_exam a where a.type in ("EXAM_EX_NORMAL_TYPE_NORMAL", "EXAM_TYPE_RZ") AND NOT EXISTS ( SELECT 1 FROM ex_exam_statistic_enp_evaluate b WHERE a.id = b.qlh_exam_id ) 替换为 left join
可以将该 SQL 查询语句中的 "NOT EXISTS" 替换为 "LEFT JOIN",得到以下 SQL 查询语句:
```
SELECT id
FROM ex_exam a
LEFT JOIN ex_exam_statistic_enp_evaluate b
ON a.id = b.qlh_exam_id
WHERE a.type IN ("EXAM_EX_NORMAL_TYPE_NORMAL", "EXAM_TYPE_RZ")
AND b.qlh_exam_id IS NULL;
```
这里使用了 "LEFT JOIN" 将两个表连接起来,并在 "WHERE" 子句中过滤掉右侧表中没有匹配的行。如果右侧表中没有匹配的行,则 "b.qlh_exam_id" 的值为 NULL。因此,使用 "IS NULL" 来判断是否存在匹配的行。
阅读全文