`

一个sql问题研究

阅读更多

            假设有下面的数据表: 

            

create table test (
ID` bigint(20) NOT NULL AUTO_INCREMENT,
NAME varchar(20) not null, HOBBY varchar(20) not null);  
 insert into test values('Adam','basketball');
 insert into test values('Bill','basketball');
 insert into test values('Bill','football');
 insert into test values('Cyper','basketball');
 insert into test values('Cyper','badminton');
 insert into test values('David','basketball');
 insert into test values('David','badminton');
 insert into test values('David','table tennis');

 

    用SQL语句查出哪些人即会玩basketball又会玩badminton,找出这样的name组合,即输出:

   Cyper,David. 我想到了用下面的一些方法:

  •  使用最简单的方式,这个里面由于使用了group by,个人感觉不需要加distinct
select name FROM TEST 
WHERE hobby in ('basketball','badminton') 
group by name having count(name) = 2;

 

 

  • 使用比较简单的in子查询来实现,需要加distinct
select distinct(name)
from Test
where name in (
          select name from Test
          where hobby in('basketball','badminton')
          group by name 
          having count(name) = 2
);

 

 

 

  •  使用子查询,个人感觉此处不需要加distinct
select from Test a
WHERE hobby = 'basketball'
AND EXISTS (SELECT * from TEST_test b
WHERE a.name = b.name AND b.hobby = 'badminton');

 

 

  •  使用复杂的子查询,但是效率不敢恭维
select distinct(name) from Test as t1
where exists (
    select 1 from Test as t2
    where t2.name = t1.name and hobby = 'basketball')
and exists (
    select 1 from Test as t3
     where t3.name = t1.name and hobby = 'badminton'
);

 

 

  •  使用表联合查询
select distinct(t1.name)
from Test t1,Test t2,Test t3
where t1.name = t2.name and t1.name = t3.name and 
t2.hobby = 'basketball' and t3.hobby = 'badminton';

 

 

  •  根据题目的要求进行枚举分析
select t1.* from Test t1, Test t2 where t1.name=t2.name 
and( 
t1.hobby='basketball' and t2.hobby='badminton' or 
t2.hobby='basketball' and t1.hobby='badminton' 
)

 

 

 

 

 

2
0
分享到:
评论
6 楼 肥啦A梦 2013-12-02  
肥啦A梦 写道
结合楼上,出现重复数据,我认为如此比较合适的一句~
SELECT NAME FROM TEMP_TEST WHERE HOBBY = 'basketball' OR HOBBY = 'badminton' GROUP BY NAME HAVING COUNT(*) >= 2;


这种前提是没有考虑数据量的操作,如果数据量太大,效率提示还是要通过临时表~
5 楼 肥啦A梦 2013-12-02  
结合楼上,出现重复数据,我认为如此比较合适的一句~
SELECT NAME FROM TEMP_TEST WHERE HOBBY = 'basketball' OR HOBBY = 'badminton' GROUP BY NAME HAVING COUNT(*) >= 2;
4 楼 asialee 2013-12-01  
小网客 写道
insert into test values('Bill','basketball'); 
insert into test values('Bill','basketball');
如果里面有这样的数据 你怎么办?我的观点是 只能通过子查询


说的有道理,这个地方,如果我们分两种情况就有意思了。
3 楼 小网客 2013-12-01  
insert into test values('Bill','basketball'); 
insert into test values('Bill','basketball');
如果里面有这样的数据 你怎么办?我的观点是 只能通过子查询
2 楼 曾经de迷茫 2013-12-01  
select name from test a where HOBBY = 'basketball' and exists 
(select * from test b where a.name=b.name and b.hobby = 'badminton');



http://ideone.com/geiOPb
1 楼 asialee 2013-11-30  
大家可以集思广益

相关推荐

    Oracle批量执行传多个参数多个SQL文件

    要实现批量执行,可以创建一个主SQL脚本(如`run_all.sql`),在这个脚本中,你可以通过嵌套`@`命令来调用其他SQL文件,同时传递参数。例如: ```sql DECLARE param1 VARCHAR2(100) := 'param_value1'; param2 ...

    sqlserver自动生成sql语句工具sqlserver转oracle

    市场上存在许多这样的工具,如SSMA(SQL Server Migration Assistant) for Oracle,这是一个官方提供的迁移工具,能自动分析SQL Server的架构,并生成适合Oracle的DDL(Data Definition Language)和DML(Data ...

    SQL Optimizer for SQL Server 10.0.3

    本文将深入探讨该工具的核心功能、使用场景以及T-SQL语言优化的相关策略。 SQL Optimizer for SQL Server 是一款强大的分析工具,它能够解析和比较不同的执行计划,为用户提供最佳的T-SQL查询路径。在SQL Server...

    带SQL注入的一个ASP网站源码

    SQL注入是网络安全领域中的一个重要话题,它允许攻击者通过输入恶意的SQL语句来操纵数据库,获取敏感信息,甚至完全控制网站。 SQL注入通常发生在网站的输入验证不充分时,比如用户登录、搜索功能等。在这个ASP网站...

    SQLMonitor oracle跟踪SQL工具

    针对Oracle数据库,有一款名为SQLMonitor的工具,它专为跟踪和监控SQL语句而设计,帮助开发者和DBA们找出程序操作的数据表,从而提升程序性能并进行精准的问题定位。本文将深入探讨SQLMonitor的功能、使用方法及其在...

    TSQL_Express【批量执行SQL】批量执行sql文件工具

    批量执行SQL是数据库管理中的一个常见需求,特别是在数据迁移、更新或维护时。本文将深入探讨批量执行SQL的概念、TSQL_Express的功能以及如何使用这款工具。 批量执行SQL是指一次性处理多个SQL命令或脚本,而不是...

    SQL Tuning sqlServer 数据库

    以下是对这个主题的详细探讨: 1. **SQL优化的重要性**: SQL语句是与数据库交互的基础,执行效率直接影响到应用程序的性能。优化SQL语句可以减少查询时间,降低服务器负载,提高用户体验,并节省硬件资源。 2. *...

    SQL Prompt插件, 支持SQL2019+SSMS18.5,仅用于学习研究. 不得用于商业用处!

    这款插件专为SQL Server Management Studio (SSMS) 设计,版本10.1.5.14730表明它是该系列的一个特定更新,兼容SQL Server 2019以及SSMS 18.5。在学习和研究环境中,SQL Prompt提供了多种功能,包括自动完成、代码...

    这是一个用VS连接SQL_SERVER的一个简单demo

    【标题】:“这是一个用VS连接SQL_SERVER的一个简单demo” 在这个示例中,我们将探讨如何使用Visual Studio(VS)与Microsoft SQL Server进行交互。VS作为强大的开发环境,支持多种数据库连接,包括SQL Server。这...

    sql2003标准 sql2003标准

    SQL2003是SQL语言的一个重要版本,它在数据库管理系统领域扮演着核心角色,尤其在数据查询、数据管理及数据分析方面。SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言,而SQL2003是国际...

    SQL数据库置疑解决-问题集锦

    本文将深入探讨SQL数据库“置疑”问题的原因、分析、预防和解决方法。 首先,“置疑”状态通常表示数据库在尝试打开时遇到了问题,可能由于硬件故障、操作系统错误、文件权限问题或SQL Server服务异常等导致。SQL...

    标准SQL和transact-sql之比较学习

    在数据库管理领域,SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言,而Transact-SQL(T-SQL)则是SQL的一个扩展,由Microsoft为它的SQL Server数据库管理系统所特有。本篇文章将深入探讨...

    我国全部城市sql_sql全国城市_city.sql_全国城市数据及建表语句_city_源码

    标题中的“我国全部城市sql_sql全国城市_city.sql_全国城市数据及建表语句_city_源码”表明这是一个关于中国所有城市的SQL数据库文件,其中包含了创建表的SQL语句以及城市的数据。这个文件可能用于数据分析、地理...

    SQL 执行超长语句

    超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...

    SQL脚本批量执行,方便大量的SQL脚本执行。

    在SQL的上下文中,批处理通常涉及将多个SQL语句写入一个文本文件,然后通过某种机制一次性执行这些语句。 1. **SQL Server Management Studio (SSMS)**:对于SQL Server用户,SSMS提供了一种直观的方式批量执行SQL...

    一个得到SQL服务器名称的类

    本文将深入探讨如何通过编程方式获取SQL服务器的名称,重点介绍标题为“一个得到SQL服务器名称的类”的主题。该类的目标是能够检测并返回局域网内运行的SQL Server实例的名称。 首先,我们要理解SQL Server名称的...

    SQL2000修复SQL修复

    本文将围绕“SQL2000修复”这一主题,深入探讨如何解决SQL Server 2000在运行过程中可能出现的各种问题,确保数据的安全性和完整性。 SQL Server 2000在企业级应用中广泛使用,它提供了强大的数据存储、管理和分析...

    SQL2008不能附加SQL2005数据库的问题

    标题与描述均指向了一个具体的技术问题:“SQL2008不能附加SQL2005数据库的问题”。这涉及到数据库管理系统(DBMS)版本升级时可能遇到的兼容性问题,特别是从SQL Server 2005升级至SQL Server 2008。在本文中,我们...

    SQL代码生成器_sql代码生成_sqlserver_

    SQL代码生成器是一种工具,它自动化了创建SQL脚本的过程,极大地提高了开发人员的效率。在SQL Server环境下,这样的工具尤为重要,因为SQL Server数据库的复杂性和规模常常需要编写大量复杂的查询和数据操作语句。本...

Global site tag (gtag.js) - Google Analytics