MySQL的查询操作

和自甴很熟 提交于 2020-01-19 14:33:52

1.子查询

1. 将查询的结果集当做一张表再次进行查询[自连接查询]

查询每个员工的编号,姓名和其上司的编号姓名

select empno,ename,mgr from emp;

select empno,ename from emp;

select * from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b;

如果从两张表或者两个结果集中取数据,一定需要等值条件,否则就会出现笛卡尔积

select * from a,b;

加上等值条件

select * from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b where a.mgr=b.empno;

select a.*,b.ename from (select empno,ename,mgr from emp) a,(select empno,ename from emp) b where a.mgr=b.empno;

select empno,ename,mgr m ,(select ename from emp where empno=m) man from emp;

2..将查询的结果作为一个字段[只能返回一行数据]

select empno,ename,mgr m ,(select ename,sal from emp where empno=m) man from emp;

 

3.将查询的结果作为条件

查询工资最高的人的信息【查询结果只有一个值的情况】

select max(sal) from emp;

select * from emp where sal=(select max(sal) from emp);

查询部门人数不为0的所有部门

select deptno from emp group by deptno having count(empno)>0;

将查询的结果作为条件【查询结果有多个值的情况】

select * from dept where deptno in(select deptno from emp group by deptno having count(empno)>0);

2.连接查询

1.自然连接

查询员工的编号,姓名,岗位,工资和部门名称,办公地点

select empno,ename,job,sal,dname,loc from emp,dept where emp.deptno=dept.deptno;

 

2.内连接 inner join     内连接是取两个表的交集

查询员工的编号,姓名,岗位,工资和部门名称,办公地点

select empno,ename,job,dname,loc from emp inner join dept on emp.deptno=dept.deptno;

如果没有写inner,默认就是内连接

select empno,ename,job,dname,loc from emp2 join dept on emp2.deptno=dept.deptno;

3.外链接 out join

外链接分为左外连接left out join   右外连接 right out join    全外连接 full out join

      左外连接:以左表的数据为基准【会查询左表的所有数据】

//查询所有员工的所属部门

select empno,ename,job,dname,loc from emp2 left join dept on emp2.deptno=dept.deptno;

    右外连接:以右表的数据为基准[会查询右表的所有数据]

//查询所有部门的员工情况

select empno,ename,job,dname,loc from emp2 right join dept on emp2.deptno=dept.deptno;

 

克隆一张表,带数据

create table emp2 as select * from emp;

 

克隆一张空表,不带数据

create table emp3 as select * from emp where 1=2;


3.交集 并集 与差集

jion    union     union all       MINUS

交集:使用内连接查询

并集:

union和union all

       select * from emp where deptno>10;

       select * from emp where deptno<30;

 合并结果集并去掉重复数据

select * from emp where deptno>10

union

        select * from emp where deptno<30;

合并结果集 保留重复数据

select * from emp where deptno>10

union all

        select * from emp where deptno<30;

差集  minus ( MySQL不支持)

select * from emp where deptno>10

minus  

        select * from emp where deptno<30;

  MYSQL中可以用not in取差集

    查询emp2 不包含在部门中的员工

 select * from emp2 where deptno not in(select deptno from dept);

    查询没有员工的部门

     

     select * from dept where deptno not in(select distinct deptno from emp);

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!