数据库学习之MySQL (十五)—— SQL99 基本格式 内连接 等值连接 非等值连接 自连接

MySQL学习专栏 正在持续更新中:)

SQL99 基本格式

之前说到,SQL99支持 MySQL的内连接(inner) 外连接(outer) 还有 交叉连接(cross)

SQL99的格式如下:

SELECT 栏目属性
FROM 表1 AS 别名1 【连接类型】
JOIN 表2 AS 别名2 
ON 连接条件
WHERE 筛选条件
GROUP BY 分组
HAVING 分组后筛选条件
ORDER BY 排序规则

可见 不同与SQL92 两个表连接用了个JOIN 还要求说明连接类型:

内连接 inner

外连接 outer
		左外连接 left [outer]
		右外连接 right [outer]
		全外连接 full [outer]
交叉连接 cross

而且 99实现了所谓了 连接条件与筛选条件分离解耦的功能,反正不混在一起会更加清晰,不用像之前的WHERE AND AND AND...

内连接 之 等值连接

其实就是个格式问题 我们已经学了92的等值连接 对比一下就知道了
这是上一节的92代码:

USE data1;
SELECT 
  e.last_name,
  e.job_id,
  j.job_title 
FROM
  employees AS e,
  jobs AS j 
WHERE e.`job_id` = j.`job_id` ;

这是99语法:

USE data1;
SELECT 
  e.last_name,
  e.job_id,
  j.job_title 
FROM
  employees AS e
INNER JOIN jobs AS j 
ON e.`job_id` = j.`job_id` ;

其实就是 99把连接的限制(所谓连接条件)用ON来说明,
ON之后就只有一张表了,我们根据之前学的单表查询,再WHERE添加其他的限制(就是我们单表查询的套路了) 这个不理解可以继续看下面一段,再尝试理解一下。

内连接 之 非等值连接

其实就是ON后面跟的条件变了 与92套路相同
这是92的代码 上一节也讲了:

USE data1;
SELECT 
 CONCAT_WS(
   '-',
   e.`first_name`,
   e.`last_name`,
   e.`phone_number`
 ) AS ID,
 e.`salary` AS 基本工资,
 e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) AS 总工资,
 g.`grade` AS 工资评级 
FROM
 `employees` e,
 `grade-evaluation` g 
WHERE e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) BETWEEN g.`least` AND g.`most` 
ORDER BY 总工资 DESC;

换成99 就是:

USE data1;
SELECT 
 CONCAT_WS(
   '-',
   e.`first_name`,
   e.`last_name`,
   e.`phone_number`
 ) AS ID,
 e.`salary` AS 基本工资,
 e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) AS 总工资,
 g.`grade` AS 工资评级 
FROM
 `employees` e
INNER JOIN `grade-evaluation` g 
ON e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) BETWEEN g.`least` AND g.`most` 
ORDER BY 总工资 DESC;

那么92中 我再把工资不到3000的剔除 应该用的什么方法呢?
其实就是单表查询的套路 一直加AND:

WHERE e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) BETWEEN g.`least` AND g.`most` 
AND e.`salary`>3000

同样的 用99语法 我们把连接条件筛选条件 分离 就会是:

ON e.`salary` * (1+ IFNULL(e.`commission_pct`, 0)) BETWEEN g.`least` AND g.`most` 
WHERE e.`salary`>3000

内连接 之 自连接

我们直接用上一节的案例 对比代码来讲即可:
92代码:

USE data1;
SELECT
  CONCAT_WS(
    '-',
    a.`last_name`,
    a.`first_name`
  ) AS 名字,
  a.`employee_id` AS 你的工号,
  a.`manager_id` AS 你上司工号,
  CONCAT_WS(
    '-',
    b.`last_name`,
    b.`first_name`
  ) AS 你上司
FROM employees a, employees b
WHERE a.`manager_id` = b.`employee_id`
ORDER BY 你上司;

99代码, 就把WHERE关键字改成ON就行啦 也就是:

USE data1;
SELECT
  CONCAT_WS(
    '-',
    a.`last_name`,
    a.`first_name`
  ) AS 名字,
  a.`employee_id` AS 你的工号,
  a.`manager_id` AS 你上司工号,
  CONCAT_WS(
    '-',
    b.`last_name`,
    b.`first_name`
  ) AS 你上司
FROM employees a, employees b
ON a.`manager_id` = b.`employee_id`
ORDER BY 你上司;

ON接的是 连接条件

下一站:数据库学习之MySQL (十六)—— SQL99 外连接 左外连接 右外连接 全外连接 交叉连接

发布了28 篇原创文章 · 获赞 24 · 访问量 8928

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104153716