MySQL复合查询和内外连接的操作代码
目录 一、复合查询 1.1 多表查询 1.2 自连接 1.3 子查询 1.3.1 单行子查询 1.3.2 多行子查询 1.3.3 多列子查询 1.3.4 在from子句中使用子查询 1.4 合并查询 1.4.1 union 1.4.2 union all 二、内外连接 2
目录一、复合查询1.1 多表查询1.2 自连接1.3 子查询1.3.1 单行子查询1.3.2 多行子查询1.3.3 多列子查询1.3.4 在from子句中使用子查询1.4 合并查询1.4.1 union1.4.2 union all二、内外连接2.1 内连接2.2 外连接2.2.1 左外连接2.2.1 右外连接
一、复合查询
1.1 多表查询
实际开发中往往数据来自不同的表,所以需要多表查询,但是可以将多张表做笛卡尔积后的表当做是一张表,也就是单表查询。我们用一个简单的公司管理系统,有三张表EMP、DEPT、SALGRADE来演示如何进行多表查询。
语法:from 表1, 表2 ...这样其实就是对多张表进行笛卡尔积,假设是两张表:
第一张表的第一行和第二张表的所有行组合。第一张表的第二行和第二张表的所有行组合。…
这样所有的组合,并不都是有意义的,所有一般都是根据条件筛选的。
在多表查询中,有可能多张表有相同的字段,为了便于区分,可以使用表名.字段名表示某一张表的某一个字段。
mysql> select dept.dname, emp.ename, emp.sal from emp,dept where dept.deptno = emp.deptno; +------------+--------+---------+ | dname | ename | sal | +------------+--------+---------+ | RESEARCH | SMITH | 800.00 | | SALES | ALLEN | 1600.00 | | SALES | WARD | 1250.00 | | RESEARCH | JONES | 2975.00 | | SALES | MARTIN | 1250.00 | | SALES | BLAKE | 2850.00 | | ACCOUNTING | CLARK | 2450.00 | | RESEARCH | SCOTT | 3000.00 | | ACCOUNTING | KING | 5000.00 | | SALES | TURNER | 1500.00 | | RESEARCH | ADAMS | 1100.00 | | SALES | JAMES | 950.00 | | RESEARCH | FORD | 3000.00 | | ACCOUNTING | MILLER | 1300.00 | +------------+--------+---------+ 14 rows in set (0.00 sec)
1.2 自连接
自连接是对一张表的查询,但是使用多张表的查询方式,自己做笛卡尔积。例如:
mysql> show create table emp \G
1. row
Table: emp
Create Table: CREATE TABLE emp
(
empno
int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
ename
varchar(10) DEFAULT NULL COMMENT '雇员姓名',
job
varchar(9) DEFAULT NULL COMMENT '雇员职位',
mgr
int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
hiredate
datetime DEFAULT NULL COMMENT '雇佣时间',
sal
decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
comm
decimal(7,2) DEFAULT NULL COMMENT '奖金',
deptno
int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号)。这是员工表,领导也是属于员工,所以无法只用一条简单查找语句对一张表查找两次,这就需要用到复合查询。子查询 — 即嵌套查询,使用两条查询语句mysql> select empno, ename from emp where empno = (select mgr from emp where ename = 'FORD');
+--------+-------+
| empno | ename |
+--------+-------+
| 007566 | JONES |
+--------+-------+
1 row in set (0.00 sec
使用自连接的两张表查询,这里需要对表使用别名
mysql> select leader.empno, leader.ename from emp as worker, emp leader where worker.mgr = leader.empno and worker.ename='FORD'; +--------+-------+ | empno | ename | +--------+-------+ | 007566 | JONES | +--------+-------+ 1 row in set (0.00 sec)
1.3 子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。