Mysql自连接的一些用法

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

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; 

查询的结果:

上面的是一张职员信息表,如果我要查询这张表中的每个职员的上司,那么必须使用自连接来查询.所以为了能实现这个查询,需要给这张表取两个别名,而且查询中所用的所有数据都需要加上表的别名前缀,因为两个表的数据列完全一样.

尾言:万事开头难,中间难,最后都很难!!!

原文地址:https://www.cnblogs.com/weichao1996/p/8519997.html

时间: 2024-08-10 09:36:53

Mysql自连接的一些用法的相关文章

MySQL触发器的正确用法

一.创建触发器的基本语法: CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 触发器语句 触发事件包括:INSERT.UPDATE.DELETE 二.正确案例演示 如果想在sql文件中直接创建触发器,下面为一个完整的sql文件创建(含触发器的创建)示例: use mysql drop database if exists myTest; create database myTest default charset=gb2312; u

mysql中UNION ALL用法

MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 union select * from table2 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序. MySQL中的UNION ALL UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集

MySQL之alter语句用法总结

MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL  COMMENT '注释说明' alter table tableName add newColumn varchar(8) comment '新添加的字段' 3:修改列的类型信息 ALTER TABLE [表名字] CHANGE [列名称][新列名称(这里可以用和原来列同名即可)] BIGINT

Python操作MySQL -即pymysql/SQLAlchemy用法

本节介绍Python对于MySQL的一些操作用法 模块:pymysql(等同于MySQLdb) 说明:pymysql与MySQLdb模块的使用基本相同,学会pymysql,使用MySQLdb也就不是问题 安装API pip install PyMySQL 操作 #!/usr/bin/env python # -*- coding: utf-8 -*- # auth : pangguoping import pymysql # 创建连接 conn = pymysql.connect(host='1

mySQL中replace的用法

MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪 mysql replace实例说明: UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); REPLACE(str,from_str,to_str) 在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串 这个函数用来批量替换数据中的非法关键字是很有用的!如下例

mysql中event的用法详解

一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程. 二.适用范围对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理. 例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表. 三.使用权限单独使用event调用SQL语句时,查看和创建

Mysql 分页语句Limit用法

转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. Sql代码   SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须

Mysql中limit的用法详解

对比Oracle.SQL Server,个人感觉MySql的分页是最好用的,现在总结一下,写在这里. Mysql中limit的用法: 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数. LIMIT 接受一个或两个数字参数.参数

MySQL 存储过程CASE语句用法

MySQL提供了一个替代的条件语句CASE. MySQL CASE语句使代码更加可读和高效. CASE语句有两种形式:简单的搜索CASE语句.下面讲讲MySQL 存储过程CASE语句用法. 1,CASE语法结构 CASE case_expression WHEN when_expression_1 THEN commands WHEN when_expression_2 THEN commands ... ELSE commands END CASE; 2,CASE应用实例 DELIMITER