假设有一组film,一组customer,一组rental的数据库,要找到所有对借过同一部电影的customer,请给出sql语句
时间: 2024-09-21 18:01:29 浏览: 44
假设我们有三个表,分别是`films`、`customers` 和 `rentals`,它们的结构大概如下:
- films (film_id, title)
- customers (customer_id, name)
- rentals (rental_id, customer_id, film_id, rental_date)
为了找出所有借过同一部电影的顾客,我们可以使用SQL的`GROUP BY`和`HAVING`子句来完成这个查询。这里是一个可能的SQL语句示例:
```sql
SELECT c.customer_id, c.name
FROM customers c
JOIN rentals r ON c.customer_id = r.customer_id
GROUP BY c.customer_id, c.name, f.title
HAVING COUNT(DISTINCT r.film_id) = 1;
```
这个查询做了以下事情:
1. 使用`JOIN`将`customers`和`rentals`表通过`customer_id`关联起来。
2. `GROUP BY`按照客户ID、名字以及电影标题分组,这样每个组内的所有记录都代表了同一客户借过的同一部电影。
3. `HAVING COUNT(DISTINCT r.film_id) = 1`筛选出那些只借过一部电影(即电影ID唯一)的客户。
相关问题
sakila数据库课设
### Sakila 数据库课程设计概述
Sakila 是一个由 MySQL 官方提供的示例数据库,旨在帮助开发者和学生理解关系型数据库的设计与实现。该数据库模拟了一个 DVD 租赁商店的运营情况,包含了多个表来存储客户信息、影片详情以及租赁记录等数据[^1]。
#### 表结构介绍
Sakila 数据库中的主要表格包括但不限于:
- `actor`:演员信息表,包含演员 ID 及姓名字段。
- `address`:地址信息表,用于描述客户的居住位置。
- `category`:电影分类表,定义了不同类型的影片类别。
- `city`:城市列表表,列举了全球各个城市的名称及其所属国家的信息。
- `country`:国家列表表,列出了所有可能涉及的国家名。
- `customer`:顾客基本信息表,记录着每位租客的具体资料。
- `film`:影片资源表,详尽记载每部可供出租影碟的内容摘要。
- `inventory`:库存管理表,关联 film 和 store 表以追踪各店铺内现存可借阅物品的数量。
- `language`:语言种类表,指明所支持的语言版本。
- `payment`:付款交易明细表,跟踪每次支付行为的发生时间戳记及金额大小。
- `rental`:租赁活动日志表,登记每一次成功完成借用过程的关键时刻点。
- `staff`:员工档案表,维护工作人员的身份识别号和个人概况。
- `store`:门店配置文件表,概括说明开设营业网点的位置特征和其他属性设置。
这些表之间通过外键相互连接形成复杂的关系网络,从而能够全面反映实际业务场景下的运作模式。
#### SQL 查询实例
为了更好地掌握如何操作这个数据库,在此提供几个常见的查询语句作为参考案例:
```sql
-- 获取前五位最常光顾本店的老顾客名单
SELECT c.first_name, c.last_name FROM customer AS c JOIN rental AS r ON c.customer_id = r.customer_id GROUP BY c.customer_id ORDER BY COUNT(*) DESC LIMIT 5;
-- 统计各类别下分别有多少部电影
SELECT ca.name ,COUNT(f.film_id) FROM category AS ca INNER JOIN film_category fc USING (category_id) INNER JOIN film f USING (film_id) GROUP BY ca.category_id;
```
上述命令可以帮助初学者熟悉基本的数据检索技巧并加深对于 ER 图的理解程度。
#### 学习路径建议
针对想要深入研究 Sakila 数据库的同学而言,可以从以下几个方面入手:
- **理论基础巩固**:复习关系模型概念,了解范式化原则;学习 E-R 图绘制方法论;
- **实践动手能力培养**:尝试自己构建类似的简单应用系统;练习编写高效的 T-SQL 或 PL/SQL 脚本来处理批量任务;
- **性能优化探索**:分析现有架构存在的瓶颈所在之处;探讨索引机制的作用机理;评估分区策略带来的好处;
- **安全防护意识树立**:认识权限控制的重要性;防范 SQL 注入攻击手段;保护敏感个人信息不被泄露。
---
Sakila——MySQL样例数据库解析
Sakila是MySQL官方提供的一个样例数据库,用于演示和练习MySQL数据库的使用。数据库包含了一个虚构的DVD租赁店的数据,其中包括客户、电影、租赁记录等等。
Sakila数据库包含16张表,包括:
1. `actor`:演员表,包含演员的ID、名字和最后更新时间。
2. `address`:地址表,包含地址的ID、地址、邮编、电话和最后更新时间。
3. `category`:电影类别表,包含类别的ID和名称以及最后更新时间。
4. `city`:城市表,包含城市的ID、城市名称、国家ID和最后更新时间。
5. `country`:国家表,包含国家的ID、国家名称和最后更新时间。
6. `customer`:客户表,包含客户的ID、姓名、地址、邮编、电话、积分、注释和最后更新时间。
7. `film`:电影表,包含电影的ID、标题、描述、发行年份、语言ID、原始语言ID、租金、长度、评级和最后更新时间。
8. `film_actor`:电影演员表,包含电影ID和演员ID。
9. `film_category`:电影类别表,包含电影ID和类别ID。
10. `inventory`:库存表,包含DVD的ID、电影ID和最后更新时间。
11. `language`:语言表,包含语言的ID、名称和最后更新时间。
12. `payment`:支付表,包含支付的ID、客户ID、租赁ID、支付时间、租赁时长和支付金额。
13. `rental`:租赁表,包含租赁的ID、客户ID、电影ID、租赁时间和最后更新时间。
14. `staff`:员工表,包含员工的ID、姓名、地址、邮编、电话、邮箱、店铺ID、用户名、密码和最后更新时间。
15. `store`:店铺表,包含店铺的ID、地址、邮编、电话和最后更新时间。
16. `sales_by_film_category`:按电影类别统计销售额的视图,包含类别名称和销售额。
使用Sakila数据库可以练习SQL查询、联结、聚合、子查询等等操作,是学习MySQL的很好的工具。
阅读全文