-
最近面试碰到一个数据库多对多查询,心有疑问。5
有如上一张多对多关系结构 ,电影表(主键,电影名字,上映日期,简介),演员表(主键,演员,出生地址,出生日期,简介)
一个电影有多个演员,一个演员演了多个电影。
增加电影
insert into movie(movie_id,name,sydate,note)values(movseq.nextval,'阿凡达',to_date('2010-04-12','yyyy-mm-dd'),'这是一部3D电影'); insert into movie(movie_id,name,sydate,note)values(movseq.nextval,'绝命快递',to_date('2010-09-02','yyyy-mm-dd'),'这是一部3D电影'); insert into movie(movie_id,name,sydate,note)values(movseq.nextval,'加勒比海盗',to_date('2011-03-09','yyyy-mm-dd'),'这是一部3D电影'); insert into movie(movie_id,name,sydate,note)values(movseq.nextval,'变形金刚',to_date('2011-05-15','yyyy-mm-dd'),'这是一部3D电影'); insert into movie(movie_id,name,sydate,note)values(movseq.nextval,'绿类侠',to_date('2011-10-22','yyyy-mm-dd'),'这是一部3D电影');
增加演员
insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'张三','深圳',to_date('2000-04-02','yyyy-mm-dd'),'老实'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'李四','天津',to_date('2000-05-02','yyyy-mm-dd'),'严肃'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'王五','北京',to_date('2000-06-02','yyyy-mm-dd'),'未成年'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'赵六','南京',to_date('2000-07-02','yyyy-mm-dd'),'老头子'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'孙七','长沙',to_date('2000-08-02','yyyy-mm-dd'),'狡猾'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'钱八','上海',to_date('2000-09-02','yyyy-mm-dd'),'小偷'); insert into performer(performer_id,name,address,birthdate,note)values(merseq.nextval,'贺九','广东',to_date('2000-11-02','yyyy-mm-dd'),'老板');
增加关系
insert into mov_per(movie_id,performer_id)values(2,2); insert into mov_per(movie_id,performer_id)values(2,3); insert into mov_per(movie_id,performer_id)values(2,4); insert into mov_per(movie_id,performer_id)values(2,5); insert into mov_per(movie_id,performer_id)values(2,6); insert into mov_per(movie_id,performer_id)values(2,7); insert into mov_per(movie_id,performer_id)values(3,2); insert into mov_per(movie_id,performer_id)values(3,3); insert into mov_per(movie_id,performer_id)values(4,4); insert into mov_per(movie_id,performer_id)values(5,5); insert into mov_per(movie_id,performer_id)values(6,6); insert into mov_per(movie_id,performer_id)values(3,4); insert into mov_per(movie_id,performer_id)values(3,7); insert into mov_per(movie_id,performer_id)values(4,6); insert into mov_per(movie_id,performer_id)values(4,2); insert into mov_per(movie_id,performer_id)values(5,2); insert into mov_per(movie_id,performer_id)values(6,2); insert into mov_per(movie_id,performer_id)values(6,3); insert into mov_per(movie_id,performer_id)values(5,7); insert into mov_per(movie_id,performer_id)values(5,8); insert into mov_per(movie_id,performer_id)values(3,8); insert into mov_per(movie_id,performer_id)values(2,8); insert into mov_per(movie_id,performer_id)values(4,8); insert into mov_per(movie_id,performer_id)values(6,8);
原问题是这样的:
请写一个SQL语句查询演出电影数量大于3部并且上映的第一部电影是《阿凡达》的所有演员。
我想问的是,上映的第一部电影是《阿凡达》这个该怎么写,我自己想破脑袋结果也没想出来,= =|
如果能写出来全部SQL语句就更好了。
2011年11月18日 15:01
6个答案 按时间排序 按投票排序
-
采纳的答案
①最内层取得所有演出数量大于3的演员【红色】
②次外层就是在①的基础上取得这些演员的第一步电影【绿色】
③最外层就是在②的基础上看看哪些电影是阿凡达,然后筛选出演员【蓝色】
select per.*
from (select t.performer_id, mv.movie_id, min(mv.sydate)
from mov_per mp,
(select p.performer_id, count(p.performer_id)
from mov_per r, movie m, performer p
where r.movie_id = m.movie_id
and r.performer_id = p.performer_id
group by p.performer_id
having count(p.performer_id) > 3) t,
movie mv
where mp.movie_id = mv.movie_id
and mp.performer_id = t.performer_id
group by t.performer_id) ttt,
performer per,
movie mov
where ttt.performer_id = per.performer_id
and ttt.movie_id = mov.movie_id
and mov.name = '阿凡达'2011年11月18日 15:50
-
SELECT DISTINCT p.name ( SELECT p.performer_id,p.name,min(m.sydate) AS min_sydate FROM performer AS p JOIN mov_per AS mp ON p.performer_id=mp.performer_id JOIN movie AS m ON mp.movie_id=m.movie_id GROUP BY p.performer_id,p.name HAVING COUNT(*)>3 ) AS p JOIN mov_per AS mp ON p.performer_id=mp.performer_id JOIN movie AS m ON mp.movie_id=m.movie_id AND m.sydate=p.min_sydate WHERE m.name='阿凡达'
1.第一个关联表,查询“演出数量大于3的演员”,同时把其参演的第一部电影的上映日期查出。
2.外层再关联电影表,判断第一部电影是阿凡达的,考虑到可能存在有1部以上的电影同一天上映,所以使用“SELECT DISTINCT p.name”
2011年11月19日 11:28
-
取得演出电影数量大于3部并且上映的第一部电影是《阿凡达》的所有演员的语句
select per.*
from (select t.performer_id, mv.movie_id, min(mv.sydate)
from mov_per mp,
(select p.performer_id, count(p.performer_id)
from mov_per r, movie m, performer p
where r.movie_id = m.movie_id
and r.performer_id = p.performer_id
group by p.performer_id
having count(p.performer_id) > 3) t,
movie mv
where mp.movie_id = mv.movie_id
and mp.performer_id = t.performer_id
group by t.performer_id) ttt,
performer per,
movie mov
where ttt.performer_id = per.performer_id
and ttt.movie_id = mov.movie_id
and mov.name = '阿凡达'2011年11月18日 15:44
-
完整的就是
select mp.performer_id, p.name from mov_per mp join movie m on mp.movie_id=m.movie_id join performer p on mp.performer_id= p.performer_id group by p.performer_id having min(m.sydate) = (select sydate from movie m1 where m1.name="阿凡达") and count(mp.movie_id) > 3 ;
没试过能不能通过。。。反正类似这样2011年11月18日 15:40
-
上映的第一部电影是《阿凡达》这个应该用
select mp.performer_id from mov_per mp join movie m on mp.movie_id=m.movie_id where group by performer_id having min(m.sydate) = (select sydate from movie m1 where m1.name="阿凡达");
就是说 选出演员演过的电影阿凡达的并且是最早放映的2011年11月18日 15:36
相关推荐
数据库面试题涵盖了数据库基础知识、数据结构、算法、面向对象编程、软件工程以及特定数据库系统(如Visual FoxPro和SQL)的使用等多个方面。以下是这些题目所涉及的关键知识点的详细解释: 1. **算法的执行效率与...
7. 一个表的索引数最好不要超过 6 个,如果索引太多的话,就需要考虑一下那些不常使用到的列上建的索引是否有必要。 三、Web 相关 1. Web 服务器用来做什么? Web 服务器用来接收客户端(浏览器)的 HTTP 请求,...
在设计数据库时,还需要注意表之间的关联关系,可以分为一对一、一对多和多对多三种关系。 二、数据库性能优化 数据库性能优化是非常重要的,主要是优化查询语句,通过高性能的查询语句提高数据库的性能。此外,还...
E-R图(实体-关系图)是数据库设计中的一个重要工具,用于表示实体及其之间的关系。文中提到的关系类型主要包括冗余(redundancy)、不一致性(inconsistency)和不良数据关系(poor data relationship)。 - **冗余**:...
在Java面试中,数据库相关的知识点是必不可少的一部分,因为大多数企业应用都依赖于数据库来存储和检索数据。以下是一些在面试中可能涉及的关键概念和技能: 1. **SQL基础**:掌握SQL语言是基础,包括SELECT查询、...
数据库是信息技术领域中不可或缺的一部分,尤其在面试环节,掌握数据库的核心知识往往能为求职者加分不少。本资料集合了互联网上被广泛讨论的数据库面试经典试题,旨在帮助求职者更好地准备数据库相关的面试。 1. ...
mysql, 面试题, 数据库, 数据管理, 数据库管理, 数据库设计, sql, 数据查询, 数据库优化, 数据库安全, 数据库备份, 数据库恢复, 数据库性能, 数据库索引, 数据库事务, 数据库存储引擎, 数据库连接池, 数据库分库分表...
SQLSERVER 数据库面试题及答案 面对数据库面试时,候选人需要具备扎实的理论基础和实践经验,以下我们将为您提供一些常见的数据库面试题和答案,帮助您更好地准备面试。 1. 使用标准 SQL 嵌套语句查询选修课程名称...
### MySQL数据库工程师常见面试题详解 #### 问题1:为什么GROUP BY和ORDER BY会使查询变慢? GROUP BY 和 ORDER BY 操作通常会增加查询的复杂度,从而导致性能下降。这是因为这两种操作通常需要对查询结果进行额外...
在数据库面试中,掌握SQL语言和相关概念是非常关键的,这不仅涉及到数据的增删改查操作,还包括对数据库优化、事务处理、连接池等高级主题的理解。以下是对题目中涉及知识点的详细解释: 1. **创建表**: - 使用...
数据库是信息技术领域中的核心部分,尤其在大公司中,对数据库的理解和操作能力往往成为衡量一个技术人员能力的重要标准。这份“大公司数据库面试资料”集合了丰富的知识点,旨在帮助求职者和学习者提升数据库相关...
MySQL数据库在面试中常常成为考察的重点,因为它在各种规模的企业中都有着广泛的应用。以下是一些相关的面试知识点: 1. **排序查询**: - `ORDER BY`子句用于对查询结果进行排序。在题目中,根据部门号(`deptid`)...
在华为的数据库面试中,这类问题旨在考察应聘者对SQL查询语言的理解以及处理复杂数据关系的能力。本题涉及的关键知识点包括: 1. **联接查询(JOIN)**:题目要求查询A表的所有数据,但不直接显示id,而是用B表中...
这份"数据库面试题集"涵盖了数据库理论、SQL语言、数据库设计、性能优化和事务管理等多个方面,对于准备数据库相关的面试或者提升自己的数据库技能都有极大帮助。 1. **数据库基础** - 数据库的类型:关系型数据库...
这份"数据库面试题(汇总所有的数据库面试题).zip"压缩包显然包含了一系列与数据库相关的面试问题,旨在帮助求职者准备应对各种数据库面试挑战。以下是根据标题、描述以及可能的文件内容总结出的一些关键知识点: ...
本文将深入探讨“数据库SQL面试题大全”所涵盖的关键知识点,帮助求职者准备面试,确保在面对数据库相关问题时能够胸有成竹。 首先,SQL是用于管理关系型数据库的标准语言,它包括数据查询、数据更新、数据插入和...
索引是对数据库中表的一列或多列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B_TREE 及其变种。 索引的原理是通过根节点开始,根节点保存了子节点的指针,存储引擎会根据指针...
在程序员面试中,数据库相关知识是必不可少的一部分,这涵盖了数据库设计的基本理论、事务处理以及SQL语言的运用。以下是对这些知识点的详细解释: 1. **范式**:范式是数据库设计中的规范,用于减少数据冗余和更新...
- **超键** 是一组能够唯一标识表中元组的属性,可以由一个或多个字段组成。 - **候选键** 是超键中最小的、无冗余属性的集合,即没有多余字段但仍能保证唯一性。 - **外键** 是表A中的字段,引用了表B的主键,...
- **视图**:基于一个或多个表的一种虚拟表,可以通过视图查询数据,但其本身不存储数据。 - **存储过程**:一组预编译的SQL语句集合,可以被多次执行,通常用于封装复杂的业务逻辑,提高代码复用性和性能。 - **...