面试--数据库
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