`

一个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语法树的SQL注入过滤方法研究.pdf

    【SQL注入攻击】是Web应用程序安全领域中的一个严重威胁,攻击者通过构造恶意的SQL语句,利用程序处理用户输入时的不安全性,控制或操纵数据库,获取敏感信息,甚至破坏整个系统。【SQL语法树】是理解这一问题的关键...

    SQL Tuning sqlServer 数据库

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

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

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

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

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

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

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

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

    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。在本文中,我们...

Global site tag (gtag.js) - Google Analytics