一:sql92标准

  1. #进阶7:连接查询
  2. /*
  3. 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。
  4. 笛卡尔乘积现象:表1有m行,表2有n行,结果集=m*n行。
  5. 发生原因:没有有效的连接条件
  6. 如何避免:添加有效的连接条件
  7. 连接查询分类:
  8. 按年代分类:
  9. (1)sql92标准
  10. (2)sql99标准
  11. 按功能分类:
  12. (1)内连接:
  13. 等值连接
  14. 非等值连接
  15. 自连接
  16. (2)外连接:
  17. 左外连接
  18. 右外连接
  19. 全外连接
  20. (3)交叉连接:
  21. */
  22. #sql92标准
  23. #一:等值连接
  24. /*
  25. 语法:
  26. select 查询列表
  27. from 表名1 (AS) 别名1,表名2 (AS) 别名2,……
  28. where 等值连接的连接条件
  29. AND 筛选条件
  30. 为表起别名的好处:
  31. 提高语句的简洁度
  32. 区分多个重名的字段
  33. 注意:
  34. 如果为表起了别名,则查询的字段就不能使用原来的表名去限定
  35. 多个筛选条件之间用AND连接
  36. 多表等值连接的结果为多表的交集部分
  37. n表连接,至少需要n-1个连接的条件
  38. 多表的顺序没有要求
  39. 一般需要为表起别名
  40. 可以搭配前面介绍的所有子句
  41. */
  42. #案例一:查询女神名和对应的男神名
  43. select `name`,boyName
  44. from boys,beauty
  45. where beauty.boyfriend_id = boys.id;
  46. #二:非等值连接
  47. #案例一:查询员工的工资和工资级别
  48. select salary,grade_level
  49. from employees e,job_grades g
  50. where salary between g.`lowest_sal` and g.`highest_sal`;
  51. #二:自连接(自己连接自己)
  52. #案例一:查询员工名和上级的名称
  53. select e.employee_id,e.last_name,m.employee_id,m.last_name
  54. from employees e,employees m
  55. where e.`manager_id`=m.`employee_id`;

二:sql99标准

(1)内连接

#二:sql99语法
/*
语法:
    select 查询列表
    from 表1 别名
    【连接类型】 join 表2 别名
    on 连接条件
    【where 筛选条件】
    【group by 分组】
    【having 筛选条件】
    【order by 排序列表】
分类:
    内连接(*):inner
    等值连接
    非等值连接
    自连接
    外连接
    左外(*):left 【outer】
    右外(*):right 【outer】
    全外:full 【outer】
    交叉连接:cross
*/

#一:)内连接
/*
语法:
    select 查询列表
    from 表1 别名
    inner join 表2 别名
    on 连接条件
    inner join 表3 别名
    on 连接条件
特点:
    1.添加排序、分组、筛选
    2.inner可以省略
    3.筛选条件放在where后面,连接条件放在on后面,提高分离性、便于阅读
    4.inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
*/
#1:等值连接
#案例一:查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`;

#2:非等值连接
#案例一:查询员工的工资级别
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

#3:自连接
#案例一:查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e
INNER JOIN employees m
ON e.`manager_id`=m.`employee_id`;

(2)外连接

#二:外连接
/*
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
   1.外连接的查询结果为主表中的所有记录
      如果从表中有和它匹配的,则显示匹配的值
      如果从表中没有和它匹配的,则显示null
      外连接查询结果=内连接结果+主表中有而从表中没有的记录
   2.左外连接,left左边的是主表
     右外连接,right join 右边的是主表
   3.左外和右外交换两个表的顺序,可以实现同样的效果
   4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1中没有的
*/

#1)左/右外连接
#案例一:查询
SELECT b.name
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id`=bo.`id`
WHERE bo.`id` IS NULL;

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

(3)交叉连接

#三:交叉连接(其实就是笛卡尔乘积)
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;