sql连接查询
按功能分类:
内连接:
等值连接、非等值连接、自连接
外连接:
左外链接、左链接
右外链接、右链接
完全外链接
全连接
交叉连接
按年代分类
sql 92标准,又称sql2
sql 99标准【推荐】,又称sql3
交叉连接
--笛卡尔积(将两张表的数据拼接在一起,总记录数为两张表记录量的乘积 ( 表*表 )
select * from a,b;
内连接 INNER JOIN
等值连接
#92语法(查询A表人对应的妻子)
select * from a,b where a.wife = b.id;
#99语法
select * from a inner join b on a.wife = b.id;
非等值连接
#查询每个员工对应的工资等级
select e.ename, s.grade
from emp e
inner join salgrade s
on e.sal between s.losal and s.hisal;
自连接
#查询每个人的领导(一张员工表领导也是这个公司的员工)
select e1.ename,'上司是',e2.ename
from emp e1
inner join emp e2
on e1.mgr = e2.empno;
外连接:
左连接LEFT JOIN
select * from a left join b on a.wife = b.id;
右连接RIGHT JOIN
select * from a right join b on a.wife = b.id;
左外链接
select * from a left join b on a.wife = b.id where b.id is null;
右外链接
select * from a right join b on a.wife = b.id where a.id is null;
完全外链接
mysql不支持full join
select * from a left join b
on a.wife = b.id where b.id is null
union all #union all是将两个select语句的结果求并集
select * from a right join b
on a.wife = b.id where a.wife is null;
全连接
除了显示满足连接的条件的行外,还显示了join两侧表中所有满足检索条件的行
select * from a left join b
on a.wife = b.id
union all
select * from a right join b
on a.wife = b.id;
另附数据表
CREATE TABLE EMP
(EMPNO int(4) not null ,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT(4),
HIREDATE DATE DEFAULT NULL,
SAL DOUBLE(7,2),
COMM DOUBLE(7,2),
primary key (EMPNO),
DEPTNO INT(2)
)
;
CREATE TABLE SALGRADE
( GRADE INT,
LOSAL INT,
HISAL INT );
#自行加数据
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7369, 'SMITH', 'CLERK', 7902, '1980-12-17'
, 800, NULL, 20);
还没有评论,来说两句吧...