您的位置:首页 > 数据库 > MySQL

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

2020-06-05 08:08 417 查看

分组查询

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

条件分组

案例:

  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;

分组筛选小结,分组查询的筛选可以分为分组前的筛选和分组后的筛选,两者的主要区别在于筛选条件,分组前通过原始表,分组后通过分组后的结果集作为筛选。

按表达式或函数分组

案例:

  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;

也可以添加排序,排序放在最后。

连接查询

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

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

sql92标准(仅支持内连接)

  1. 等值连接

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

案例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;

案例3:可以加分组
查询每个城市的部门个数
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.

location_id
=l.
location_id

GROUP BY city;

案例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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: