SQL作业

-- 查询月薪最高的员工姓名和工资 - 子查询/嵌套查询+聚合函数
-- select ename, sal from tb_emp order by sal desc limit 1;
select ename, sal from tb_emp where sal=(
select max(sal) from tb_emp
);

-- 查询员工的姓名和年薪((月薪+补贴)12)
select ename, (sal+ifnull(comm, 0))12 as 年薪 from tb_emp order by 年薪 desc;

-- 查询有员工的部门的编号和人数 - 分组查询+聚合函数
select dno, count(dno) from tb_emp group by dno with rollup;

-- 查询所有部门的名称和人数 - 子查询+连接查询(左外)
select dname as 部门名称, ifnull(total, 0) as 人数 from tb_dept t1 left join (select dno, count(dno) as total from tb_emp group by dno) t2 on t1.dno=t2.dno;

-- 查询月薪最高的员工(Boss除外)的姓名和工资 - 空值判断
select ename, sal from tb_emp where sal=(select max(sal) from tb_emp where mgr is not null);

-- 查询月薪超过平均薪水的员工的姓名和工资
select ename, sal from tb_emp where sal>(select avg(sal) as avgsal from tb_emp);

-- 查询月薪超过其所在部门平均薪水的员工的姓名、部门编号和工资
select ename, t1.dno, sal, round(agvsal, 2) from tb_emp t1 inner join (select dno, avg(sal) as avgsal from tb_emp group by dno) t2 on t1.dno=t2.dno where sal>avgsal;

-- 查询部门中薪水最高的人姓名、工资和所在部门名称
select ename, sal, dname from (select ename, sal, t1.dno from tb_emp t1 inner join (select dno, max(sal) as maxsal from tb_emp group by dno) t2 on t1.dno=t2.dno where sal=maxsal) t3 inner join tb_dept t4 on t3.dno=t4.dno;

-- 查询主管的姓名和职位
select ename, job from tb_emp where eno in (select distinct mgr from tb_emp where mgr is not null);

-- 通常不推荐使用in或者not in集合运算和distinct去重操作
-- 可以考虑用exists或not exists替代掉集合运算和去重操作
select ename, job from tb_emp t1 where exists (select 'x' from tb_emp t2 where t1.eno=t2.mgr);

select 'x';
select 'x' from dual;
select 'x' from tb_emp;
select 'x' from tb_emp where eno=7800;
select 'x' from tb_emp where eno=7900;
select 'x' from dual where exists (select * from tb_emp where ename like '张%');
select 'x' from dual where not exists (select * from tb_emp where ename like '王%');

-- 查询月薪排名4~6名的员工姓名和工资
select ename, sal from tb_emp order by sal desc limit 3, 3;
select ename, sal from tb_emp order by sal desc limit 3 offset 3;

-- (存储)过程/函数:把一系列的SQL可以封装到一个过程中,而且可以加上分支和循环,将来通过过程的名字直接调用过程即可,因为创建过程时已经提前编译了SQL语句,所以比直接执行SQL语句性能更好

delimiter $$

create procedure sp_dept_avg_sal(deptno int, out avgsal float)
begin
select avg(sal) into avgsal from tb_emp where dno=deptno;
end$$

delimiter ;

call sp_dept_avg_sal(20, @a);

-- 索引(index)
-- 索引可以加速查询所以应该在经常用于查询筛选条件的列上建立索引
-- 索引会使用额外的存储空间而且会让增删改变得更慢(因为要更新索引)
-- 所以不能够滥用索引
create index idx_emp_ename on tb_emp (ename);
drop index idx_emp_ename on tb_emp;

-- 视图:查询的快照(简化查询操作)
-- 通过视图可以将用户的访问权限限制到某些指定的列上
create view vw_emp_dept as
select eno, ename, dname from tb_emp t1 inner join tb_dept t2 on t1.dno=t2.dno;

select ename, dname from vw_emp_dept;

drop view vw_emp_dept;

-- explain生成执行计划
explain select eno, ename from tb_emp where eno=7800;
explain select eno, ename from tb_emp where eno<>7900;
explain select eno, ename from tb_emp where ename='张三丰';
explain select eno, ename from tb_emp where ename like '张%';
explain select eno, ename from tb_emp where ename like '%张';
explain select eno, ename from tb_emp where ename<>'张三丰';

-- 触发器:在执行增删改操作时可以触发其他的级联操作,但是有可能导致“锁表”现象,因此实际开发中应该避免使用触发器。

-- update tb_dept set dno=11 where dno=10;
-- delete from tb_dept where dno=11;

delimiter $$

create trigger tr_dept_update
after update on tb_dept for each row
begin
update tb_emp set dno=new.dno where dno=old.dno;
end$$

delimiter ;

drop trigger tr_dept_update;

-- DCL:授予权限(grant to)和召回权限(revoke from)
create user 'hellokitty'@'%' identified by '123123';

grant all privileges on hrs.* to 'hellokitty'@'%';

revoke insert, delete, update on hrs.* from 'hellokitty'@'%';

drop user 'hellokitty'@'%';

-- 事务(transaction)- 把多个增删改的操作做成不可分割的原子性操作
-- 要么全部都做,要么全都不做

-- start transaction;
-- 开启事务环境
begin;

delete from tb_emp;

-- 提交(事务中的所有操作全都生效)
commit;
-- 回滚(事务中的所有操作全部撤销)
rollback;

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

推荐阅读更多精彩内容

  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,083评论 0 0
  • 目标 聚合函数 分组函数 子查询 多行子查询 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资?...
    wqjcarnation阅读 4,150评论 0 6
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,910评论 0 4
  • 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资? –查询工资最高和最低的工资是多少? –查询公...
    C_cole阅读 7,292评论 0 3
  • 我在回忆 回忆那如明镜般的湖泊 微风和煦 柳条轻曳 涟漪荡漾 隐约念起那时的单纯 宛如那水晶 晶莹剔透 纯洁无疵 ...
    荼蘼猫丨阅读 291评论 0 2