MYSQL新手学习笔记-D06 连接查询

D06:连接查询

目录

  • D06:连接查询
    • 含义
    • 分类
    • 数据库结构
    • 一、sql92标准
      • 1.等值连接
        • 语法:
        • 特点:
          • 案例1:查询girl名和她们男朋友boy名
          • 案例2:查询员工名和他们的部门名
      • 2. 为表起别名
        • 特点:
          • 案例1:查询员工名、工种号、工种名
          • 案例2:查询有奖金的员工名、部门名
          • 案例3:查询城市名中第二个字符为o的部门名和城市名
          • 案例4:查每个城市部门个数
          • 案例5:查有奖金的部门名,以及其领导编号和部门最低工资
          • 案例6:查每个工种工种名和员工个数,按员工个数排序
          • 案例7:查询员工名、部门名、和所在城市
      • 3.非等值连接
        • 语法:
          • 案例:查员工的工资和工资级别
      • 4.自连接
        • 语法:
          • 案例:查询员工名和上级的名称
    • 二、sql99语法
      • 语法:
      • 1. 内连接
        • 特点:
          • 案例1: 员工名 部门名
          • 案例2: 名字中包含e的员工名和他们的工种名
          • 案例3: 部门个数大于三的城市名和他们的部门个数
          • 案例4:查员工个数>3的部门数和员工个数,并降序排序
          • 案例5:查员工名、部门名工种名、并按部门名降序
      • 2.非等值连接
            • 案例:查员工工资级别
          • 案例:查工资级别下员工个数大于20的个数,并降序排序
      • 3.自连接
          • 案例:查员工名字 上级名字
        • 4.外连接
        • 特点
          • a.左外连接
          • 案例:查询那个部门没有员工
        • b.右外连接
          • 案例:查询那个部门没有员工
        • c.交叉连接

含义

又称多表查询。在多个表之间查找符合相应条件的数据。
笛卡尔乘积现象:
表1m行,表2n行,结果=m*n行
发生原因:
没有有效的连接条件
如何避免:
添加连接条件

分类

按年代分类:
1. sql92标准:只支持内连接
2.sql99标准:支持内连接+外连接(左外和右外)+交叉连接
按连接方式分类:

  • 一、内连接:
    • 1.等值连接
    • 2.非等值连接
    • 3.自连接
  • 外连接:
    • 1.左外连接
    • 2.右外连接
    • 3.全外连接
  • 交叉连接

数据库结构

MYSQL新手学习笔记-D06 连接查询_第1张图片
MYSQL新手学习笔记-D06 连接查询_第2张图片

一、sql92标准

1.等值连接

语法:
	select 查询列表
	from1 别名,表2 别名
	where1.key=2.key
	[and 筛选条件]
	[group by 分组字段]
	[having 分组后筛选]
	[order by 排序字段]
特点:

1.多表等值连接的结果是多表的交集部分
2.n表连接至少需要n-1个连接条件
3.一般为表起别名
4.多表顺序没有要求
5.可以搭配所有子句使用,分组、筛选等

案例1:查询girl名和她们男朋友boy名
SELECT NAME,boyName 
FROM boys,beauty
WHERE beauty.`boyfriend_id`=boys.`id`;
案例2:查询员工名和他们的部门名
USE myemployees;
SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;

2. 为表起别名

特点:
  • 提高语句简洁度
  • 区分多个重名的字段
    注意:如果为表起了别名,则原来的表名不可用
案例1:查询员工名、工种号、工种名
SELECT e.last_name,e.`job_id`,job_title
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`;
案例2:查询有奖金的员工名、部门名
SELECT last_name,department_name
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct`IS NOT NULL;
案例3:查询城市名中第二个字符为o的部门名和城市名
SELECT department_name,city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
AND city LIKE'_o%';
案例4:查每个城市部门个数
SELECT COUNT(*) AS 个数,city
FROM departments d,locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY city;
案例5:查有奖金的部门名,以及其领导编号和部门最低工资
SELECT d.department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.`department_id`=e.`department_id`
AND commission_pct IS NOT NULL
GROUP BY department_name,d.manager_id;
案例6:查每个工种工种名和员工个数,按员工个数排序
SELECT COUNT(*)AS 员工个数,job_title
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`
GROUP BY job_title
ORDER BY 员工个数;
案例7:查询员工名、部门名、和所在城市
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`;

3.非等值连接

语法:
	select 查询列表
	from1 别名,表2 别名
	where 非等值连接条件(如某个范围)
	[and 筛选条件]
	[group by 分组字段]
	[having 分组后筛选]
	[order by 排序字段]
案例:查员工的工资和工资级别
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`;

4.自连接

语法:
	select 查询列表
	from1 别名a,表1 别名b
	where 等值连接条件
	[and 筛选条件]
	[group by 分组字段]
	[having 分组后筛选]
	[order by 排序字段]
案例:查询员工名和上级的名称
 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	查询列表
from1 别名 【连接类型】
join2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by  排序列表】
  • 1.内连接:inner
  • 2.外连接
    • 左外:left【outer】
    • 右外:right【outer】
    • 全外:full【outer】
  • 3.交叉连接:cross

1. 内连接

select	查询列表
from1 别名 【连接类型】
inner join2 别名
on 连接条件
where 筛选条件
特点:
  1. inner可以省略
  2. 筛选条件放where后面,连接条件放on后面
案例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 city ,COUNT(*)AS 部门个数
FROM departments d
INNER JOIN locations l
ON d.`location_id`=l.`location_id`
GROUP BY city
HAVING 部门个数>3;
案例4:查员工个数>3的部门数和员工个数,并降序排序
SELECT COUNT(*)AS 个数,department_name
FROM employees e
INNER JOIN departments d
ON e.`department_id`=d.`department_id`
GROUP BY department_name 
HAVING 个数>3
ORDER BY 个数 DESC;
案例5:查员工名、部门名工种名、并按部门名降序
SELECT last_name,department_name,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 department_name DESC;

2.非等值连接

案例:查员工工资级别
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.`salary` BETWEEN g.`lowest_sal`AND g.`highest_sal`;
案例:查工资级别下员工个数大于20的个数,并降序排序
SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.`salary`BETWEEN g.`lowest_sal`AND g.`highest_sal`
GROUP BY grade_level 
HAVING COUNT(*)>20
ORDER BY grade_level DESC;

3.自连接

案例:查员工名字 上级名字
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`;
4.外连接
特点
  1. 外连接的查询结果为主表中的所有记录,显示从表中的匹配值,如果没有,则显示null.
  2. 左外连接 ,left左边是主表
    右外连接,right join 右边是主表
  3. 左外和右外交换两个表的顺序,可以实现同样的效果
  4. 全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
a.左外连接
案例:查询那个部门没有员工
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;
b.右外连接
案例:查询那个部门没有员工
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.`department_id`=e.`department_id`
WHERE e.`employee_id` IS NULL;
c.交叉连接
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

你可能感兴趣的:(MYSQL数据库)