引的列不要太多,要选择一些selective比较低的列建B-tree索引,选择selective高的列建bitmap索引(在更新比较多的表不不要建bitmap索引)
4. 将selective较低的列放在前面
5. 在更新不多的表上建索引时,可以考虑用compress选择,以节约索引的空间
7、一组SQL相关操作面试题
1. 在表A中有数据
ID MO
1 Y
2 N
请用一个SELECT 语句写出,如果MO的值为“Y”,返回“YES”,为N返回“NO”
效果如下:
ID MO
1 YES
2 NO
SELECT ID,MO=CASE
WHEN MO=’Y’ THEN ‘YES’
WHEN MO=’N’ THEN ‘NO’
END
FROM Az
2. 在表A中查询出自动增长列中31到40之间的数据(注意可能不是连续的)
select * from A where id between 31 and 40
3. 有一个表table中有一个自动增长字段ID,如果在存储过程中向这个表插入一条记录后,如何获得新记录的ID.(写出获取新记录ID的函数即可)
CREATE FUNCTION c_currentId()
RETURNS int
AS
BEGIN
declare @lastId int
select @lastId=max(cid) from c
RETURN (@lastId)
END
select tempdb.dbo.c_currentId() as ‘当前C表中最新的编号’
4. having的用法, 是用来做什么的 having用来对group by分组后的记录进行过滤。
5. sql中的什么函数可以转换为时间 select convert(datetime,’2000/01/01′) select cast(’2001/02/02′ as datetime)
6. 查询数据放入一张临时表 select * into #A from Test select * from #A
8、如何使用SQL进行模糊查询
LIKE条件一般用在指定搜索某字段的时候, 通过”% _” 通配符的作用实现模糊查找功能,通配符可以在前面也可以在后面或前后都有。
搜索以mian开头:
SELECT * FROM teble WHERE title LIKE ‘mian%’
搜索以mian结束:
SELECT * FROM teble WHERE title LIKE ‘%mian’
搜索包含mian:
SELECT * FROM teble WHERE title LIKE ‘%mian%’
注释:%表示0个或多个字符构成的字符串
_表示单个字符
9、说一下mysql, oracle等常见
数据库的分页实现方案?
1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum <= max) where rownum_ >= min
2.SQL Server:
select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id
3.MySQL
select * from tablename limit position, counter
4.DB2
select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max
——————————————————————————————–
1.分页方案一:(利用Not In和SELECT TOP分页)效率次之
语句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID NOT IN (SELECT TOP 20 id FROM TestTable ORDERBY id)) ORDERBYID
SELECT TOP 页大小 * FROM TestTable
WHERE( ID NOT IN (SELECT TOP 每页大小-1*待查询页数-1 id FROM 表 ORDERBY id)) ORDERBYID
思路:先查询出待查询页之前的全部条数的id,查询ID不在这些ID中的指定数量条数
2.分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高
语句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id FROM TestTable ORDERBYid)AS T))ORDERBY ID
SELECT TOP 页大小* FROM TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每页大小*待查询页数-1 id FROM 表 ORDERBY id)AS T)) ORDERBY ID
思路:先获得待查询页的之前全部条数id,获得它们当中最大的ID号,以此最大ID号为标志,查找比这个ID号大的指定条数
3.分页方案三:
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id desc
SELECT TOP 每页条数 * FROM (SELECT TOP 待查询页*每页条数) * from YOURTABLE order by id)as a order by id desc
思路:先正排序查询出待查询页之前(包括当前页)的全部条数,然后将其倒排序,取指定条数
10、几道SQL面试题
1. 解释一下SQL里面的null
答案:null代表一个unknown的值或者一个不存在的值
2. 如何用SQL判断一个值是不是null
答案:可以用is null来判断一个值是不是null
3. 所有包含null的计算表达式的返回结果都是null, 这句话正确吗?比如5+ null返回null
答案:正确
4. 所有与null得比较运算都返回unknown正确吗?
答案:正确
5. (unknown or true) = true正确吗?
答案:正确
6. (unknown or false) = unknown正确吗?
答案:正确
7. (unknown or unknown) = unknown正确吗?
答案:正确
8. (true and unknown) = unknown正确吗?
答案:正确
9. (false and unknown) = false正确吗?
答案:正确
10. (unknown and unknown) = unknown正确吗?
答案:正确
11. (not unknown) = unknown 正确吗?
答案:正确
11、介绍一下游标
游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在