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 外连接 左外连接 右外连接 全外连接 交叉连接
- 本文专栏
MySQL专栏 - 我的其他专栏 希望能够帮到你 ( •̀ ω •́ )✧
- 手把手带你学后端(服务端)
- python这么火 想要深入学习python 玩一下简单的应用嘛?
python应用
- 谢谢大佬支持! 萌新有礼了:)