面试--数据库

1. Union和union all的区别

都是将多个slelect语句的结果作为一个整体显示。

区别在于:union会自动压缩多个结果集合中的重复结果(系统会自动将重复的元组去掉),而union all则将所有的结果全部显示出来(保留重复元祖),不管是不是重复。

Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All

两个要联合的SQL语句,字段个数必须一样,而且字段类型要“相容”(一致)。

 

2. 分页

用rownum。

注意:

select * from
   (select t.*,rownum row_num from tableA t order by t.id) tableB
where tableB.row_num between 1 and 10

上面的语句会先生成rownum 后执行order by 子句,因而排序结果根本不对。

调整为

select * from
   (select a.*,rownum row_num from
      (select * from tableA t order by t.id desc) a
   ) b 
where b.row_num between 1 and 10

这下排序对了,但是sql语句还可以进一步优化:

SELECT * FROM
(
   SELECT A.*, ROWNUM RN
   FROM 
        --这个A是实际的sql查询
        (SELECT * FROM TABLE_NAME) A
   WHERE ROWNUM <= 10
)
WHERE RN >= 1      

 

3. linux下启动oracle

  启动Oracle服务
    su - oracle(用 oracle用户登录)
    sqlplus 用户名/密码 as sysdba
    startup
    exit
  启动Oracle监听端口
    lsnrctl start

 

4.sql语句 表中重复行

建立表 test_table

create table test_table(
       id varchar(32) primary key,
       no varchar(32) not null,
       name varchar(32),
       sex char(2) default '0',
       score char(3)
);

表中初始数据:


查询表中重复信息

select *
  from TEST_TABLE te
 where te.no in
       (select t.no from TEST_TABLE t group by t.no having count(*) > 1)

执行结果:

 

查询表中不重复的信息

select *
  from TEST_TABLE te
 where te.no not in
       (select t.no from TEST_TABLE t group by t.no having count(*) > 1);

执行结果:

另,下面用distinct做的查询会查出所有结果。

select *
  from TEST_TABLE te
 where te.no in (select distinct t.no from TEST_TABLE t)

因为 distinct t.no 查出的是所有不同的no, 不是 所有没有重复过的no。

 

删除表中重复信息

① 如果表中的id没有加primary key限制,即允许id列出现重复值。

表中初始数据如下:

那么可以采用临时表来删除重复行,步骤如下:

   ①select distinct * from test_table,将查询的记录放到临时表test_table_temp

  ②将原来的表test_table删除

  ③将临时表test_table_temp的数据导回原来的表test_table

  ④删除临时表test_table_temp

 sql语句

CREATE TABLE TEST_TABLE_TEMP AS (select distinct * from TEST_TABLE);
drop table TEST_TABLE;
CREATE table TEST_TABLE as (select * from TEST_TABLE_TEMP);
drop table TEST_TABLE_TEMP;

执行结果:

 

如果表中的id加primary key限制,即不允许id列出现重复值。

表中初始数据:

那么做法和上面类似,但是不用select distinct * from test_table取数据,因为id是没有重复的,所以用这个语句取的是全部查询结果。

 步骤如下:

   ①select t.no, t.name, t.sex, t.score  from TEST_TABLE t  group by t.no, t.name, t.sex, t.score,将查询的记录放到临时表test_table_temp

  ②将原来的表test_table删除

  ③将临时表test_table_temp的数据导回原来的表test_table

  ④删除临时表test_table_temp。

 sql语句

CREATE TABLE TEST_TABLE_TEMP AS(
  select t.no, t.name, t.sex, t.score
    from TEST_TABLE t
   group by t.no, t.name, t.sex, t.score);
   
drop table  TEST_TABLE;

create table  TEST_TABLE as(
  select * from TEST_TABLE_TEMP);

drop table TEST_TABLE_TEMP;

select * from TEST_TABLE;

执行结果:

不过,id列丢了。\(^o^)/~

 

5.hibernate缓存机制

菜蔬学浅,参考他人写的文章了 http://www.cnblogs.com/xiaoluo501395377/p/3377604.html

posted @ 2016-05-12 12:12  trypretty  阅读(491)  评论(0编辑  收藏  举报