面试的时候碰到一道面试题
有一张表,表名:Test
表结构:
id int
name varchar(20)
有以下数据:
[id] [name]
001 aaa
002 aaa
003 bbb
004 ccc
要求写一个查询语句,只显示[name]有重复的数据,没有重复的不显示出来。只显示重复的name的话
我是这样写的:select count(name) from Test group by name Having count(name)> 1 如果要显示重复的name和它所对应的id的话
我是这样写的:select * from test1 where [name] in (select [name] from test1 group by [name] having count(test1.[name])<>1)
上面这两句都能正常查询到结果,然后,我想换种方法去查询重复的name和它所对应的id值 这样写:select id, name from test1 group by id,name having count(test1.name) > 1 但是查询不到相应的结果
我想知道为什么会这样,谁能帮我解答一下?多谢了!
有一张表,表名:Test
表结构:
id int
name varchar(20)
有以下数据:
[id] [name]
001 aaa
002 aaa
003 bbb
004 ccc
要求写一个查询语句,只显示[name]有重复的数据,没有重复的不显示出来。只显示重复的name的话
我是这样写的:select count(name) from Test group by name Having count(name)> 1 如果要显示重复的name和它所对应的id的话
我是这样写的:select * from test1 where [name] in (select [name] from test1 group by [name] having count(test1.[name])<>1)
上面这两句都能正常查询到结果,然后,我想换种方法去查询重复的name和它所对应的id值 这样写:select id, name from test1 group by id,name having count(test1.name) > 1 但是查询不到相应的结果
我想知道为什么会这样,谁能帮我解答一下?多谢了!
FROM TEST1 T1
WHERE EXISTS(
SELECT 1 FROM TEST1 T2 WHERE T2.NAME=T1.NAME AND T2.ID<>T1.ID
)
ORDER BY NAME,ID
WHERE EXISTS (
SELECT 1
FROM TEST
WHERE NAME = A.NAME
AND ID <> A.ID
)
查询不到重复的name和它所对应的id,
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test]([id] varchar(3),[name] varchar(3))
insert [test]
select '001','aaa' union all
select '002','aaa' union all
select '003','bbb' union all
select '004','ccc'
select * from test a
where exists(select 1 from test b where a.name=b.name and a.id<>b.id)
/*
id name
001 aaa
002 aaa
*/--这个结果?
但是如果你按照ID跟name联合分组是不可能的,因为ID是不重复的,你对一个不重复的列进行分组,是没有任何意义的
-- 也可以用group by all实现
select avg(id), name
from test1
group by all name
having count(1) > 1-- 如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组
-- 即使某些组没有符合搜索条件的行。没有 ALL 关键字
-- 包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test]([id] varchar(3),[name] varchar(3))
insert [test]
select '001','aaa' union all
select '002','aaa' union all
select '003','bbb' union all
select '004','ccc'with t
as(
select *,px=COUNT(1)over(partition by name)
from test
)
select id,name from t where px>=2
/*
id name
001 aaa
002 aaa
*/
我知道group by的意思呀,我的想法是先照id分组,结果应为
id name
001 aaa
002 aaa
003 bbb
004 ccc
然后再按照name分组,那结果应该是
id name
001 aaa
003 bbb
004 ccc
才对呀,可为什么不是这样呢?
我想问的就是这个问题呀
--> 测试数据:[test]
if object_id('[test]') is not null drop table [test]
create table [test]([id] varchar(3),[name] varchar(3))
insert [test]
select '001','aaa' union all
select '002','aaa' union all
select '003','bbb' union all
select '004','ccc'select * from test a
where not exists(select 1 from test b
where a.name=b.name and a.id>b.id)
/*
id name
001 aaa
003 bbb
004 ccc
*/--早吧这个结果给出来不就好了么?
想请问一下这个 select 1 是怎么理解呢,好像是跟select * 一样的结果
select 1 其实没什么特别的意思,就是select 一个指定的值,因为我的目地是判断是否有存在,所以不需要返回任何字段信息。写select 1比返回字段信息效率更高。。
select 1 from table where 1=1 。。
这样查询结果就是 1 ,行数等同于 select * from table where 1=1 。。的行数。