连接查询

1. 连接查询

介绍

  • 含义:
    又称多表查询,当查询的字段来自多个表时,就会用到连接查询。
  • 笛卡尔乘积现象:
    表1有m行,表2有n行,结果m*n行
  • 发生原因:
    没有有效的连接条件
  • 如何避免:
    添加有效的连接条件
  SELECT NAME,boyName
  FROM boys,beauty
  WHERE boys.id = beauty.boyfriend_id;

分类

  • 按年代分:
    -- sql92标准:
    仅仅支持内连接
    -- sql99标准:
    支持内连接,外连接(左外和右外),交叉连接

  • 按功能分:
    -- 内连接:等值连接,非等值连接,自连接
    -- 外连接:左外连接,右外连接,全外连接
    -- 交叉连接

2. sql92标准

sql92标准之内连接之等值连接

  • 案例一:
  SELECT NAME,boyName
  FROM boys,beauty
  WHERE boys.`id` = beauty.`boyfriend_id`;
  • 为表起别名
  #查询员工名、工种号、工种名
  SELECT last_name,e.job_id,job_title
  FROM employees AS e,jobs
  WHERE e.`job_id` = jobs.`job_id`;

sql92标准之内连接之非等值连接

  • 案例一:查询员工的工资和工资的级别
  SELECT salary,grade_level
  FROM job_grades j,employees e
  WHERE salary BETWEEN lowest_sal AND highest_sal
  AND grade_level = 'A'
  ;

sql92标准之内连接之自连接

  • 查询员工名和上级的名称
  SELECT e.`employee_id`,e.`last_name`,m.`employee_id`,m.`last_name`
  FROM employees e,employees m
  WHERE e.`manager_id` = m.`employee_id`;

3. sql99标准

  • 语法
  select 查询列表
  from 表一 别名
  [inner] join 表二 别名
  on 连接条件;

全语法:
  select 查询列表
  from 表1 别名【连接类型】
  join 表2 别名
  on 连接条件
  【where 筛选条件】
  【group by 分组】
  【having 筛选条件】
  【order by 排序列表】 

sql99标准之内连接之等值连接

  #案例一:查询员工名和部门名
  SELECT last_name,department_name
  FROM employees e
  INNER JOIN departments d
  ON e.`department_id` = d.`department_id`;

sql99标准之内连接之非等值连接

  #查询工资级别的个数>2的个数,并且按工资级别降序
  SELECT COUNT(*),salary,grade_level
  FROM employees e
  INNER JOIN job_grades g
  ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
  GROUP BY grade_level
  HAVING COUNT(*) > 20
  ORDER BY grade_level DESC
  ;

sql99标准之内连接之自连接

  #查询员工的名字、上级的名字
  SELECT e.last_name,m.`last_name`
  FROM employees e
  INNER JOIN employees m
  ON e.`employee_id` = m.`manager_id`;

sql99标准之外连接之左外连接

  #引入:查询男朋友不在男神表的女神名
  SELECT b.name,bo.*
  FROM beauty b
  LEFT OUTER JOIN boys bo
  ON b.`boyfriend_id` = bo.`id`
  WHERE bo.`id` IS NULL
  ;

sql99标准之外连接之右外连接

  #引入:查询男朋友不在男神表的女神名
  SELECT b.`name`,bo.*
  FROM boys bo
  RIGHT OUTER JOIN beauty b
  ON b.`boyfriend_id` = bo.`id`
  WHERE bo.`id` IS NULL;

sql99标准之外连接之全外连接

  #全外连接
  SELECT b.*,bo.*
  FROM beauty b
  FULL OUTER JOIN boys bo
  ON b.`boyfriend_id` = bo.id;

sql99标准之外连接之交叉连接

  #相当于sql标准的笛卡尔乘积
  SELECT b.*,bo.*
  FROM beauty b
  CROSS JOIN boys bo;

  #对比
  #sql92标准里的笛卡尔乘积
  SELECT b.*,bo.*
  FROM beauty b,boys bo;

4. 总结连接查询

内连接:

左外连接:

右外连接:

全外连接:

其他三种的实现:

5. 练习题目

https://leetcode-cn.com/problems/combine-two-tables/submissions/

posted @ 2022-02-28 21:23  jsqup  阅读(162)  评论(0编辑  收藏  举报