当前位置: 首页 > news >正文

MySQL学习笔记之子查询

自连接方式

自连接就是表A连接表A,通过where关键字实现,比如查询工资比Abel高的员工信息:

SELECTe2.last_name,e2.salary
FROMemployees e1,employees e2
WHEREe1.last_name = "Abel"
AND e2.salary > e1.salary;

子查询

亦称为嵌套查询:

SELECTlast_name,salary
FROMemployees
WHEREsalary > (SELECTsalaryFROMemployeesWHERElast_name = "Abel");

子查询写在括号内,放在比较条件的右侧。单行操作符对应单行子查询,多行操作符对应多行子查询。

子查询分类

  • 角度1:
    单行子查询:只返回一行结果的子查询;
    多行子查询:返回多行结果的子查询。

  • 角度2:
    相关子查询:子查询用到了主查询表的字段;
    不相关子查询:子查询用不到主查询表的字段。

相关子查询

SELECTlast_name,salary,department_id
FROMemployees e1
WHEREsalary > (SELECTavg(salary)FROMemployees e2WHEREe1.`department_id` = e2.department_id);

也可以在from中声明子查询:

SELECTemployees.last_name,employees.salary,employees.department_id
FROMemployees,(SELECTdepartment_id,avg(salary)FROMemployeesGROUP BYdepartment_id) sal_dept
WHEREemployees.department_id = sal_dept.department_id;

再看一个例子:查询在job_history中出现两次的employee_id对应的last_nameemployee_idjob_id

SELECTemployees.last_name,employees.employee_id,employees.job_id
FROMemployees,(SELECTemployee_id,count(employee_id) employee_id_countFROMjob_historyGROUP BYemployee_id) employee_hist
WHEREemployee_hist.employee_id = employees.employee_id
AND employee_hist.employee_id_count >= 2;

exists与not exists

exists关键字

exists关键字,用来检查在子查询中是否存在满足条件的行,一经发现,随即返回。
案例:查询公司管理者的信息:

# 方式1:
SELECT DISTINCTmanager.employee_id,manager.last_name,manager.job_id,manager.department_id
FROMemployees emp
JOIN employees manager ON emp.manager_id = manager.employee_id;# 方式2:
SELECTemployees.employee_id,employees.last_name,employees.job_id,employees.department_id
FROMemployees,(SELECT DISTINCTmanager_idFROMemployees) manager
WHEREemployees.employee_id = manager.manager_id;# 方式3:
SELECTe1.employee_id,e1.last_name,e1.job_id,e1.department_id
FROMemployees e1
WHEREEXISTS (SELECT*FROMemployees e2WHEREe2.manager_id = e1.employee_id);

not exists关键字

not exists关键字的含义和exists相反
案例:查询employees表中不存在的department_iddepartment_name

# 方式1:
SELECTdepartments.department_id,departments.department_name
FROMdepartments
LEFT JOIN employees ON departments.department_id = employees.department_id
WHEREemployees.department_id IS NULL;# 方式2:
SELECTdepartment_id,department_name
FROMdepartments
WHERENOT EXISTS (SELECT*FROMemployeesWHEREdepartments.department_id = employees.department_id);

如果一种查询既能用子查询实现,也能用自连接实现,一般选择后者,因为自连接效率更高。

http://www.lryc.cn/news/30829.html

相关文章:

  • HCIP-5OSPF域内域间外部路由学习笔记
  • 【编程实践】简单是好软件的关键:Simplicity is key to good software
  • Python|贪心|数组|二分查找|贪心|数学|树|二叉搜索树|在排序数组中查找元素的第一个和最后一个位置|计数质数 |将有序数组转换为二叉搜索树
  • 操作系统——15.FCFS、SJF、HRRN调度算法
  • 如何防止用户打开浏览器开发者工具?
  • C语言-基础了解-12-C数组
  • RocksDB 架构
  • MVVM和MVC的区别
  • c++11 标准模板(STL)(std::unordered_map)(三)
  • OpenGL环境配置
  • SpringCloud之 Eureka注册中心
  • Linux入门篇-用户管理
  • G. Special Permutation(构造)
  • QML动态对象管理
  • cmake入门03 -自定义find外部库
  • Dubbo源码解析-——服务导出
  • vue+django+neo4j 基于知识图谱红楼梦问答系统
  • 2023年全国最新食品安全管理员精选真题及答案13
  • Keychron K7 Pro 轻薄矮轴机械键盘开箱体验
  • 加油站ai视觉识别系统 yolov7
  • 【电子学会】2022年12月图形化二级 -- 绘制风车
  • 【golang/go语言】Go语言代码实践——高复用、易扩展性代码训练
  • [数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(学习复习笔记)
  • 05_Pulsar的主要组件介绍与命令使用、名称空间、Pulsar的topic相关操作、Pulsar Topic(主题)相关操作_高级操作、
  • 我的终端怎么莫名卡死了?shell下ctrl+s的含义
  • 【Vue】Vue的简单介绍与基本使用
  • 网络知识篇
  • python 连接数据库
  • 一文讲明白一致性hash算法
  • Java分布式解决方案(一)