假设有a(id)、b(id) 两个表,a left join b on a.id = b.id where b.id is not null 跟 a join b on a.id = b.id 有什么区别?
时间: 2024-06-01 21:08:54 浏览: 210
这两个查询语句的区别在于对于 a 表中没有匹配到 b 表中的记录时的处理方式不同。
- `a left join b on a.id = b.id where b.id is not null` 表示以 a 表为主表,左连接 b 表,只返回 a 表中与 b 表中存在匹配的记录,并且 b 表中 id 不为空。
- `a join b on a.id = b.id` 表示以 a 表为主表,内连接 b 表,只返回 a 表中与 b 表中存在匹配的记录。
所以,第一条语句返回的结果可能包含 a 表中有但是 b 表中没有的记录,而第二条语句不会返回这些记录。同时,第一条语句还会返回 b 表中 id 为空的记录,而第二条语句不会返回这些记录。
相关问题
a表left join b表 on a.id=b.id where a.status=1 and b.status=1,当表a或表b中有其中一个表不满足where条件时结果表是怎样的?都不满足时是怎样的?都满足时是怎样的?请举例说明并分别做对比
当表a或表b中有其中一个表不满足where条件时,left join会返回满足条件的那个表的记录和另一个表的空记录。如果都不满足时,返回的结果表中将不会有任何记录。
举个例子,假设有以下两个表:
```
Table A
id | name | status
----|------|-------
1 | Amy | 1
2 | Bob | 0
3 | Cate | 1
Table B
id | age | status
----|------|-------
1 | 20 | 1
2 | 25 | 1
4 | 30 | 0
```
执行以下SQL语句:
```
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE A.status = 1
AND B.status = 1;
```
结果表是:
```
id | name | status | id | age | status
----|------|--------|-----|------|-------
1 | Amy | 1 | 1 | 20 | 1
3 | Cate | 1 | NULL| NULL | NULL
```
可以看到,因为表A中id为2的记录的status不满足条件,所以不会被返回,但是因为是left join,表B中id为2的记录仍然会被返回,但是age和status会是NULL。
如果都满足条件,比如执行以下SQL语句:
```
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE A.status = 1
AND B.age > 20;
```
结果表是:
```
id | name | status | id | age | status
----|------|--------|-----|------|-------
1 | Amy | 1 | 1 | 20 | 1
```
可以看到,只有id为1的记录同时满足条件,所以只有这条记录被返回。
oracle两张表,主表A的ID 是子表B的formmainId,两张表做left join on id=formmain_id 且数据中存在a表的id等于b表的formmainId where条件中怎么过滤可以做到只查询到A表的数据记录条数
### 回答1:
可以在 WHERE 子句中使用以下条件来过滤数据:
```
WHERE A.ID = B.FORMMASIN_ID AND A.ID IS NOT NULL
```
这样,您就只能查询到 A 表中有记录的数据。
如果要确保查询到的结果只包含 A 表的记录,您可以使用以下查询:
```
SELECT * FROM A LEFT JOIN B ON A.ID = B.FORMMASIN_ID WHERE B.FORMMASIN_ID IS NULL
```
这样,您将只查询出 A 表中没有匹配记录的数据。
### 回答2:
要实现只查询到主表A的数据记录条数,可以在WHERE条件中添加一个限制条件,即只查询到主表A中的数据。
可以使用以下的SQL查询语句实现:
```sql
SELECT COUNT(*) AS record_count
FROM A
LEFT JOIN B ON A.ID = B.formmainId
WHERE A.ID = B.formmainId;
```
这个查询语句使用LEFT JOIN连接主表A和子表B,并通过"A.ID = B.formmainId"进行关联。然后,使用WHERE条件"A.ID = B.formmainId"来过滤只查询到主表A中的数据。
最后,使用COUNT(*)函数来计算查询到的记录条数,并使用"AS record_count"给结果命名为"record_count"。
执行这个查询语句后,将会返回只查询到主表A的数据记录条数。
### 回答3:
如果只希望查询到主表A的数据记录条数,则可以通过在WHERE条件中添加限制条件来实现。
假设主表A的表名为table_A,子表B的表名为table_B,主表A的ID是子表B的formmainId,通过left join可以使用如下查询语句连接两表:
SELECT *
FROM table_A
LEFT JOIN table_B ON table_A.ID = table_B.formmainId
WHERE table_A.ID = table_B.formmainId;
在WHERE条件中添加了table_A.ID = table_B.formmainId的限制条件,即只有当主表A的ID等于子表B的formmainId时才会查询到对应的数据记录。
如果只需要查询主表A的数据记录条数,可以将查询语句修改为:
SELECT COUNT(*)
FROM table_A
WHERE table_A.ID IN (SELECT formmainId FROM table_B);
这样只会查询到主表A中ID在子表B的formmainId中出现的数据记录条数。
阅读全文