首页 > 其他分享 >搜房面试题

搜房面试题

时间:2022-11-14 16:33:10浏览次数:67  
标签:面试题 set -- 搜房 NAME01 索引 where select


1、不使用数据库,如何通过程序实现快速的排重计算?


      a、加载数据到集合中,然后使用Linq中的Distinct()进行去重。


      b、 ​​如果明确是哪几列中重复的数据的话,可以通过将数据加载到table中,在过滤table的方式来进行去重​​。      


2、Union all与union的区别?Truncate与delete的区别?Having如何使用?

      ​​ Union all与union的区别​​

      ​​Truncate与delete的区别​​

      ​​Having如何使用​​

3、对于1000万数据量的表来说,对于唯一的ID列创建索引与不创建索引,查询速度有多大区别?

        测试由于内存限制生成大量测试数据时,会提示内存不足,故本次测试将数据量限制在1000000(一百万)。

        构造测试数据如下:

create table myTestTable as 
select rownum as id,
to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,
dbms_random.string('x', 20) random_string
from dual
connect by level <= 1000000;
--myTestTableTest
create table myTestTableTest as
select rownum as id,
to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,
dbms_random.string('x', 20) random_string
from dual
connect by level <= 1000000;


生成测试数据可以参考:

​​点击打开链接​​

​​点击打开链接​​

为myTestTable表创建索引:

create index sy001 on myTestTable(ID);

Oracle创建索引的语法如下:


create index 索引名 on 表名(列名);

测试sql如下:

SELECT * FROM myTestTableTest  WHERE  ID='10000';
SELECT * FROM myTestTable WHERE ID='10000';

测试查询所用时间:myTestTableTest耗时10.671秒,myTestTable耗时0.047秒

SELECT * FROM myTestTableTest  WHERE  random_string='R5XLUNRTKUTE1IZT5R';
SELECT * FROM myTestTable WHERE random_string='R5XLUNRTKU5YTE1IZT5R';

测试查询所用时间:myTestTableTest耗时9.532秒,myTestTable耗时8.362秒



        通过数据可以看出对于创建了索引的ID列来说,查询速度的提升还是相当明显的,但对于非索引列的查询来说,提升并不是很明显,当数据量继续增加的时候,相信这种差距会被增大。

4、Guid的哈希值是否会重复?同一个字符串,在不同的程序和两个不同的服务器中,哈希值是否一样?

        全局唯一标识符,简称GUID,是一种由算法生成的唯一标识。GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

        哈希算法一样,哈希值应该不一样。

5、对聚集索引和非聚集索引的理解?

      ​​ 区别与理解​​

6、

Select * from  test  where name like  ‘a%’;
Select name from test where name = ‘a%’;

    当name上有非聚集索引时上述两种情况的查询差异?

    当name上有聚集索引时上述两种情况的查询差异?

背景:

新建表myTestTable002、myTestTable003,建表Sql如下:

create table myTestTable003 (
ID int identity(1,1) not null,
NAME01 varchar(20) null,
NAME02 varchar(20) null,
String varchar(3000) DEFAULT '所发生的冯绍峰的水果湖光和热过奖过奖个梵蒂冈'
)

预制测试数据如下:

USE [master]
GO
/****** Object: StoredProcedure [dbo].[USP_SRZCHMX] Script Date: 07/15/2014 13:13:43 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[USP_SRZCHMX]
( @Number VARCHAR(70),
@NAME varchar(70)
)
AS
DECLARE
@num int ;
set @num=0
while @num<10000000
begin
insert into myTestTable003(NAME01,NAME02)values(LEFT(NEWID(),10),LEFT(NEWID(),15));
insert into myTestTable002(NAME01,NAME02)values(LEFT(NEWID(),10),LEFT(NEWID(),15));
set @num=@num+1
end
GO

建立索引:

CREATE CLUSTERED INDEX IX_NAME01 
ON myTestTable003 (NAME01);
CREATE NONCLUSTERED INDEX IX_NAME01
ON myTestTable002 (NAME01);

myTestTable002为非聚集索引、myTestTable003为聚集索引,测试查询的sql如下:

name上有聚集索引的时:

Select * from  myTestTable003  where NAME01 like 'a%'; 
Select NAME01 from myTestTable003 where NAME01 = 'a%';

测试结果如下:04分35秒、 0秒

        name上有聚集索引时:

Select * from  myTestTable002  where NAME01 like 'a%'; 
Select NAME01 from myTestTable002 where NAME01 = 'a%';

测试结果如下:03分35秒、 1秒

7、sql如何实现查询分页?



在网上搜到了这么几个,也测试了一下,的确可以实现查询分页

第一个:

CREATE  procedure XiaoZhengGe  
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

第二个:

-- 使用方法 EXEC PageShow 'MillionData M inner join MillDic D on M.id=D.nodeid','D.nodename,M.title,M.content','id',2,2,0,0,''
CREATE PROCEDURE PageShow
(
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end

if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + ' ' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + ' ' + @strTmp + '('
+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)

8、Sql查询

搜房面试题_经历


查询性别男女根据id排序的前两条数据。

解答:

Oracle版:

SELECT * 
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY sex ORDER BY ID) AS rnk,NAME,sex
FROM testsf
)
WHERE rnk<=2

效果如下:

搜房面试题_笔试题_02

Sql Server版:

select *
from
testsf a
where a.id in(select top 2 id
from testsf
where SEX=a.SEX
--group by id
order by id asc)

效果如下:

搜房面试题_经历_03

9、override与重载的区别?

        重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。
        重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的。例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

理解:
        重载必须发生在一个类中,函数名相同,参数类型或者个数可以不同,返回值类型可以不同。根据参数选择调用方法。重载就是让类以统一的方式处理不同的数据,在同一个类中多个方法可以用同一个名字就叫做方法重载。
        重写override一般用于接口实现和继承类的方法改写,要注意:
                覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
                覆盖的方法的返回值必须和被覆盖的方法的返回一致;
                覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
                被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
                可以说,override是一个非常智能的东西,它可以动态决定究竟是采用父类还是子类的方法。

10、Json与xml两个数据结构的优劣比较?

         ​​知乎争论​

11、什么是HTTPS?

          ​​ 百科解读​

12、假如让你做一个分页,需要注意哪些点?

13、生产消费者模式的应用场景?

         ​​生产者消费者模式浅析​​

14、简述MVC开发的几个主要组成部分及作用?

        ​​  MVC框架​

        ​​  MVC拓展​​

15、简述cookie、session、application、静态字段的作用域区别?

        ​​  参考一​​

        ​​ 参考二​​

16、Webform是如何做身份认证的?

        ​​ 参考一​

17、什么是Sql注入?如何防止?

        ​​ sql注入百科​

       ​​ 如何防止参考一​

18、对称加密、非对称加密、MD5区别是什么?哪个适合做URL安全验证,如何使用?

       ​​ 对称加密​

        ​​ 非对称加密​

        ​​ MD5​

19、当使用new b()创建b的实例的时候,产生输出什么?


using system;
class a
{
public a()
{
test();
}
public virtual void test();
}
class b:a
{
int x=1;
int y;
public b()
{
y=-1;
}
public override void test()
{
console.writeline("x={0},y={1}",x,y);
}
}

输出:x=1,y=0

跟踪过程:

搜房面试题_经历_04

问题19测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VirtualTest
{
class Program
{
static void Main(string[] args)
{
B bb=new B();
}

}
class A
{
public A()
{
Test();
}
public virtual void Test() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void Test()
{
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
}
}

小注:

        本人主要做WinForm开发,Web甚少涉及,有不对的或者好的答案,希望大家留下言,谢谢。





标签:面试题,set,--,搜房,NAME01,索引,where,select
From: https://blog.51cto.com/jiankunking/5849473

相关文章

  • 24 道必知必会的 Shell 脚本面试题
    虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到shell脚本的问题,它有助于你在工作环境中自动完成很多任务。如下是一些面试......
  • 前端部分面试题目整理
    1.<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><script>varname='武老板';functionfunc(){......
  • Vue面试题48:你觉得Vuex有什么缺点?(总结自B站up主‘前端杨村长’视频,仅供自用学习)
    体验使用模块:用起来比较繁琐,使用模式也不统一,基本上得不到类型系统的任何支持:conststore=createStore({ modules:{a:moduleA}})store.state.a......
  • 高频react面试题自检
    fetch封装npminstallwhatwg-fetch--save//适配其他浏览器npminstalles6-promiseexportconsthandleResponse=(response)=>{if(response.status===4......
  • 【剑指Offer学习】【面试题3 :二维数组中的查找】
    思路:规律从右上角开始,或左下开始。不能从左上角开始找,这样每次比较后向右和向下都是越来越大。publicclassP03_FindMaxInMatrix{/*规律从右上角开始:......
  • 3-Vue高频面试题
    1.你怎样理解VueVue通过MVVM思想实现数据的双向绑定,数据驱动页面视图。Vue不是一个MVVM框架,它是一个视图层框架。Vue是数据驱动的框架,我们不必纠结于DOM元素的获取......
  • I++与++I 面试题
    程序员面试宝典第28页,书中的答案是9,49而正确的答案应该是,12,423*4=126*7=421#include<stdio.h>2#defineproduct(x)((x)*(x))3intmain(intargc,char......
  • 肖sir___公司 菜鸟网络面试___面试题
    ==================================7.26号 1.Java里面的stringbuffer和stringbuilder的区别是什么?==》StringBuffer和StringBuilder都是可变的字符串,也就是说,在对字......
  • 肖sir___面试公司总结__吉利面试题
    2022.9.27号吉利测试面试题1.开机自启动2.Java开机自启动3.用了哪些linux版本4.tomcat搭建测试环境5.后台开发框架有哪些6.除了python和Java还会哪些语言?7.给你一个测试......
  • 献芹奏曝-Python面试题-算法-DFS&BFS
    上一篇:献芹奏曝-Python面试题    开篇的话:本文目的是收集和归纳力扣上的算法题,希望用python语言,竭我所能做到思路最清奇、代码最简洁、方法最广泛、性能最高效,了解......