利用子查询找出某个属性存在A表而不存在B表的数据

本文介绍两种方法来找出A表中ID在B表中未出现的记录:一是使用子查询结合NOT EXISTS,二是采用LEFT JOIN并检查NULL值。这两种方法都能有效利用索引提高查询效率。

概述


假设有两张表,A表和B

A表:


idnameage
1xxx15
2yyy18
3zzz20

B表:


idb_idage
1115
2218

其中B表的b_id字段引用了A表的id字段。现在有个查询需求:
给出已知的A表中的id,比如:id in (1,2,3),找出这些id在B表中没有与之对应的记录。比如说上面A表中的id=3这条记录,B表中没有b_id与之对应

利用子查询


SELECT 
  a.id 
FROM
  A a 
WHERE a.id IN (1,2,3) 
  AND NOT EXISTS 
  (SELECT 
    1 
  FROM
    B b 
  WHERE b.b_id = a.id)

利用上面的子查询就可以达到目的。
注意:
这个SQL 虽然可以用到索引,但是一定注意入参的个数,如果入参id的个数太多的话,性能有点问题。因为这个SQL会根据入参,一个一个执行子查询,进行比对的。


利用left join


这篇博文的有个网友提供了另外一种方式(请看这篇博文该网友的回复),这里感谢这位网友,下面把他的方案贴出来,如下:

select
    a.id
from
    A a
left join B b on a.id = b.b_id
where
    a.id IN (1, 2, 3)
and b.id is null

这样也可以用到索引,并且避免使用子查询。

### OpenGauss 数据库单查询的使用方法 在 OpenGauss 数据库中,单查询是最基础的数据操作之一。通过 SQL 查询语句可以实现对单一格中的数据筛选、排序以及统计等功能。以下是关于如何在 OpenGauss 中执行单查询的具体说明。 #### 基本语法结构 标准的单查询通常遵循以下基本语法: ```sql SELECT column_name_1, column_name_2, ... FROM table_name; ``` 此语法用于从指定 `table_name` 中检索列 `column_name_1`, `column_name_2` 的值[^1]。 如果需要过滤特定条件下的记录,则可以通过添加 `WHERE` 子句来完成: ```sql SELECT column_name_1, column_name_2, ... FROM table_name WHERE condition_expression; ``` #### 条件达式的应用 为了更精确地控制返回的结果集,在 `WHERE` 子句中可定义多种类型的条件达式。例如: - **比较运算符**:`=`, `<`, `>`, `<=`, `>=`, `<>` 或 `!=`. - **逻辑运算符**:`AND`, `OR`, 和 `NOT`. 下面是一个具体的例子,展示如何利用这些功能进行复杂查询: 假设存在一张名为 `employees` 的员工信息,其中包含字段 `id`, `name`, `age`, 和 `salary`. 若要查找年龄大于30岁且工资超过8000元的所有员工姓名及其薪资情况,可以编写如下SQL语句: ```sql SELECT name, salary FROM employees WHERE age > 30 AND salary >= 8000; ``` 此外,还可以结合子查询进一步增强灵活性。比如要找出那些薪水高于部门平均薪酬水平的雇员名单时,可以用到嵌套形式的查询方式[^3]: ```sql SELECT e.name AS EmployeeName, d.department_name AS DepartmentName, e.salary AS Salary FROM employees e JOIN departments d ON e.dept_id = d.id WHERE e.salary > ( SELECT AVG(e2.salary) FROM employees e2 ); ``` #### 连接数据库并运行查询 对于实际开发环境而言,除了掌握上述理论知识外还需要学会怎样借助合适的工具去访问远程服务器上的实例资源。这里推荐两种常见的途径——命令行界面(gsql)[^2] 及图形化管理软件(DBeaver)[^4]: ##### 方法一: 使用 gsql 工具 打开终端窗口输入类似这样的指令即可建立会话链接至目标主机端口上已存在的某个具体模式(schema) 下面预设好的角色(role)/用户名(user id)-密码组合认证机制验证身份之后便能开始交互式编辑器体验啦~ ```bash gsql -d your_database_name -p port_number -h hostname_or_ip_address -U username -W 'password' ``` ##### 方法二: 利用 DBeaver 客户端 下载安装最新版本的应用程序包文件后启动它按照向导提示逐步填写必要的参数项直到测试连接成功为止最后保存配置档案以便日后重复调用无需再次手动设置各项属性值省去了少麻烦事呢! --- ### 总结 综上所述,无论是简单的全量读取还是复杂的多层关联分析场景下都能很好地满足业务需求的同时还提供了丰富的扩展插件支持使得整个生态体系更加完善健全起来值得每一位开发者深入学习研究一番哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值