多表关系

  1. 一对多:一个部门对应多个员工。

  1. 多对多:一个学生可以选修多门课程,一门课程也可以供多个学生选择。

  1. 一对一:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

内连接

  1. 内连接查询的是两张表交集部分的数据。
  2. 内连接的语法分为两种: 隐式内连接、显式内连接。
  3. 隐式内连接:
SELECT 字段列表 FROM 1 , 2 WHERE 条件 ... ;
  1. 显式内连接:
SELECT 字段列表 FROM 1 [ INNER ] JOIN 2 ON 连接条件 ... ;

外连接

  1. 外连接分为两种,分别是:左外连接和右外连接。
  2. 左外连接:左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。
SELECT 字段列表 FROM 1 LEFT [ OUTER ] JOIN 2 ON 条件 ... ;
  1. 右外连接:右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。
SELECT 字段列表 FROM 1 RIGHT [ OUTER ] JOIN 2 ON 条件 ... ;
  1. 注意事项:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。

自连接

  1. 自连接查询:自己连接自己,也就是把一张表连接查询多次。
  2. 而对于自连接查询,可以是内连接查询,也可以是外连接查询。
SELECT 字段列表 FROM A 别名A JOIN A 别名B ON 条件 ... ;
  1. 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
  2. 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  3. union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
SELECT 字段列表 FROM A ...
UNION [ ALL ]
SELECT 字段列表 FROM B ....;

子查询

  1. SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
  2. 子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

标量子查询

  1. 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
  2. 常用的操作符:=、<>、>、>=、<、<=。
-- 查询指定入职日期之后入职的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '张三');

列子查询

  1. 子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
  2. 常用的操作符:IN、NOT IN、ANY、SOME、ALL。

| 操作符 | 描述 | | IN | 在指定的集合范围之内,多选一 | | NOT IN | 不在指定的集合范围之内 | | ANY | 子查询返回列表中,有任意一个满足即可 | | SOME | 与ANY等同,使用SOME的地方都可以使用ANY | | ALL | 子查询返回列表的所有值都必须满足 |

-- 根据部门ID, 查询员工信息
select * from emp where dept_id in (
    select id from dept where name = '销售部' orname = '市场部'
);

-- 比 财务部 所有人工资都高的员工信息
select * from emp where salary > all ( 
    select salary from emp where dept_id = (select id from dept where name = '财务部') 
);

-- 比研发部其中任意一人工资高的员工信息
select * from emp where salary > any ( 
    select salary from emp where dept_id =
        (select id from dept where name = '研发部') 
);

行子查询

  1. 子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
  2. 常用的操作符:= 、<> 、IN 、NOT IN。
select * from emp where (salary,managerid) = (
    select salary, managerid from emp where name = '张无忌'
);

表子查询

  1. 子查询返回的结果是多行多列,这种子查询称为表子查询。
  2. 常用的操作符:IN
select * from emp where (job,salary) in ( 
    select job, salary from emp where name ='XS' or name = 'DS' 
);