数据库优化和SQL操作的相关题目

SQL操作

1.有一个数据库表peope,表有字段name,age,address三个属性(注:没有主键)。现在如果表中有重复的数据,请删去重复只留下其中的一条。重复的定义就是两条记录的name,age,address值都一样。
关键是怎么把重复的数据过滤掉,后来我考虑的做法是这样的:

1
2
3
4
5
6
7
select  from  people  group  by  name ,age,address  having  COUNT ( DISTINCT  name )=1
 
这样就可以把重复的数据过滤掉,然后把这些数据插入到一个临时表中,删去原表中的所有数据,再把临时表中的数据插回来就可以了。
 
CREATE  TEMPORARY  TABLE  tmp_table  select  from  people  group  by  name ,age,address  having  COUNT ( DISTINCT  name )=1
delete  from  people
insert  into  people  select  from  tmp_table

  

2.有如下的部门员工表:

1.查询每个月倒数第 2 天入职的员工的信息.

2.查询出last_name为 ‘Chen’ 的 manager 的信息.

3.查询平均工资高于 8000 的部门 id 和它的平均工资.

4. 查询工资最低的员工信息: last_name, salary

5. 查询平均工资最低的部门信息

6. 查询平均工资最低的部门信息和该部门的平均工资

7. 查询平均工资最高的 job 信息

8. 查询平均工资高于公司平均工资的部门有哪些?

9. 查询出公司中所有 manager 的详细信息.

10. 各个部门中最高工资中最低的那个部门的最低工资是多少

11. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary

12. 查询 1999 年来公司的人所有员工的最高工资的那个员工的信息.

13.返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id以及salary

 

3.sql查询Oracle数据库最后10条记录并按降序排列。
SELECT TOP 10 FROM 表名 ORDER BY 排序列 DESC;

SQL的执行顺序先按照你的要求排序,然后才返回查询的内容。

例如有一个名为ID自动增长的列,表中有100条数据,列的值得分别是1、2、3、4………9、99、100。那么查询加了DESC你得到的是91到100条,就是最后十条,如果加ASC你得到的将会是1到10,也就是最前面的那几条记录,

如果说有先后的话 必然是根据某几个字段进行排序了的你反过来排序就变成求前10条记录了呗,把desc和 asc互换一下 (默认是 asc )oracle 的写法select * from (select * from tab order by col desc ) where rownum <= 10

最后10条降序与最前10条升序是一样的如果还想排序,那就按他们说的用临时表。

1
2
3
select  top  10 *  from  table  order  by  field1  into  table  #tempselect *  from  # temp  order  by  field1  desc  //查询结果放临时表
select  top  10  from  table1  order  by  field1  asc  into  tabl  temp  //再从临时表查询
select  from  temp  order  by  field1  desc

  

数据库优化

1.假设有一亿个用户,每个用户至少关注100个人,如何设计数据库(关系型数据库)满足下面几个需求
1,查找a关注了哪些人
2,查找a被哪些人关注了
3,查找a和b共同关注了哪些人

2.数据库commit操作是否应该在一个大事务中实现,也就是一个大事务只有一个commit?
使用一个大事务来实现批量数据库操作,虽然回退和重提非常方便,但是不利于批量数据操作出现异常时的处理和时间要求。如果批量数据处理在最后一步运行缓慢或失败,那么事务回退时间将非常长,重新运行需要从头开始跑整个事务,可能无法满足有限的批量数据操作时间窗口要求
Oracle数据库的情况下,大事务操作需要设置足够大的undo表空间,insert操作要大于数据大小的一倍;update,delete操作要大于数据大小的两倍。另外还需要兼顾其他操作的消耗。
如果分批操作会影响业务完整性,则没必要分批进行,而且也不建议去故意分批进行操作,只需要保证有足够大的undo表空间。

3.数据库中记录较多,有20万条左右,需要反复查询记录匹配数据,如何做能提高算法效率,节省查询时间?
1,优化查询语句,避免全表扫描
2,引入缓存策略,尽量避免访问数据库
3,合理建立索引
4,避免SQL语句中不合理的连接和嵌套等

4.SQL语句优化的策略都有哪些?
创建表的时候。应尽量建立主键,根据主键查询数据;
●大数据表删除,用truncate table代替delete。
●合理使用索引,在OLTP应用中一张表的索引不要太多。组合索引的列顺序尽量与查询条件列顺序保持一致;对于数据操作频繁的表,索引需要定期重建,以减少失效的索引和碎片。
●查询尽量用确定的列名,少用*号。

尽量少嵌套子查询,这种查询会消耗大量的CPU资源;对于有比较多
or运算的查询,建议分成多个查询,用union all联结起来;多表查询
的查询语句中,选择最有效率的表名顺序(基于规则的优化器中有效)。Oracle解析器对表解析从右到左,所以记录少的表放在右边。

尽量多用commit语句提交事务,可以及时释放资源、解
锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的
数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可
以常驻内存:alter table...cache;
利用索引,避免大表FULL TABLE SCAN;
合理使用临时表;
避免写过于复杂的sql,不一定非要一个sql解决问题;
在不影响业务的前提下减小事务的粒度;

5.大量数据并发的情况下 ,不用自增列 怎样设置主键?
1:定义一张表,专门用来存放存所有需要唯一ID的表名称以及该表当前所使用到的ID值。
2: 写一个存储过程,专门用来在上一步的表中取ID值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值