MySQL学习笔记-基础:分组查询、链接查询

分组查询

目的:为了将数据分组
语法:
select 分组函数,列(次列出如今后面的group by里)
from 表
[where 筛选条件 ]
group by 分组列表
[order by子句]mysql

条件分组

案例:web

  1. 查询每一个工种的最高工资
    SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
  2. 查询每一个位置上的部门个数
    COUNT(*),location_id FROM departments GROUP BY location_id;
    添加条件
  3. 查询邮箱中包含a字符的,每一个部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    WHERE email LIKE ‘%a%’
    GROUP BY department_id;
  4. 查询有奖金的每一个领导手下员工的最高工资
    SELECT MAX(salary),manager_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY manager_id;
  5. 查询哪一个部门的员工个数>2(分组后的筛选)
    首先查询每一个部门的员工个数,而后对结果进行筛选
    SELECT COUNT(* ),department_id
    FROM employees
    GROUP BY department_id
    HAVING COUNT(*)>2;#having用于分组后的查询,即原始表中没有相应字段
  6. 查询每一个工种有奖金的员工的最高工资>12000的工种编号和最高工资
    SELECT MAX(salary),job_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY job_id
    HAVING MAX(salary)>12000;

分组筛选小结,分组查询的筛选能够分为分组前的筛选和分组后的筛选,二者的主要区别在于筛选条件,分组前经过原始表,分组后经过分组后的结果集做为筛选。sql

按表达式或函数分组

案例:svg

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

按多个字段分组

  1. 查询每一个部门每一个工种的员工的平均工资
    SELECT AVG(salary),department_id,job_id
    FROM employees
    GROUP BY job_id,department_id;

也能够添加排序,排序放在最后。函数

链接查询

当查询的数据涉及到多个表时,须要用到链接查询。要避免笛卡尔乘积,须要添加链接条件。
按功能分类:code

  1. 内链接
    等值链接、非等值链接、自链接
  2. 外链接
  3. 交叉链接

sql92标准(仅支持内链接)

  1. 等值链接

案例1:查询员工名和对应的公寓名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;xml

案例2:为表取别名,取了别名后不能再使用原来的表名来限定,表的顺序可更换
查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.job_id=j.job_id;排序

案例3:能够加筛选
查询有奖金的员工名、部门名
SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id
AND employees.commission_pct IS NOT NULL;ci

案例3:能够加分组
查询每一个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;it

案例4:能够加排序
查询工种名并按人数降序
SELECT job_title,COUNT()
FROM employees e,jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY COUNT(
) DESC;

案例5:三表链接
查询员工名、部门名和所在的城市
SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id;

  1. 非等值链接

即链接条件不为=时

案例1:查询员工的工资和工资级别
select salary,grade_level
from employees e,job_grades g
where salary between g.lowest_sal and g.highest_sal;

  1. 自链接
    在同一个表里作链接

案例:查询员工名和上级的名称
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;

sql99

语法:
select 查询列表
from 表1 别名
【链接类型】join 表2 别名
on 链接条件
[where 筛选条件]

  1. 内链接:inner

等值链接:

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

案例2:查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE ‘%e%’;

案例3:三表链接:查询员工名,部门名,公众名,并按部门名降序
SELECT last_name,department_name,j.job_title
FROM employees e
INNER JOIN departments d ON e.department_id=d.department_id
INNER JOIN jobs j ON e.job_id=j.job_id
ORDER BY d.department_name DESC;

非等值链接

案例1:查询员工的工资级别
SELECT salary,grade_level
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

自链接
案例1:查询员工的名字,上级的名字
SELECT e.last_name,m.last_name
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id;

  1. 外链接
    用于查询一个表有的字段,另外一个表没有
    特色1:外链接的查询结果为主表中的全部记录,若是从表中有和它匹配的,则显示匹配的值,若是没有和它匹配的,则显示null
    左外:left 指的是left join左边的是主表
    右外:right 指的是right join右边的是主表
    全外:full

案例1:查询男友 不在男神表的女神名
使用左外链接
SELECT b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

案例2:查询哪一个部门没有员工
使用左外链接
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id=e.department_id
WHERE e.employee_id=NULL;

案例3:mysql不支持
全外链接=内链接的结果+表1中有表2没有+表1中没有表2中有的

  1. 交叉链接:cross
    至关于笛卡尔乘积

多表查询案例:

  1. 查询编号>3的女神的男友的信息,若是有则列出详细,若是没有,则用null填充
    SELECT b.id,b.name,bo.*
    FROM beauty b
    LEFT OUTER JOIN boys bo
    ON b.boyfriend_id=bo.id
    WHERE b.id>3;
  2. 查询哪一个城市没有部门
    SELECT city
    FROM departments d
    RIGHT OUTER JOIN locations l
    ON d.location_id=l.location_id
    WHERE d.department_id IS NULL;