SQL 学习笔记 - 多表关系与多表查询

简介: 数据库多表关系包括一对多、多对多和一对一,常用外键关联。多表查询方式有隐式/显式内连接、外连接、子查询等,支持别名和条件筛选。子查询分为标量、列、行、表子查询,常用于复杂查询场景。

一、多表关系

在数据库中,表与表之间存在关联关系,主要有以下几种:

  1. 一对多(常见,如:部门 - 员工)
    • 一个部门有多个员工
    • 员工表 empdept_id 外键关联部门表 deptid
  2. 多对多
    • 通常通过中间表实现(例如:学生 - 课程关系)
  3. 一对一
    • 一个实体拆分到多个表时可能出现

二、多表查询方式

1. 隐式内连接

select emp.id, emp.name, dept.name 
from emp, dept 
where emp.dept_id = dept.id;

2. 显式内连接

select emp.id, emp.name, dept.name 
from emp inner join dept 
on emp.dept_id = dept.id;

3. 使用别名的多表查询

select e.id, e.name, d.name 
from emp as e, dept as d 
where e.dept_id = d.id and e.gender = 1 and e.salary > 8000;

4. 外连接

  • 左外连接:查询左表的所有数据,即使右表没有匹配数据
    select emp.name, dept.name 
    from emp left join dept 
    on emp.dept_id = dept.id;
    

带条件的左连接:

select emp.name, dept.name 
from emp left join dept 
on emp.dept_id = dept.id 
where salary > 10000;

三、子查询

1. 标量子查询(返回单个值)

-- 查询最早入职日期
select min(entry_date) from emp;

-- 查询最早入职的员工信息
select * from emp where entry_date = (select min(entry_date) from emp);

-- 查询比阮小五入职晚的员工信息
select * from emp 
where entry_date > (select entry_date from emp where name = '阮小五');

2. 列子查询(返回一列)

-- 查询教研部和咨询部的员工
select * from emp 
where dept_id in (select id from dept where name = '教研部' or name = '咨询部');

3. 行子查询(返回多列)

-- 查询与李忠薪资和职位相同的员工
select * from emp 
where (salary, job) = (select salary, job from emp where name = '李忠');

等价写法:

select * from emp 
where salary = (select salary from emp where name = '李忠') 
  and job = (select job from emp where name = '李忠');

4. 表子查询(结果当作一张临时表)

-- 查询 2006-01-01 之后入职的员工及部门信息
select e.*, d.name 
from (select * from emp where entry_date > '2006-01-01') as e, dept as d 
where e.dept_id = d.id;

四、典型案例

1. 查询教研部男性且 2011-05-01 之后入职的员工

select e.* 
from emp as e, dept as d 
where e.dept_id = d.id and d.name = '教研部' 
  and e.gender = 1 and entry_date > '2011-05-01';

2. 查询工资低于公司平均工资的男性员工

select e.* 
from emp as e, dept as d 
where e.dept_id = d.id 
  and e.salary < (select avg(salary) from emp) 
  and e.gender = 1;

3. 查询工资低于本部门平均工资的员工

-- 示例:1号部门平均工资
select avg(salary) from emp where dept_id = 1;

4. 查询部门人数超过 10 人的部门名称

select d.name, count(*) 
from emp as e, dept as d 
where e.dept_id = d.id 
group by d.name 
having count(*) > 10;

五、总结

  • 内连接:取交集,匹配成功的数据
  • 外连接:保留一边的全部数据(左/右)
  • 子查询:分为标量、列、行、表子查询
  • 多表查询核心:通过外键建立关联,使用 joinwhere 进行条件匹配
相关文章
|
SQL 数据库管理
第二章:基础查询与排序---SQL学习笔记
第二章:基础查询与排序---SQL学习笔记
199 0
|
SQL 关系型数据库 MySQL
六、SQL多表查询
六、SQL多表查询
437 0
|
SQL XML Java
Mybatis:SQL注入问题 like模糊查询 多表查询 动态SQL
Mybatis:SQL注入问题 like模糊查询 多表查询 动态SQL
2528 0
|
5月前
|
算法 数据挖掘 数据库
通过 SQL 快速使用 OceanBase 向量检索学习笔记
通过 SQL 快速使用 OceanBase 向量检索学习笔记
|
SQL 关系型数据库 MySQL
SQL99语法实现多表查询
SQL99语法实现多表查询
225 0
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
155 5
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
简简单单 My SQL 学习笔记(3)——连接和嵌套查询
|
SQL 存储 关系型数据库
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
147 0