SQL语句——多表联合查询

1、合并结果集(union/union all):被合并的结果集必须列数与列类型完全相同。

    去重合并:SELECT * FROM g UNION SELECT * FROM h;

    不去重:SELECT * FROM g UNION ALL SELECT * FROM h;

2、连接查询(crossjoin):多表的乘积。

    内连接:inner(可省略) join on

隐式:SELECT e.ename,d.dname,e.job FROM emp AS e,dept AS d WHERE e.deptno = d.deptno;                             
显式:SELECT e.ename,d.dname,e.job FROM emp e INNER join dept d ON e.deptno = d.deptno;

    外链接:outer(可省略) join on

    左外连接:先查询左表(以左表为主),然后查询右表,满足条件的显示,不满足的显示为null。

左外连接:SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;

    右外连接:同左外。

    全外连接(MySQL不支持,故不写)。

    总结:在外链接中,如果SQL用的是Left join,on后面条件对left表没作用,只是对right表起过滤作用,where语句是在生成临时表后过滤left表。

    自然连接:Natural join,两张连接表中列名称和数据类型完全一致的列作为条件。

            SELECT * FROM emp NATURAL JOIN dept;
            SELECT * FROM emp NATURAL LEFT JOIN dept;
            SELECT * FROM emp NATURAL RIGHT JOIN dept;

总结: 1.查两张表关联列相等的数据 用内连接
    2.right表是left表的子集 用左外连接
    3.left表是right表的子集 用右外连接

    4.right 和 left 彼此之间有交集 但是互不为子集 使用全外连接

3、子查询:嵌套查询

    子查询语句在from 后:作为子表出现where后: 作为查询条件的一部分,并且可以使用关键字any(任意一个,相当于min)和all(所有的,相当于max)

    作为查询条件出现:

    单行单列:子查询结果只有一个单元格

    select * from emp where sal > (select sal from emp where ename="CLARK")。

    单行多列:

    查询员工表中 工作 和 工资 与 MARTIN完全相同的员工信息

    select * from emp where (job,sal) in (select job,sal from emp where ename="MARTIN")

    多行单列:

    SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30);

    作为查询子表出现:   

    多行多列:

    select e.ename,e.sal,d.dname,d.loc from emp e,(select dname,loc,deptno from dept) d where e.deptno = d.deptno and e.empno=7788


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值