数据库学习之MySQL (十四)—— SQL92 内连接 等值连接 非等值连接 自连接

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

首先说明一下 为啥我们要学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;

有几个比较好的问题需要说明:

扫描二维码关注公众号,回复: 9011019 查看本文章
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 基本格式 内连接 等值连接 非等值连接 自连接

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

猜你喜欢

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