MySQL数据库经典实例
MySQL是一种关系型数据库管理系统,广泛应用于各种Web应用和企业系统中,它以其高性能、可靠性和易用性而闻名,为了帮助初学者更好地理解和掌握MySQL,官方和社区提供了多个经典示例数据库,这些数据库不仅涵盖了基本的SQL操作,还展示了视图、存储过程、触发器等高级功能。
官方示例数据库介绍
1、sakila
简介:sakila是一个模拟的在线DVD租赁业务数据库,提供了丰富的数据表结构和数据,适用于演示和教学目的。
主要表结构:
actor
:存储演员信息。
film
:存储电影信息。
inventory
:存储库存信息。
rental
:存储租赁信息。
还包括视图、存储过程和触发器的示例,展示了MySQL的高级功能。
2、employees
简介:employees是一个经典的员工管理数据库,用于展示基本的数据库设计和SQL查询。
主要表结构:
departments
:存储部门信息。
employees
:存储员工基本信息。
dept_emp
:记录员工与部门之间的关联关系。
dept_manager
:记录部门经理的信息。
salaries
:记录员工的薪资信息。
titles
:记录员工的职位信息。
3、world
简介:world是一个小型的示例数据库,通常用于演示基本的SQL语句和数据库操作,适合初学者学习基本的SQL查询语句。
主要表结构:
city
:存储城市信息。
country
:存储国家信息。
countrylanguage
:存储国家语言信息。
4、world_x
简介:world_x是基于world修改后的版本,主要用于测试MySQL 5.7之后提供的文档存储功能和X DevAPI。
主要特点:包含文档存储的示例和相关的数据模型。
5、menagerie
简介:menagerie是一个简单的示例数据库,通常用于演示基本的数据库操作和概念。
6、airportdb
简介:airportdb是一个大型数据集,旨在与Oracle Cloud Infrastructure(OCI)和AWS上的MySQL HeatWave一起使用,用于复杂的分析查询。
经典案例解析
1、员工管理系统(employees)
场景描述:一个公司需要管理其员工信息,包括员工的基本信息、部门信息、职位信息和薪资信息。
“`sql
CREATE TABLE departments (
dept_no INT PRIMARY KEY,
dept_name VARCHAR(40) NOT NULL
);
CREATE TABLE employees (
emp_no INT PRIMARY KEY,
birth_date DATE,
first_name VARCHAR(14),
last_name VARCHAR(16),
gender ENUM(‘M’,’F’),
hire_date DATE,
dept_no INT,
FOREIGN KEY (dept_no) REFERENCES departments(dept_no)
);
CREATE TABLE dept_emp (
emp_no INT,
dept_no INT,
PRIMARY KEY (emp_no, dept_no),
FOREIGN KEY (emp_no) REFERENCES employees(emp_no),
FOREIGN KEY (dept_no) REFERENCES departments(dept_no)
);
CREATE TABLE dept_manager (
dept_no INT,
emp_no INT,
from_date DATE,
to_date DATE,
PRIMARY KEY (dept_no, emp_no),
FOREIGN KEY (dept_no) REFERENCES departments(dept_no),
FOREIGN KEY (emp_no) REFERENCES employees(emp_no)
);
CREATE TABLE salaries (
emp_no INT,
salary DECIMAL(7,2),
from_date DATE,
to_date DATE,
PRIMARY KEY (emp_no, from_date),
FOREIGN KEY (emp_no) REFERENCES employees(emp_no)
);
CREATE TABLE titles (
emp_no INT,
title VARCHAR(50),
from_date DATE,
to_date DATE,
PRIMARY KEY (emp_no, title, from_date),
FOREIGN KEY (emp_no) REFERENCES employees(emp_no)
);
“`
常用查询:
查询所有员工的姓名及其所在部门名称:
“`sql
SELECT e.first_name, e.last_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_no = d.dept_no;
“`
查询每个部门的平均工资:
“`sql
SELECT d.dept_name, AVG(s.salary) AS avg_salary
FROM departments d
JOIN dept_emp de ON d.dept_no = de.dept_no
JOIN employees e ON de.emp_no = e.emp_no
JOIN salaries s ON e.emp_no = s.emp_no
GROUP BY d.dept_no;
“`
2、在线DVD租赁系统(sakila)
场景描述:一个在线DVD租赁系统,提供电影租赁服务,需要管理影片、库存、客户、租赁记录等信息。
数据库设计:
“`sql
CREATE TABLE actor (
actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(50),
last_name VARCHAR(50),
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (actor_id)
);
CREATE TABLE film (
film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
description CLOB,
release_year YEAR,
language_id TINYINT UNSIGNED,
original_language_id TINYINT UNSIGNED,
rental_duration TINYINT UNSIGNED,
rental_rate DECIMAL(4,2),
length SMALLINT UNSIGNED,
replacement_cost DECIMAL(5,2),
rating ENUM(‘G’,’PG’,’PG13′,’R’,’NC17′) DEFAULT ‘G’,
special_features SET(‘Trailers’,’Commentaries’,’Deleted Scenes’,’Behind the scenes’,’Film Gags’) DEFAULT ”,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (film_id)
);
CREATE TABLE inventory (
inventory_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
film_id SMALLINT UNSIGNED NOT NULL,
store_id TINYINT UNSIGNED,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (inventory_id),
FOREIGN KEY (film_id) REFERENCES film(film_id)
);
CREATE TABLE rental (
rental_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
rental_date DATETIME NOT NULL,
inventory_id MEDIUMINT UNSIGNED NOT NULL,
customer_id SMALLINT UNSIGNED NOT NULL,
staff_id TINYINT UNSIGNED,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (rental_id),
FOREIGN KEY (inventory_id) REFERENCES inventory(inventory_id)
);
“`
常用查询:
查询某部电影的所有库存:
“`sql
SELECT f.title, COUNT(i.inventory_id) AS inventory_count
FROM film f
JOIN inventory i ON f.film_id = i.film_id
WHERE f.title = ‘某部电影’
GROUP BY f.film_id;
“`
查询某客户的租赁历史:
“`sql
SELECT r.rental_date, f.title
FROM rental r
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
WHERE r.customer_id = ‘某客户ID’
ORDER BY r.rental_date DESC;
“`
常见问题解答(FAQs)
1、如何导入MySQL示例数据库?
问题背景:在学习和测试MySQL时,导入官方提供的示例数据库是非常有用的,对于新手来说,如何正确导入这些数据库可能是一个挑战,下面将详细介绍如何导入MySQL示例数据库的步骤。
回答:要导入MySQL示例数据库,可以按照以下步骤进行:
1.下载示例数据库:访问MySQL官方网站的示例数据库下载页面,根据操作系统选择合适的压缩文件格式(Linux系统选择tar.gz,Windows系统选择zip),下载完成后,解压缩文件到本地目录。
2.创建数据库:在MySQL命令行或客户端工具中,创建一个新数据库来存放示例数据,创建名为“sakila”的数据库:CREATE DATABASE sakila;
。
3.导入数据:使用MySQL命令行或客户端工具,通过source命令导入解压后的SQL文件。mysql u root p sakila < sakilaschema.sql
(导入表结构),然后mysql u root p sakila < sakiladata.sql
(导入数据),注意替换相应的用户名和密码。
4.验证导入:导入完成后,可以通过查询表中的数据来验证是否成功,查询actor表的前几条记录:SELECT * FROM actor LIMIT 10;
,如果能看到预期的数据,说明导入成功。
2、如何在MySQL中创建和管理用户及权限?
问题背景:在MySQL的使用过程中,经常需要创建不同的用户并分配相应的权限,以确保数据库的安全性,了解如何有效地创建和管理用户及权限是管理MySQL数据库的重要技能之一,下面将详细解释如何在MySQL中创建和管理用户及权限的方法。
回答:在MySQL中创建和管理用户及权限可以通过以下步骤实现:
1.创建用户:使用CREATE USER语句创建新用户,创建一个名为“newuser”的用户,密码为“password”:CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
,这里,’localhost’表示该用户只能从本地主机连接,可以根据需要更改为其他主机名或IP地址。
2.授予权限:使用GRANT语句为用户分配权限,授予“newuser”用户对所有数据库的所有表的SELECT、INSERT、UPDATE和DELETE权限:GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'newuser'@'localhost';
,可以根据需要细化权限范围,如特定的数据库或表。
3.刷新权限:执行FLUSH PRIVILEGES;命令使更改的权限设置立即生效,虽然在某些情况下这一步不是必需的(如使用GRANT语句时),但执行此命令可以确保所有权限都已正确更新。
4.查看用户及其权限:使用SHOW GRANTS语句查看特定用户的权限,查看“newuser”用户的权限:SHOW GRANTS FOR 'newuser'@'localhost';
,这将列出该用户被授予的所有权限。
5.删除用户:使用DROP USER语句删除不再需要的用户,删除“newuser”用户:DROP USER 'newuser'@'localhost';
,执行此操作将永久删除该用户及其所有权限。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1081637.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复