MySQL语句

今天是几道例题加上一些详解,

以下是代码:

 
 

#子查询 select * from emp where sal>(select sal from emp where ename='Clark'); select * from emp where (job, deptno)=(select job, deptno from emp where ename='Allen'); select * from emp where deptno in (select deptno from dept where loc in ('New York', 'Dallas')); select * from emp where sal<any (select sal from emp where job='clerk'); select * from emp where sal>all (select sal from emp where job='clerk'); select deptno, avg(sal) avg_sal from emp group by deptno; select max(avg_sal) from (select deptno, avg(sal) avg_sal from emp group by deptno) sal_level; select max(avg_sal) from (select deptno,avg(sal) avg_sal from emp group by deptno) sal_level; #查询练习:列出至少有四位员工的所有部门信息 #1 首先是根据部门进行分组 group by 算出所有部门的信息 之后就是对于分组后的条件筛选 用having即可 #先计算后条件筛选 select deptno ,count(empno) as 部门人数 from emp group by deptno having 部门人数>=4; #select deptno,count(empno) cou from emp group by deptno; #列出薪金比“smith”多的员工信息 #1先找出simth,之后找出他的薪金,之后将再select所有的人和smith的sal进行比较where #子查询,先找到他的工资,之后让所有人比较一下,输出 select sal from emp where ename=upper('smith'); select * from emp where sal >=(select sal from emp where ename=upper('smith')); #列出所有员工的姓名和对应其上级的姓名,没有上级的雇员也要列出来 #该程序属于自关联查询 #员工姓名在前面,左链接,表 缩写left join 表2 缩写 on 缩写。上级顶多就只有一个,但是下级可能会有很多个,所以, #领导那一列的字段名=员工字段名 左内连接 select e.ename '雇员姓名',m.ename '领导姓名' from emp e left join emp m on e.mgr=m.empno; #列出受雇日期早于其上级的员工的姓名,编号,部门名称 #自身关联 ,查找mgr=empno时还要比较hiredate ,先查询姓名 -- select e.empno e.ename from emp e,emp m -- where e.mgr=m.empno and e.hiredate < m.hiredate #select e.empno ,e.name ,d.dname from emp e,emp m ,dept d 通过关联表来获取到所有的包含所需信息的内容 #where e.mgr=e.empno 两种编号对应,找到所对应的上级领导 -- and 就是一个比较 #因为是表要链接起来,外键就是deptno 让两个deptno相等,就可以直接查询了 select e.empno,e.ename,d.dname from emp e ,emp m,dept d where e.mgr=m.empno and e.hiredate<m.hiredate and e.deptno=d.deptno; #5. 【练习】列出所有“CLERK”(办事员)的姓名及其部门名称、部门人数  找出所有办事员的姓名及部门编号 #姓名和部门名称直接并表后select就可以了,就是部门人数肯定是不会在两张表里面找到,所以就得group by 分组统计 #将分组统计后的表,当成一个以deptno为主键的表,和前两个表进行关联, select e.ename ,d.deptno, ed.cou from emp as e,dept as d,(select deptno ,count(empno) as cou from emp group by deptno )as ed where job=upper('clerk') and e.deptno=d.deptno and e.deptno=ed.deptno; #6. 【练习】列出最低薪金大于 1500 的各种工作及此从事此工作的全部雇员人数 #group by 分组的运用,分组标准有一个,分组的同时可以指定分组后的筛选条件having 加条件,不仅仅是分组后的数据的相关条件,分组前也可以有 select job ,count(*) from emp group by job having min(sal)>1500; #【练习】列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部 门编号。 #两张表的链接在于销售部们的编号是一样的,所以要获得名称,就有先获得部门的编号,之后再将编号作为where的依据进行查询 select deptno from dept where dname='SALES' select ename from emp where deptno=(select deptno from dept where dname='SALES'); #【练习】列出薪金高于公司平均薪金的所有员工,所在部门、上级领导 select e.*,d.dname,d.loc from emp e,dept d where sal > (select avg(sal) from emp) and e.deptno = d.deptno;

#查询练习:列出至少有四位员工的所有部门信息

#1 首先是根据部门进行分组 group by 算出所有部门的信息 之后就是对于分组后的条件筛选 用having即可

#先计算后条件筛选,having不仅可以支持筛选已经分完组后的数据,其实也可以支持原来的表的筛选条件

比如可以只筛选之前的员工月薪在什么范围内的,只让这些人进行分组

select deptno ,count(empno) as 部门人数 from emp group by deptno having 部门人数>=4;

自连接的一些技巧

1 识别自连接:就像员工表,一张表内,不同的记录之间,也就是不同行之间的内容有着隶属关系,比如一条记录行之中,会有他的上司的工号,我们要做的就是让这两个对象之间产生联系,让他们在一行出现,这种情况下就需要用到自连接

2 代码指令的最后要加上where= 表.上司=表.员工

多表关联查询的时候

1表连接和子查询灵活运用

2遇到能表连接的,就是有外键相连,但是所需信息在另一张表上,这样的直接无脑连接就OK

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值