Mysql自连接的一些用法
2024-08-20 06:27:47
自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。
mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。
我们举例说明,下面是商品采购表,我们需要找到采购价格比惠惠高的所有信息。
一般情况我们看到这张表我们第一时间用语句进行操作:
1 SELECT * FROM shoping WHERE price>27
可想而知,这是有多么简单,假设你并不知道数据库表详细数据或者数据量相当庞大呢?作为一个数据库管理员,我们就要用别的方式迅速找出所需要的数据。
分步查询
SELECT price FROM shopping WHERE name='惠惠' //得出price查询结果为27
SELECT * FROM shopping WHERE price>27
我们可以获取到如下表信息:
与采用自连接的方式相比,这种方法需要对中间结果进行人工干预,显然不利于程序中的自动处理操作。
自连接方式:
SELECT b.*
from shopping as a,shopping as b
where a.name='惠惠'
and a.price<b.price
order by b.id2018-03-06
获取到如下表信息:
注意点:
别名 a,b虽然名称不同,但是同一个表,定义别名的目的是更方便在自身进行删选。
执行select通过(中间表)所得到的b.*,,就是最终结果。
再举个实例:
CREATE TABLE dept( -- 部门表
deptno INT PRIMARY KEY,-- 部门编号
dname VARCHAR(14),-- 部门名称
loc VARCHAR(13)-- 地点
);
ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO dept VALUES(10, 'Accounting', 'New York') ;
INSERT INTO dept VALUES(20, 'Research', 'Dallas') ;
INSERT INTO dept VALUES(30, 'Sales', 'Chicago') ;
INSERT INTO dept VALUES(40, 'Operations', 'Boston') ;
INSERT INTO dept VALUES(50, 'Admin', 'Washing') ;
CREATE TABLE emp( -- 员工表
empno INT NOT NULL PRIMARY KEY,-- empno员工号
ename VARCHAR(10), -- ename员工姓名
job VARCHAR(10),-- job工作
mgr INT,-- mgr上级人员编号
hiredate DATETIME,-- 受雇日期
sal DOUBLE,-- 薪金
comm DOUBLE,-- 佣金
deptno INT,-- 部门编号
FOREIGN KEY(deptno) REFERENCES dept(deptno)
);
ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO emp VALUES(7369, 'Smith', 'Clerk',7902, '1980-12-17',800,0,20) ;
INSERT INTO emp VALUES(7499, 'Allen', 'Salesman',7698,'1981-2-20',1600,300,30) ;
INSERT INTO emp VALUES(7844, 'Turner', 'Salesman',7499, '1981-9-8',1500,0,30) ;
INSERT INTO emp VALUES(7698, 'Tom', 'Manager',0, '1981-9-8',6100,600,40) ;
INSERT INTO emp VALUES(7876, 'Adams', 'Clerk',7900, '1987-5-23',1100,0,20) ;
INSERT INTO emp VALUES(7900, 'James', 'Clerk',7698, '1981-12-3',2400,0,30) ;
INSERT INTO emp VALUES(7902, 'Ford', 'Analyst',7698, '1981-12-3',3000,NULL,20) ;
INSERT INTO emp VALUES(7901, 'Kik', 'Clerk',7900, '1981-12-3',1900,0,30) ;
打开创建好的表:
如果说列出所有员工的姓名及其直接上级的姓名,我们可以通过自连接进行这样的操作:
SELECT e.ename,(SELECT ename FROM emp d WHERE d.empno=e.mgr) AS boss FROM emp e;
查询的结果:
上面的是一张职员信息表,如果我要查询这张表中的每个职员的上司,那么必须使用自连接来查询.所以为了能实现这个查询,需要给这张表取两个别名,而且查询中所用的所有数据都需要加上表的别名前缀,因为两个表的数据列完全一样.
尾言:万事开头难,中间难,最后都很难!!!
最新文章
- Virtual Box配置CentOS7网络(图文教程)
- clientTarget与用户代理别名
- 关于MySQL redo log,挖些坑,慢慢填
- paper 44 :颜色矩和颜色相关图(color correlogram)
- iPhone左下角app图标
- 系统spt_values表--生成时间方便left join
- zabbix client安装配置执行
- 使用Vitamio打造自己的Android万能播放器(4)——本地播放(快捷搜索、数据存储)
- bnu 34986 Football on Table(数学+暴力)
- Hibernate逆向代码问题
- 深入解析浏览器的幕后工作原理(三) 呈现树和 DOM 树的关系
- 【redis】1.redis-windows安装+配置介绍
- stm32中断优先级管理与外部中断编程
- Python关键点笔记之使用 pyenv 管理多个 Python 版本依赖环境
- 04 Zabbix核心概念回顾
- Oracle学习笔记(6)——函数
- Mac下的paths.d目录神奇用法
- 数论——扩展的欧几里德算法 - HDU2669
- i2c 通信
- 开启mysql的远程访问
热门文章
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
- 在SpringBoot中存放session到Redis
- 【前端】Vue2全家桶案例《看漫画》之三、引入vuex
- 玩转FFmpeg的7个小技巧
- Linux忘记开机密码怎么办?
- Android5.1系统WebView内存泄漏场景
- R语言︱集合运算——小而美法则
- WebService之CXF注解之五(配置文件)
- windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址
- E: 未发现软件包 install_flash_player_11_linux.x86_64.tar.gz