四:分组查询

分组查询的group by 是将你所有的类别分类好后再按照这个去查找,类似于先过了一遍distinct
# 添加分组查询
SELECT
  COUNT(first_name),
  `gender`
FROM
  `employees`
WHERE first_name LIKE '%a%'
GROUP BY gender;

# 添加分组后的筛选  having

# 1. 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
#    1.1 分组查询每个工种有奖金的员工的最高工资和工种编号  这里的筛选条件用where
#    1.2 将得出的结果经过条件-》大于12000                  这里的筛选用having
分组查询

2.筛选条件在原始表中有的(分组前)在group by前用where,在原始表没有的(分组后)在 group by后用having,例如

SELECT COUNT(*),LENGTH(last_name) AS len_name
FROM employees
GROUP BY len_name
HAVING COUNT(*)>2000;
案例:查询员工姓名长度的分组,查询每一组的员工个数,筛选员工个数>5的有哪些

二: 连接查询 -> 多表查询

  

  如果连续查询两张表,因为里面的id不同,所以可能会出现笛卡尔积的错误(所有表完全连接)因为没有加任何连接条件

  笛卡尔乘积现象:表1有m行,表2有n行,查出来的数据有n*m行,里面数据全连接(相当于全连接层)。

  解决:加上条件比如   表1有一列数据是表2的id,就可以用 where 表1.表2ID = 表2.id

  起别名: 为表起别名,可以在from里面起,用as或者空格,注意MySQL执行顺序为先执行from里面的,为表起了别名后,查询字段就不能用原来的表去限定

  分类:

      按年代分类,

      sql92标准(仅仅支持内连接)

      sql99标准(推荐)

      按照功能分类

        内连接:

          等值连接: 表1有一列数据是表2的id,就可以用 where 表1.表2ID = 表2.id ;还可以用and加筛选条件,不同的筛选条件

SELECT departments.dept_name, dept_manager.`from_date`
FROM departments, dept_manager
WHERE departments.`dept_no`=dept_manager.`dept_no`;
等值连接
SELECT departments.dept_name, dept_manager.`from_date`
FROM departments, dept_manager
WHERE departments.`dept_no`=dept_manager.`dept_no` AND LENGTH(dept_name)>3;
AND连接

          非等值连接:例如用表A的salary 去通过判断表B的min和max就可以得到表A中每个工资对应表B里面的级别。            

select A.salary, B.jibie
from A,B
where A.salary between B.max and B.min
非等值连接

          自连接:例如查询员工名和上级的名称,由于上级也是员工,都在同一张表内,所以我们就可以使用自引用

SELECT  员工.名字,上级.名字
FROM  表1 as 员工,表2 as 上级
WHERE 表1.上级ID=表2.ID
自引用

        外连接:

          左外连接·

          右外连接

          全外连接

        交叉连接

原文地址:https://www.cnblogs.com/BookMiki/p/14140735.html