首先说明一下 为啥我们要学SQL92标准
你学了本节以后就发现 92多表查询的语法规则和单表查询很接近
而99语法(请看十五节)则有点改变
为了接收起来更加容易
我们先看看92 反正学了不亏
表的别名 等值连接
概念很简单,通过等式控制限定,就如我们上一节讲的那样。
这里我们对之前的data1数据库也来个多表查询
结果大概是这样的:
代码如下:
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` ;
注意
》表(对象)可以起别名。
》限定属性(比如两张表都有id属性栏目)的时候,为了不让语句显得臃肿,用更短的别名更加方便工作。
》一旦用了别名 就只能用别名 因为原来长名字不识别了
非等值连接
其实很简单 不是WHERE a = b
形式的都行,比如用between and
或者大于小于号
我们现在来个案例 对于员工工资做个离散的等级划分 好像小学的A = 90~100 分 一样
案例 对于每个人 根据总工资的多少 执行ABCDEFG的评级
要求 不能用WHERE 加上case 或者 IF来限定,而是采用多表查询以及非等值连接的知识
等级评估表的形式如下:
create() 自定义创建你的第一张表
等级表的数据我们可以这么弄:
SQLyog 执行以下代码:
USE data1;
CREATE TABLE `grade-evaluation` (
`least` INT(12) NOT NULL,
`most` INT(12) NOT NULL,
`grade` VARCHAR(2) NOT NULL,
PRIMARY KEY (`grade`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
/*Data for the table `boys` */
INSERT INTO `grade-evaluation` (`most`, `least`, `grade`)
VALUES
(50000, 20000, 'S'),
(19999, 15000, 'A'),
(14999, 10000, 'B'),
(9999,5000, 'C'),
(4999,0, 'D')
这里:
》CREATE TABLE 创建表格 后面接名字
》NOT NULL 指的是默认值不为NULL
》如果想默认NULL : DEFAULT NULL
》括号内的参数就是栏目
,也就是对象实例的属性,每一列
》而行呢?也就是对象实例呢?
》用
INSERT INTO `grade-evaluation`
来实现,括号制定了输入数据的格式。
这样,我们获得了自己的第一张表:
我们可以用上面这样的等级表(grade-evaluation
)来评判之前工资表的等级:如下图效果:
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;
有几个比较好的问题需要说明:
1、栏目属性,表名等各种名称最好加`` 否则 grade-evaluation NAME 等名字会gg
2、WHERE 只对变量有效 对别名不识别QAQ
3、CONCAT() CONCAT_WS() 的区别搞清楚
4、between “较小值” and “较大值”
自连接
一张表里面,栏目属性之间的判断。
之前都是两张表间 甚至可以多张表间 WHERE e.id = f.id = g.id
这种形式
那为啥这也属于多表查询的范畴?
一个是语法相近
第二是 思路就是把一个表拆成两个表
说了这么多 我们来看实例:
这么个反人类的表格:
我想问 每个人的上级是谁呢?
这查起来太扎心了吧:)一个个去对 不如用自连接的方式搞定
我们把employees拆成两份为 a,b
生成的表可以是这种形式:
下面是实现代码:
USE data1;
SELECT
CONCAT_WS(
'-',
a.`last_name`,
a.`first_name`
) AS 名字,
a.`employee_id` AS 你的工号,
a.`manager_id` AS 你上司工号,
b.`last_name` AS 你上司
FROM employees a, employees b
WHERE a.`manager_id` = b.`employee_id`
ORDER BY 你上司;
明显可见 我们把employees表弄了两个 然后进行了多表查询
这就是所谓自连接 自己连接自己
要是上司名必须全名 我们稍微改改就行:
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 你上司;
总结
其实学到这里发现 92的多表不过是JOIN多了几张表而已,WHERE的条件是所谓的连接条件
连接条件执行完 就会只有一张表
当我们需要再对这张表进行筛选 就可以用AND+筛选条件(单表查询的筛选条件)
看完92的标准 我们接下来学习99的标准就会很容易了——其实就是将连接条件和筛选条件分开,改一个关键字罢了
下一站:数据库学习之MySQL (十五)—— SQL99 基本格式 内连接 等值连接 非等值连接 自连接
- 本文专栏
MySQL专栏 - 我的其他专栏 希望能够帮到你 ( •̀ ω •́ )✧
- 手把手带你学后端(服务端)
- python这么火 想要深入学习python 玩一下简单的应用嘛?
python应用
- 谢谢大佬支持! 萌新有礼了:)