【SQL】sql从0到1——第【3】章:分组查询、连接查询

一、分组查询

  查询列表必须有分组函数和group by后面的字段
  基本语法:
      Select 分组函数,列(必须出现在group by后面)
      From 表
      Where 筛选条件
      Group by 分组列表
      Having 分组后的筛选
      Order by 排序列表
   例: Select max(salary),job_id
     From employee
     Group by job_id

分组查询的筛选条件有两类:

  ① 分组前筛选:筛选数据源是原始表,放在group by子句前面,使用关键字where
  ② 分组后筛选:筛选数据源是分组后的结果集,放在group by子句后面,使用关键字
Having。

注意:分组函数做条件时关键字必须用having

敲黑板:语句执行顺序:①from ②where ③group by ④having ⑤select ⑥orderby

二、连接查询

 当要查询的字段来自多个表时,需要用连接查询

1. 连接查询按功能分类

 内连接
    等值连接
   非等值连接
   自连接
 外连接
   左外连接
   右外连接
   全外连接
 交叉连接

2. 内连接

  SQL92语法和99语法都支持内连接

 1) 等值连接

  要连接查询的两个表里有相同列,利用此列将其连接
  例:92语法:
        Select last_name,department_id
        From employees,department
        Where employees .department_id= employees. department_id
    99语法:表1 inner join 表2 on 相同字段
        Select last_name,department_id
        From employees
        inner join department
        on employees .department_id= employees. department_id

    这两个原理和执行效率完全相同

 2)非等值连接

  要连接查询的两个表里没有相同列,但有相互关联列,利用两列之间的关系将其连接
  例:92语法:
        Select salary,grade_level
        From employees,job_grades
        Where salary between job_grades.lowest_sal and job_grades.hightest_sal;
    99语法:
        Select salary,grade_level
        From employees
        inner join job_grades
        on salary between job_grades.lowest_sal and job_grades.hightest_sal;

 3)自连接

  只涉及一个表,自己连接自己。
   例:92语法:
        Select e.employee_id, e.last_name, e.manager_id, m.last_name
        FROM employees e,employees m
        Where e.manager_id=m.employee_id;
    99语法:
        Select e.employee_id, e.last_name, e.manager_id, m.last_name
        FROM employees e
        Inner join employees m
        On e.manager_id=m.employee_id;

在这里插入图片描述

3. 外连接

  用于查询一个表中包含,另一个表中不包含的情况。

  外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,如果没有,则显示null。即:外连接结果=内连接结果+主表中有而从表中没有的记录。

  基本语法:
       Select 查询列表
       From 表1 【连接类型】join 表2
       On 连接条件
       Where筛选条件
       Group by 分组
       Having 筛选条件
       Order by 排序

 1)左外连接

  左边的表作为主表,右边的表为从表,保留主表中所有内容,左表中包含,右中不包含的用null代替。

  例:
     Select *
     From department
     Left join employee
     On department. department _id= employee. department _id;

在这里插入图片描述
 2)右外连接

   右边的表作为主表,左边的表为从表,保留主表中所有内容,右表中包含,左中不包含的用null代替。 左外连接和右外连接交换两个表的顺序,可以实现同样的效果

    例:
      Select *
      From employee
      Right join department
      On department. department _id= employee. department _id;

在这里插入图片描述
 3)全外连接

   全外连接=内连接结果+表1有但表2没有+表2有但表1没有
    例:
      Select *
      From department
      Full join employee
      On department. department _id= employee. department _id;

在这里插入图片描述
 4)交叉连接

   交叉连接结果即笛卡尔积。笛卡尔积:由没有连接条件的表关系返回的结果为笛卡尔积,检索出的行的数目将是第一个表中的行数乘以第二个表的行数。

    例:
      Select *
      From department
      Cross join employee

5)其他常用情况

查询主表中包含,从表中不包含的情况,即在左/右外连接基础上添加条件

在这里插入图片描述 在这里插入图片描述
查询两表中不相同的部分
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46568930/article/details/113175498