Mysql练习题

第一天

1.列出至少有一个员工的所有部门。

select dname  from dept where deptno in(select deptno from emp);
或者
select distinct d.dname from emp e ,dept d where e.deptno = d.deptno;

2.列出薪金比“SMITH”多的所有员工。

 select ename from emp where sal >all(select sal from emp where ename = 'SMITH');

3.列出所有员工的姓名及其直接上级的姓名。

select w.ename,m.ename from emp w left outer join emp m on(w.mgr = m.empno);

4.列出受雇日期早于其直接上级的所有员工。

select e.ename,e.hiredate from emp e where 
e.hiredate < (select m.hiredate from emp m where m.empno = e.mgr);

5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

select d.dname,e.* from dept d left outer join emp e on(e.deptno = d.deptno);

6.列出所有“CLERK”(办事员)的姓名及其部门名称。

select d.dname,e.ename from dept d,emp e where d.deptno = e.deptno and 
job = 'CLERK';

7.列出最低薪金大于1500的各种工作。

select  job from emp group by job having min(sal) > 1500;

8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。

select ename from emp where deptno =(select deptno from dept where dname = 'SALES');

9.列出薪金高于公司平均薪金的所有员工。

select ename from emp where sal > (select avg(sal) from emp);

10.列出与“SCOTT”从事相同工作的所有员工。

select ename from emp where job = (select job from emp where ename = 'SCOTT');

11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。

select a.ename,a.sal from emp a where
 a.sal in (select b.sal from emp b where b.deptno = 30) and a.deptno<>30;

12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。

select ename,sal from emp a where sal > (select max(sal) from emp  where deptno = 30);

13.列出在每个部门工作的员工数量、平均工资和部门名称

select count(empno),avg(sal),d.dname from emp ,dept d where 
emp.deptno = d.deptno group by d.deptno;

14.列出所有员工的姓名、部门名称和工资。

select e.ename,d.dname,e.sal from emp e,dept d where e.deptno = d.deptno;

15.列出所有部门的详细信息和部门人数。

select d.*,count(empno) from emp e right outer join dept d  on (e.deptno = d.deptno) 
group by deptno;

16.列出各种工作的最低工资。

select job ,min(sal) from emp group by job;

17.列出各个部门的MANAGER(经理)的最低薪金。

select ename,min(sal) from emp  where job = 'MANAGER' group by deptno,ename;

18.列出所有员工的年工资,按年薪从低到高排序。

select ename,(sal + ifnull(comm,0))*12 as sal from emp order by sal desc;

第二天

  1. 找出EMP表中的姓名(ENAME)第三个字母是A 的员工姓名。
select ename from emp where ename like '__A%';
  1. 找出EMP表员工名字中含有A 和N的员工姓名。
 select ename from emp where ename like '%A%' and ename like '%N%';
  1. 找出所有有佣金的员工,列出姓名、工资、佣金,显示结果按工资从小到大,佣金从大到小。
select ename,sal,comm from emp where comm is not null order by sal ,comm desc;
  1. 列出部门编号为20的所有职位。
 select job from emp where deptno = 20;
  1. 列出不属于SALES 的部门。
select dname from dept where dname <> 'SALES';
  1. 显示工资不在1000 到1500 之间的员工信息:名字、工资,按工资从大到小排序。
select ename,sal from emp where sal not between 1000 and 1500 order by sal desc;
  1. 显示职位为MANAGER 和SALESMAN,年薪在15000 和20000 之间的员工的信息:名字、职位、年薪。(用between...and 求区间时候,不能用别名)
select ename, job , (sal + ifnull(comm,0))*12 yearsal from emp where 
job in('MANAGER','SALESMAN') and (sal + ifnull(comm,0))*12 between 15000 and 20000;
  1. 说明以下两条SQL语句的输出结果:
    SELECT EMPNO,COMM FROM EMP WHERE COMM IS NULL;
    SELECT EMPNO,COMM FROM EMP WHERE COMM = NULL;

第一条输出为

第二条输出为 : Empty set
说明:说明:IS NULL是判断某个字段是否为空,为空并不等价于为空字符串或为数字0;
--而 =NULL 是判断某个值是否等于 NULL,NULL = NULL和NULL <> NULL都为 FALSE。

  1. 让SELECT 语句的输出结果为
    SELECT * FROM SALGRADE;
    SELECT * FROM BONUS;
    SELECT * FROM EMP;
    SELECT * FROM DEPT;
    ……
    列出当前用户有多少张数据表,结果集中存在多少条记录。

  1. 判断SELECT ENAME,SAL FROM EMP WHERE SAL > '1500'是否抱错,为什么?
    不会报错,这儿存在隐式数据类型。

第三天

  1. 让SELECT TO_CHAR(SALARY,'L99,999.99') FROM HR.EMPLOYEES WHERE ROWNUM < 5 输出结果的货币单位是¥和$。

  1. 列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。
 select ename,sal,round(sal*1.08) totalsal from emp limit 5;
  1. 找出谁是最高领导,将名字按大写形式显示。
 select upper(ename) from emp where mgr is null;
  1. 找出SMITH的直接领导名字。
select ename from emp where empno = (select mgr from emp where ename = 'SMITH' );
  1. KING领导谁。
select ename from emp where mgr = (select empno from emp where ename = 'KING');
  1. 哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。
select w.ename 员工名字,w.sal 员工工资,m.ename 经理名字,m.sal 经理工资 from emp w,emp m where w.mgr = m.empno and w.sal > m.sal;
  1. 哪些员工和SMITH同部门。
 select ename from emp where deptno = 
(select deptno from emp where ename ='SMITH') and ename <> 'SMITH';
  1. 哪些员工跟SMITH做一样职位。
 select ename,job from emp where job in(select job from emp where ename = 'SMITH');
  1. 哪些员工跟SMITH不在同一个部门。
select ename from emp where deptno <>(select deptno from emp where ename = 'SMITH');
  1. 哪些员工跟SMITH做不一样的职位。
select ename,job from emp where job not in(select job from emp where ename ='SMITH');
  1. 显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。
select e.ename,e.comm,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno and  comm >0;
  1. 显示SALES部门有哪些职位。
select distinct e.job from emp e,dept d where e.deptno = d.deptno;
  1. 整个公司中,最高工资和最低工资相差多少。
select max(sal)-min(sal) from emp ;
  1. 提成大于0 的人数。
select count(empno) from emp where comm is not null ;
  1. 显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位。
select max(sal),min(sal),sum(sal),round(avg(sal) )from emp ;
  1. 整个公司有多少个领导。
select count(empno) from emp where empno in(select mgr from emp );
或者
select count(distinct mgr) from emp;
  1. 列出在同一部门入职日期晚但工资高于其他同事的员工:名字、工资、入职日期。
select a.ename,a.sal,a.hiredate from emp a where a.deptno in(select b.deptno 
from emp b where a.deptno = b.deptno and  a.sal > b.sal and a.hiredate > b.hiredate);

第四天

  1. 各个部门平均、最大、最小工资、人数,按照部门号升序排列。
select avg(sal),max(sal),min(sal),count(empno)
 from emp group by deptno order by deptno;
  1. 各个部门中工资大于5000的员工人数。
select count(empno) from emp where sal > 4000 group by deptno ;
  1. 各个部门平均工资和人数,按照部门名字升序排列。
select d.dname,avg(sal),count(empno) from 
emp e right outer join dept d on e.deptno = d.deptno
 group by d.deptno,d.dname order by d.dname;
  1. 列出每个部门中有同样工资的员工的统计信息,列出他们的部门号,工资,人数。
select e.deptno,e.sal,count(e.empno) from emp e left outer join emp d on e.deptno = d.deptno and 
e.sal = d.sal group by e.deptno,e.sal;
  1. 列出同部门中工资高于1000 的员工数量超过2 人的部门,显示部门名字、地区名称。
select d.dname,d.loc,count(e.empno) from dept d ,emp e where e.deptno = d.deptno and 
e.sal > 1000 group by e.deptno,d.dname,d.loc having  count(e.empno) > 2 ;
  1. 哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)。
select ename,sal from emp where sal > (select avg(sal) from emp);
  1. 哪些员工的工资,介于10号 和30号部门平均工资之间。
select ename,sal from emp where sal between (select avg(sal) 
from emp group by deptno having deptno = 30)and (select avg(sal) from emp
 group by deptno having deptno = 20);
  1. 所在部门平均工资高于2000 的员工名字。
select ename from emp where deptno in 
(select deptno from emp group by deptno having avg(sal) > 2000);
  1. 列出各个部门中工资最高的员工的信息:名字、部门号、工资。(要查询的信息必须和子查询中的信息排列顺序一致)
select ename,deptno,sal from emp where (deptno,sal) 
in(select deptno,max(sal) from emp group by deptno);
  1. 最高的部门平均工资是多少。
select max(deptsal.avgsal) from (select avg(sal)avgsal from emp group by deptno) as deptsal;

第五天

  1. 哪些部门的人数比90 号部门的人数多。
select deptno,count(empno) from emp group by deptno having count(empno)
    >(select count(empno) from emp group by deptno having deptno = 20);
  1. JONES的领导是谁(非关联子查询)。
select ename from emp where emp.empno = (select mgr from emp where ename = 'JONES');

3.JONES领导谁(非关联子查询)。

select ename from emp where mgr = (select empno from emp where ename = 'JONES');
  1. JONES 的领导是谁(关联子查询)。
select a.ename from emp a where exists
 (select 1 from emp b where a.empno = b.mgr and b.ename = 'JONES');
  1. Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(关联子查询)。
select ename from emp where emp.mgr = (select empno from emp where ename = 'JONES');
  1. 列出在同一部门共事,入职日期晚但工资高于其他同事的员工:名字、工资、入职日期
    (关联子查询)。
select a.ename,a.sal,a.hiredate from emp a ,emp b where 
a.deptno = b.deptno and a.hiredate > b.hiredate and a.sal > b.sal;
  1. 哪些员工跟SMITH不在同一个部门(非关联子查询)。
select ename from emp where deptno <> (select deptno from emp where ename = 'Smith');
  1. 哪些员工跟Smith不在同一个部门(关联子查询)。
select a.ename from emp a where not exists
(select 1 from emp b where a.deptno = b.deptno and b.ename = 'Smith');
  1. Finance部门有哪些职位(非关联子查询)。
select e.job ,d.dname from emp e ,dept d where e.deptno = d.deptno and d.dname = 'SALES';
  1. SALES部门有哪些职位(关联子查询)。
select a.job from emp a where exists 
(select 1 from dept d where a.deptno = d.deptno and dname = 'SALES');

关联子查询和非关联子查询的区别

一,非关联子查询

先执行子查询,也就是内部查询;再执行外部查询

二,关联子查询

外部查询返回的第一行数据进入内部查询
内部查询接收到外部的第一条数据后,调出内部查询的数据,并根据条件进行筛选,然后返回内部select的值
外部根据条件看这个值是否要返回给外部select;
(此时外部查询返回的第一行数据处理完)
按顺序,外部查询返回的第二行数据进入内部查询

返回给外部select;
循环执行,直到外部查询的所有数据全部处理完

33..查询所有大于本部门平均工资的员工信息。

select * from emp e where sal > (select avg(sal) from emp 
where e.deptno = deptno group by deptno);

34.列出至少有三个员工的所有部门和部门信息。

select d.* from emp e ,dept d where e.deptno = d.deptno 
group by e.deptno,d.dname,d.loc having count(e.empno) >= 3;

数据操作与事务控制

1.有信员工信息如下:empno=200、ENAME=张三、JOB=软件工程师、HIREDATE=2008年4月16日、DEPTNO=10、SAL=3000,请将此员工信息插入EMP表中。

INSERT INTO emp1 (
   empno,
   ename,
   job,
   hiredate,
   deptno,
   sal
)
VALUES
   (
       200,
       '张三',
       '软件工程师 ',
       '2008-04-16 ',
       10,
       3000
   );

2.修改EMP表中的数据,为工资小于2000元的员工加500元工资。

update emp1 set sal = sal + 200 where sal < 2000;

3.修改薪资小于2000元的员工的入职日期为当日。

update emp1 set hiredate = SYSDATE() where sal < 2000;

4.删除所有入职日期小于2007年1月1日的员工信息。

 delete from emp1 where  hiredate < '2007-01-01';

5.删除所有薪资等于员工平均薪资的员工信息。

DELETE
FROM
    emp
WHERE
    empno IN (
        SELECT
            *
        FROM
            (
                SELECT
                    a.empno
                FROM
                    emp AS a,
                    (
                        SELECT
                            deptno,
                            AVG(sal) AS avgsal
                        FROM
                            emp
                        GROUP BY
                            deptno
                    ) AS b
                WHERE
                    a.deptno = b.deptno
                AND a.sal = b.avgsal
            ) AS QUERY
    )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352