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

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 外连接 左外连接 右外连接 全外连接 交叉连接

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值