|
i.求10这个部门的所有员工 分析:查员工信息;但只是查部分员工而不是全部员工的信息。那是哪部分员工呢?条件是:部门编号为10的员工。用where子句。员工表包含部门信息,所以还是单表查询。 select * from emp where deptno=10; ii.求名字是KING的这个人的信息 select * from emp where ename=’KING’; iii.求薪水大于2000的员工信息 select * from emp where sal>2000; iv.求部门不是10的员工信息 (1)select * from emp where deptno<>10; (2)select * from emp where deptno!=10; v.求薪水在800和1500之间的员工信息(包含800和1500) select * from emp where sal between 800 and 1500; vi.列出deptno为10或者30,并且工资>2000的所有人 select * from emp where deptno in(10,30) and sal>2000; vii.利用in操作符,列出部门10和20的人员 select * from emp where deptno in (10,20); viii.利用like操作符,查询名字中含有"H"的人员 select * from emp where ename like ‘%H%‘; ix.分别利用like操作符和正则表达式,查询名字中含有"S"或者"M"的人员 select * from emp where ename like ‘%H%’or ename like‘%S%’;
10.下面两句话是否结果相同:相同。
select * from Emp where not ( deptno in(10,20)); select * from Emp where deptno not in(10,20);
11.数据库查询时,哪些内容区分大小写?哪些不区分?
sql语句关键字,如:select,from等不区分大小写; 表名和字段名:不区分大小写; 字段中的内容:区分大小写。
12.【上机】完成下面的sql语句,并截图表示出结果。
--把所有姓名变成小写 select lower(ename) from emp; --把所有姓名变成大写 select upper(ename) from emp; --求所有人名中包含‘a‘的员工信息不区分大小写 select ename from emp where lower(ename) like ‘%a%‘; --截取子字符串,比如求Hello的一部分 select substr(‘Hello‘,2) from dual; --求Hello的一部分,并指明长度 select substr(‘Hello‘,2,3) from dual; --求ascii码对应的字符 select chr(65) from dual; --求字符对应的ascii码 select ascii(‘中‘) from dual; --四舍五入 select round(23.652) from dual; --四舍五入小数点后面多少位 select round(23.652,1) from dual; --四舍五入小数点前面多少位 select round(23.652,-1) from dual; -------------------------------------------------------- --important!日期转换函数 -------------------------------------------------------- --将当前日期转换成1981-03-12 12:00:00这种形式的字符串 select to_char(sysdate,‘YYYY-MM-DD HH24:MI:SS‘) from dual; --将1981-03-12 12:00:00字符串转换成日期 select to_date(‘1981-03-12 12:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘) from dual; --将每个人的薪水转换成固定格式的字符串 select to_char(sal,‘L00,000.9999‘) from emp; --将固定格式的字符串转换成数值 select to_number(‘$1,250.00‘,‘$9,999.99‘) from dual; --null当null参与计算时候,需要要nvl这个函数 select ename,sal*12+comm from emp; select ename,sal*12+ nvl(comm,0) from emp;
?
13.【上机】完成下面的sql语句,练习分组函数的使用,并截图表示出结果。
计算emp表中的所有人员的平均薪水 select avg(sal) from as 平均薪水 emp; 计算emp表中最高薪水 select max(sal) from emp; 计算emp表中最低薪水 select min(sal) from emp; 计算emp表中薪水大于1000的人员的个数 select count(*) from emp where sal>1000; 计算emp表中薪水的总和 select sum(sal) as 薪水总和 from emp; 计算emp表中薪水和津贴的总和 (1)select sum(sal+nvl(comm,0)) from emp; (2)select sum(sal)+sum(nvl(comm,0)) from emp;
?
14.【上机】完成下面的sql语句,练习分组查询,groupby和having子句,并截图表示出结果。
1.求各部门最高薪水 分析:“各部门“,就是按部门分组; select max(sal) from emp group by deptno; select deptno,max(sal) from emp group by deptno; 2.按照部门和职位分组,分别求最高薪水,该组人员个数 (1)按部门分组:select deptno,max(sal),count(*) from emp group by deptno; (2)按职位分组:select job,count(*) from emp group by job; 3.求薪水最高的员工姓名 select ename from emp where sal=(select max(sal) from emp); 4.求平均薪水是2000以上的部门 select deptno from emp group by deptno having avg(sal)>2000; 5.求每个部门的平均薪水,并按照薪水降序排列 select deptno,avg(sal) 平均薪水 from emp group by deptno order by 平均薪水; 6.求每个部门薪水在1200以上的雇员的平均薪水、最高薪水,并且分组结果中只包含平均薪水大于1500的部门,排序按照部门平均薪水倒序排列 select deptno,avg(sal),max(sal) from emp where sal>1200 group bydeptno having avg(sal)>2500 order by avg(sal) desc; 7.把雇员按部门分组, 求最高薪水, 部门号, 过滤掉名字中第二个字母是‘A‘的, 要求分组后的平均薪水>1500, 按照部门编号倒序排列 select deptno,count(*) from emp where ename not like ‘_A%‘group by deptno having avg(sal)>1500 order by deptno desc;
15.下面的sql语句为什么不行?说出你的理由。
select ename,deptno,avg(sal) from emp group by deptno; 要查询的字段必须是单组分组函数和被分组的字段。此题中的”ename”既不是单组分组函数,也不是被分组的字段,所以报错。
16.说出:where、groupby、having、order by的执行顺序
执行顺序:where>group by>having>order by。
17.【上机】完成下面的sql语句,练习子查询,并截图表示出结果。
1.求平均薪水最高的部门的部门编号 select max(平均薪水) from (select deptno,avg(sal) 平均薪水 from emp group by deptno); 2.求出emp表中哪些人是经理人,打印出名字和编号 select ename,empnofrom emp where job=‘MANAGER‘; 3.求比普通员工的最高薪水还要高的经理人名称 select ename,sal from emp where job in (‘MANAGER‘,‘PRESIDENT‘) and sal> (select max(sal) from emp where job not in(‘MANAGER‘,‘PRESIDENT‘)); 4.每个部门平均薪水的等级(需要用到表的连接) select deptno,部门平均薪水,grade from (select deptno,avg(sal) 部门平均薪水 from emp group by deptno),salgrade where 部门平均薪水 between losal and hisal ;
?
18.为什么需要对查询出的数据做分页处理?
在列表查询时由于数据量非常多,一次性查出来会非常慢;就算一次性查出来了,也不能一次性显示给客户端。所以要把数据分批查询出来,每页显示一定量的数据,这就是数据分页。 我们经常会碰到要取某次查询结果的n到m条纪录,这里也用到了分页思想。
?
19.说明Oracle数据库如何实现分页。
20.Oracle中的分页处理依赖于哪个字段? mysql中分页处理使用什么来实现?
Oracle : rownum; Mysql : limit;
21.【上机】完成下面的sql语句,并截图表示出结果。
1.查询薪水最高的前5个人 select * from (select ename,sal from emp order by sal desc) where rownum<=5; 2.查询薪水排名(从高到低)在5-10之间的员工 select ename,sal,rn,rownum from (select t.*,rownum as rn from (select rownum,sal from emp order by sal desc) t) ab where rn>5 and rn<=10;
?
22.为什么需要表连接? 常用的表连接查询有哪几种?分别适用于哪种情况?
数据库是由多张表组成的存储结构,并通过多张表之间的关系建立起完整有效的数据存储形式。为了获得多张表之间的完整有效的数据联系,数据库查询语言SQL提供了强大的表连接查询功能。表连接就是将多个表中的数据连接到一起的查询,即连接操作可以在一个select语句中完成从多个表中查询和处理数据的功能。
23.为什么需要笛卡尔积?笛卡尔积的作用是?
所谓笛卡尔积,通俗点说就是指两个集合中任意取出两个元素所构成的组合的集合。假设R中有元组M个,S中有元组N个,则R和S的笛卡尔积中包含的元组数量就是M*N.这个规则可以向多个关系扩展。 所有表连接方式都会先生成临时笛卡尔积表,表示两个表中的每一行数据任意组合。在实际应用中,笛卡尔积本身大多没有实际用处,只有在两个表连接时加上限制条件,才会有实际意义。
24.【上机】完成下面的sql语句,练习表连接,并截图表示出结果。
1.求部门平均薪水的等级 select deptno,salgradewhere 部门平均薪水 between losal and hisal; 2.求平均薪水的等级最低的部门名称 select * from (select deptno,salgrade where 部门平均薪水 between losal and hisal) t where grade=(select min(grade) from (select deptno,salgrade where 部门平均薪水 between losal and hisal) ); 3.求部门经理人中平均薪水最低的部门名称 select t.* from (select t.*,avg(sal) 经理人平均薪水 from emp where job=‘MANAGER‘ group by deptno) t,salgrade where 经理人平均薪水 between losal and hisal) t where grade=(select min(grade) from (select deptno,avg(sal) 经理人平均薪水 from emp where job=‘MANAGER‘ group by deptno)); 4.求薪水最高的前5名雇员 select t.*,rownum from (select rownum,sal from emp order by sal desc) t where rownum<=5; 5.求薪水最高的第6到第10名雇员 select ename,sal from emp order by sal desc) t) ab where rn>5 and rn<=10;
25.Oracle中, union和minus的作用。
(编辑:安卓应用网_ASP源码网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|