一道SQL面试题目

suppanda007 2009-07-30 10:48:08
昨天去面试,面试官给了我一道sql查询题,说不要看着简单,至今还没有人做对,要考虑效率,题目如下:
表T_SEL1
id int not null Pk
t2id int not null FK (关联T_SEL2的pk id)
表T_SEL2
id int not null pk
name varchar(4)

要求:得到表T_SEL1、表T_SEL2的连接
查询条件是:T_SEL2.id<100 and T_SEL2.name='xyz'

我写的答案是:
select a.*,b.* from t_sel1 a,t_sel2 b
where a.t2id=b.id
and b.id<=100
and b.name = 'xyz'

想问问大家有没有更高效的方法?
...全文
417 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2009-07-31
  • 打赏
  • 举报
回复
面试官太弱了
Angiehe 2009-07-31
  • 打赏
  • 举报
回复
select a.[id],a.t2id,b.[name] from 
(select [id],t2id from t_sel1 where t2id<100) a join
(select [id],[name] from t_sel2 where [id]<100 and [name]='xyz') b
on a.t2id=b.[id]
alisafan123 2009-07-31
  • 打赏
  • 举报
回复
xuejie09242 2009-07-31
  • 打赏
  • 举报
回复
这种问题,还是不用join语法是最快的。
实际执行了一下,数据量为100W,刚开始的时候执行了两个查询,用了3秒。再以后都是0,各个查询再看不出差别了。应该是利用了缓存。
几种查询是 不用join,用连接子查询,用连接不用子查询,列名,和*
组合进行。
各位不防一试。
itmingong 2009-07-31
  • 打赏
  • 举报
回复
select a.id,
a.t2id,
b.id,
b.name
from t_sel1 a,(select * from t_sel2 where id <=100 and name = 'xyz') b
where a.t2id=b.id
我觉得这样效率好点
weiweipxb 2009-07-31
  • 打赏
  • 举报
回复
select a.id,
a.t2id,
b.id,
b.name
from t_sel1 a,(select * from t_sel2 where id <=100 and name = 'xyz') b
where a.t2id=b.id
应该是这个,给应届生的题。
zhaoyh0530 2009-07-31
  • 打赏
  • 举报
回复
先按照条件求出表二的记录 再和表一关联

借鉴楼上
select a.id,
a.t2id,
b.id,
b.name
from t_sel1 a,(select * from t_sel2 where id <=100 and name = 'xyz') b
where a.t2id=b.id

ayou982 2009-07-31
  • 打赏
  • 举报
回复
倒,我很认真仔细地看了题目,连我这种小鸟都知道..
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lidanzi 的回复:]
引用 12 楼 supercrsky 的回复:
SQL codeselect t1.id,t1.t2id,t2.id,t2.namefrom T_sel1 t1,T_SEL2 t2where t1.t2id= t2.idand t2.id <=100and t2.name='xyz'/**
SQL Server 分析和编译时间:
  CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。
id          t2id        id  ¡­

时间怎么看的?
[/Quote]




set statistics time on

chowyi 2009-07-31
  • 打赏
  • 举报
回复
我发现sql还是很强大的
lidanzi 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 supercrsky 的回复:]
SQL codeselect t1.id,t1.t2id,t2.id,t2.namefrom T_sel1 t1,T_SEL2 t2where t1.t2id= t2.idand t2.id<=100and t2.name='xyz'/**
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。
id t2id id ¡­
[/Quote]
时间怎么看的?
lidanzi 2009-07-31
  • 打赏
  • 举报
回复
被面试官忽悠?
guguda2008 2009-07-31
  • 打赏
  • 举报
回复
水平有限,实在看不出难在哪
  • 打赏
  • 举报
回复

select t1.id,t1.t2id,t2.id,t2.name from T_sel1 t1,T_SEL2 t2
where t1.t2id = t2.id and t2.id<=100 and t2.name = 'xyz'
/**
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。
id t2id id name
----------- ----------- ----------- ----
1 1 1 xyz
2 2 2 xyz
3 3 3 xyz
4 4 4 xyz
5 5 5 xyz
6 6 6 xyz
7 7 7 xyz
8 8 8 xyz
9 9 9 xyz
10 10 10 xyz
11 11 11 xyz
12 12 12 xyz
13 13 13 xyz
14 14 14 xyz
15 15 15 xyz
16 16 16 xyz
17 17 17 xyz
18 18 18 xyz
19 19 19 xyz
20 20 20 xyz
21 21 21 xyz
22 22 22 xyz
23 23 23 xyz
24 24 24 xyz
25 25 25 xyz
26 26 26 xyz
27 27 27 xyz
28 28 28 xyz
29 29 29 xyz
30 30 30 xyz
31 31 31 xyz
32 32 32 xyz
33 33 33 xyz
34 34 34 xyz
35 35 35 xyz
36 36 36 xyz
37 37 37 xyz
38 38 38 xyz
39 39 39 xyz
40 40 40 xyz
41 41 41 xyz
42 42 42 xyz
43 43 43 xyz
44 44 44 xyz
45 45 45 xyz
46 46 46 xyz
47 47 47 xyz
48 48 48 xyz
49 49 49 xyz
50 50 50 xyz
51 51 51 xyz
52 52 52 xyz
53 53 53 xyz
54 54 54 xyz
55 55 55 xyz
56 56 56 xyz
57 57 57 xyz
58 58 58 xyz
59 59 59 xyz
60 60 60 xyz
61 61 61 xyz
62 62 62 xyz
63 63 63 xyz
64 64 64 xyz
65 65 65 xyz
66 66 66 xyz
67 67 67 xyz
68 68 68 xyz
69 69 69 xyz
70 70 70 xyz
71 71 71 xyz
72 72 72 xyz
73 73 73 xyz
74 74 74 xyz
75 75 75 xyz
76 76 76 xyz
77 77 77 xyz
78 78 78 xyz
79 79 79 xyz
80 80 80 xyz
81 81 81 xyz
82 82 82 xyz
83 83 83 xyz
84 84 84 xyz
85 85 85 xyz
86 86 86 xyz
87 87 87 xyz
88 88 88 xyz
89 89 89 xyz
90 90 90 xyz
91 91 91 xyz
92 92 92 xyz
93 93 93 xyz
94 94 94 xyz
95 95 95 xyz
96 96 96 xyz
97 97 97 xyz
98 98 98 xyz
99 99 99 xyz
100 100 100 xyz

(所影响的行数为 100 行)


SQL Server 执行时间:
CPU 时间 = 13 毫秒,耗费时间 = 13 毫秒。
**/
  • 打赏
  • 举报
回复
子查询会慢一些

select a.id,
a.t2id,
b.id,
b.name
from t_sel1 a,(select * from t_sel2 where id <=100 and name = 'xyz') b
where a.t2id=b.id

/**
SQL Server 分析和编译时间:
CPU 时间 = 4 毫秒,耗费时间 = 4 毫秒。
id t2id id name
----------- ----------- ----------- ----
1 1 1 xyz
2 2 2 xyz
3 3 3 xyz
4 4 4 xyz
5 5 5 xyz
6 6 6 xyz
7 7 7 xyz
8 8 8 xyz
9 9 9 xyz
10 10 10 xyz
11 11 11 xyz
12 12 12 xyz
13 13 13 xyz
14 14 14 xyz
15 15 15 xyz
16 16 16 xyz
17 17 17 xyz
18 18 18 xyz
19 19 19 xyz
20 20 20 xyz
21 21 21 xyz
22 22 22 xyz
23 23 23 xyz
24 24 24 xyz
25 25 25 xyz
26 26 26 xyz
27 27 27 xyz
28 28 28 xyz
29 29 29 xyz
30 30 30 xyz
31 31 31 xyz
32 32 32 xyz
33 33 33 xyz
34 34 34 xyz
35 35 35 xyz
36 36 36 xyz
37 37 37 xyz
38 38 38 xyz
39 39 39 xyz
40 40 40 xyz
41 41 41 xyz
42 42 42 xyz
43 43 43 xyz
44 44 44 xyz
45 45 45 xyz
46 46 46 xyz
47 47 47 xyz
48 48 48 xyz
49 49 49 xyz
50 50 50 xyz
51 51 51 xyz
52 52 52 xyz
53 53 53 xyz
54 54 54 xyz
55 55 55 xyz
56 56 56 xyz
57 57 57 xyz
58 58 58 xyz
59 59 59 xyz
60 60 60 xyz
61 61 61 xyz
62 62 62 xyz
63 63 63 xyz
64 64 64 xyz
65 65 65 xyz
66 66 66 xyz
67 67 67 xyz
68 68 68 xyz
69 69 69 xyz
70 70 70 xyz
71 71 71 xyz
72 72 72 xyz
73 73 73 xyz
74 74 74 xyz
75 75 75 xyz
76 76 76 xyz
77 77 77 xyz
78 78 78 xyz
79 79 79 xyz
80 80 80 xyz
81 81 81 xyz
82 82 82 xyz
83 83 83 xyz
84 84 84 xyz
85 85 85 xyz
86 86 86 xyz
87 87 87 xyz
88 88 88 xyz
89 89 89 xyz
90 90 90 xyz
91 91 91 xyz
92 92 92 xyz
93 93 93 xyz
94 94 94 xyz
95 95 95 xyz
96 96 96 xyz
97 97 97 xyz
98 98 98 xyz
99 99 99 xyz
100 100 100 xyz

(所影响的行数为 100 行)


SQL Server 执行时间:
CPU 时间 = 0 毫秒,耗费时间 = 14 毫秒。
**/
  • 打赏
  • 举报
回复

select * from T_sel1 t1,T_SEL2 t2
where t1.t2id = t2.id and t2.id<=100 and t2.name = 'xyz'

/**
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。
id t2id id name
----------- ----------- ----------- ----
1 1 1 xyz
2 2 2 xyz
3 3 3 xyz
4 4 4 xyz
5 5 5 xyz
6 6 6 xyz
7 7 7 xyz
8 8 8 xyz
9 9 9 xyz
10 10 10 xyz
11 11 11 xyz
12 12 12 xyz
13 13 13 xyz
14 14 14 xyz
15 15 15 xyz
16 16 16 xyz
17 17 17 xyz
18 18 18 xyz
19 19 19 xyz
20 20 20 xyz
21 21 21 xyz
22 22 22 xyz
23 23 23 xyz
24 24 24 xyz
25 25 25 xyz
26 26 26 xyz
27 27 27 xyz
28 28 28 xyz
29 29 29 xyz
30 30 30 xyz
31 31 31 xyz
32 32 32 xyz
33 33 33 xyz
34 34 34 xyz
35 35 35 xyz
36 36 36 xyz
37 37 37 xyz
38 38 38 xyz
39 39 39 xyz
40 40 40 xyz
41 41 41 xyz
42 42 42 xyz
43 43 43 xyz
44 44 44 xyz
45 45 45 xyz
46 46 46 xyz
47 47 47 xyz
48 48 48 xyz
49 49 49 xyz
50 50 50 xyz
51 51 51 xyz
52 52 52 xyz
53 53 53 xyz
54 54 54 xyz
55 55 55 xyz
56 56 56 xyz
57 57 57 xyz
58 58 58 xyz
59 59 59 xyz
60 60 60 xyz
61 61 61 xyz
62 62 62 xyz
63 63 63 xyz
64 64 64 xyz
65 65 65 xyz
66 66 66 xyz
67 67 67 xyz
68 68 68 xyz
69 69 69 xyz
70 70 70 xyz
71 71 71 xyz
72 72 72 xyz
73 73 73 xyz
74 74 74 xyz
75 75 75 xyz
76 76 76 xyz
77 77 77 xyz
78 78 78 xyz
79 79 79 xyz
80 80 80 xyz
81 81 81 xyz
82 82 82 xyz
83 83 83 xyz
84 84 84 xyz
85 85 85 xyz
86 86 86 xyz
87 87 87 xyz
88 88 88 xyz
89 89 89 xyz
90 90 90 xyz
91 91 91 xyz
92 92 92 xyz
93 93 93 xyz
94 94 94 xyz
95 95 95 xyz
96 96 96 xyz
97 97 97 xyz
98 98 98 xyz
99 99 99 xyz
100 100 100 xyz

(所影响的行数为 100 行)
**/
幸运的意外 2009-07-31
  • 打赏
  • 举报
回复
往往问题很简单,背面试管官一吓唬就紧张了。
加油馒头 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xuejie09242 的回复:]
这种问题,还是不用join语法是最快的。
实际执行了一下,数据量为100W,刚开始的时候执行了两个查询,用了3秒。再以后都是0,各个查询再看不出差别了。应该是利用了缓存。
几种查询是 不用join,用连接子查询,用连接不用子查询,列名,和*
组合进行。
各位不防一试。
[/Quote]

不知道你说的啥

先整理下在发上来,要不然看不懂你的意思
feixianxxx 2009-07-30
  • 打赏
  • 举报
回复
楼主关键就是那个.*用的不好。。
应该换成各个对应的列。。
ks_reny 2009-07-30
  • 打赏
  • 举报
回复
加索引肯定会提高效率的。
加载更多回复(5)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧