数据库设计实验(OpenGauss)

一、实验项目名称:数据库设计实验

二、实验环境

openGauss数据库、Windows 11操作系统、eclipse java IDE

三、实验内容

本实验旨在设计并实现一个关系数据库系统,用于管理一家国产汽车公司的业务数据。该系统将涉及数据库的概念设计、逻辑设计、实施、操作和维护,以及相关应用程序的开发。选定的汽车公司(例如比亚迪、长城、吉利或奇瑞)需处理包括车辆、品牌、车型、配置、经销商、供应商和客户信息等数据。

  1. 实体联系模型(E-R模型)

车辆实体:包含唯一的车辆识别号(VIN),以及与品牌、车型和配置相关的属性。

品牌实体:描述公司旗下不同品牌的信息。

车型实体:每个品牌下的具体车型信息。

配置实体:车辆的详细配置信息,如颜色、发动机排量、变速器等。

经销商实体:经销商的基本信息及其销售记录。

供应商实体:供应零件的供应商信息及其供应的零件详情。

客户实体:购车客户的个人信息及购买记录。

  1. 关系模型

从E-R模型到关系模型的转换:将E-R模型转换为初始的关系模型,并根据规范化理论对其进行优化。

数据库实施:基于OPENGAUSS平台创建关系数据库,定义表结构、索引和约束。

  1. 数据初始化

数据生成:模拟或抓取真实数据,生成初步测试数据,填充到数据库中。

数据校验:确保数据的完整性和有效性。

  1. 查询和数据分析

销售趋势分析:展示过去三年各品牌的销售趋势,按年、月分列,并按购买者性别和收入范围分类。

缺陷追踪:根据供应商信息,追踪存在缺陷的变速器,并找出受影响的车辆VIN及其客户。

品牌销售排名:分析过去一年的销售额和单位销售额,确定前两大品牌。

单月最佳销售车型:确定某个车型(如H4)在哪个月销售最佳。

库存分析:找出平均库存时间最长的经销商。

  1. 应用程序设计

程序目标:设计一个应用程序,实现上述查询和数据分析功能。

技术选型:根据需求选择C++、Java或Python语言,可以是单机版、GUI应用程序或Web应用。

程序结构:描述应用程序的架构、模块和用户界面设计。

四、实验过程

1、构建E-R模型

2、构建关系模型

实体:

车辆(VIN,颜色,发动机排量,型号,制造商号),VIN为主键,型号为外键。

车型(型号,品牌名),型号为主键,品牌名为外键。

品牌(品牌名),品牌名就是主键。

供应商(供应商ID,供应商名),供应商ID为主键。

客户(客户ID,地址,电话,年收入,姓名,性别),其中客户ID为主键。

经销商(经销商名),经销商名为主键。

联系:

供应(型号,供应商ID,零件种类,供应日期),型号和供应商名为主键。

购买(VIN,经销商名,购买日期),VIN和经销商名为主键。

销售(经销商名,客户ID,成交价格,日期,VIN),经销商名和客户ID和VIN构成主键。

3、基于OPENGAUSS 创建该关系数据库

车辆Vehicle(VIN,颜色,发动机排量,型号,制造商号),VIN为主键,型号为外键。

属性名

数据类型

对应英文名

VIN

varchar(17)

VIN

颜色

varchar(50)

color

发动机排量

int

engine_displacement

型号

varchar(255)

type_name

制造商号

varchar(255)

manufacturer

车型cartype(型号,品牌名),型号为主键,品牌名为外键。

品牌brand(品牌名),品牌名就是主键。

属性名

数据类型

对应英文名

型号

varchar(255)

type_name

品牌名

varchar(255)

brand

供应商supplier(供应商ID,供应商名),供应商ID为主键。

属性名

数据类型

对应英文名

供应商ID

Varchar(17)

supplyid

供应商名

varchar(255)

supplier

客户customer(客户ID,地址,电话,年收入,姓名,性别),其中客户ID为主键。

属性名

数据类型

对应英文名

客户ID

varchar(12)

customer_id

地址

varchar(255)

address

电话

varchar(11)

phone_number

年收入

int

income

姓名

varchar(255)

name

性别

varchar(10)

sex

经销商(经销商名),经销商名为主键。

属性名

数据类型

对应英文名

经销商名

varchar(255)

distributor

供应supply(型号,供应商ID,零件种类,供应日期),型号和供应商名为主键。

属性名

数据类型

对应英文名

型号

varchar(255)

type_name

供应商ID

Varchar(17)

supplyid

零件种类

varchar(255)

part_type

供应日期

date

supply_date

购买purchase(VIN,经销商名,购买日期),VIN和经销商名为主键。

属性名

数据类型

对应英文名

VIN

varchar(17)

VIN

经销商名

varchar(255)

distributor

购入日期

date

purchase_date

销售(经销商名,客户ID,成交价格,日期,VIN),经销商名和客户ID和VIN构成主键。

属性名

数据类型

对应英文名

经销商名

varchar(255)

distributor

客户ID

varchar(12)

customer_id

VIN

varchar(17)

VIN

成交价格

int

price

(成交)日期

date

deal_date

接下来,在OpenGauss下进行操作:

CREATE DATABASE Car OWNER Amy;

gsql -d car -p 26000 -U amy -W -r

CREATE SCHEMA amy AUTHORIZATION amy;

SET search_path TO amy;

创建表并赋予约束:

(1)create table brand(brand varchar(255) primary key);

(2)create table car_type(type_name varchar(255) primary key,brand varchar(255),foreign key (brand) references brand(brand) ON UPDATE CASCADE ON DELETE CASCADE);

(3)create table vehicle(vin varchar(17) primary key,color varchar(50),engine_displacement int,type_name varchar(255),manufacturer varchar(255),foreign key (type_name) references car_type(type_name) ON UPDATE CASCADE ON DELETE CASCADE);

(4)create table supplier(supplier varchar(255) primary key);

(5) CREATE TABLE parts_supply (type_name varchar(255),supplier varchar(255),part_type varchar(255), supply_date date, PRIMARY KEY (type_name, supplier), FOREIGN KEY (type_name) REFERENCES car_type(type_name)ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (supplier) REFERENCES supplier(supplier))ON UPDATE CASCADE ON DELETE CASCADE;

(6) create table distributor(distributor varchar(255) primary key);

(7) CREATE TABLE purchase (

    VIN varchar(17),

    distributor varchar(255),

    purchase_date date,

    PRIMARY KEY (VIN, distributor),

    FOREIGN KEY (VIN) REFERENCES vehicle(VIN),

FOREIGN KEY (distributor) REFERENCES distributor(distributor)

ON UPDATE CASCADE

ON DELETE CASCADE

);

(8)create table customer(customer_id varchar(12) primary key,address varchar(255),phone_number varchar(11),income int,name varchar(255),sex varchar(10));

(9) CREATE TABLE sales (

    distributor varchar(255),

    customer_id varchar(12),

    price int,

    deal_date date,

    VIN varchar(17),

    PRIMARY KEY (distributor, customer_id),

    FOREIGN KEY (distributor) REFERENCES distributor(distributor),

    FOREIGN KEY (customer_id) REFERENCES customer(customer_id),

FOREIGN KEY (VIN) REFERENCES vehicle(VIN)

ON UPDATE CASCADE

ON DELETE CASCADE

);

接下来向表中插入数据:

-- Insert multiple entries into 'brand' table

INSERT INTO brand (brand) VALUES ('比亚迪');

INSERT INTO brand (brand) VALUES ('长城汽车');

INSERT INTO brand (brand) VALUES ('吉利汽车');

INSERT INTO brand (brand) VALUES ('奇瑞汽车');

INSERT INTO brand (brand) VALUES ('宝马');

INSERT INTO brand (brand) VALUES ('奔驰');

INSERT INTO brand (brand) VALUES ('奥迪');

INSERT INTO brand (brand) VALUES ('特斯拉');

INSERT INTO brand (brand) VALUES ('本田');

INSERT INTO brand (brand) VALUES ('丰田');

-- Insert multiple entries into 'car_type' table

INSERT INTO car_type (type_name, brand) VALUES ('比亚迪唐DM', '比亚迪');

INSERT INTO car_type (type_name, brand) VALUES ('比亚迪汉', '比亚迪');

INSERT INTO car_type (type_name, brand) VALUES ('比亚迪秦Pro', '比亚迪');

INSERT INTO car_type (type_name, brand) VALUES ('长城哈弗H6', '长城汽车');

INSERT INTO car_type (type_name, brand) VALUES ('长城哈弗H2', '长城汽车');

INSERT INTO car_type (type_name, brand) VALUES ('长城哈弗H9', '长城汽车');

INSERT INTO car_type (type_name, brand) VALUES ('吉利博越Pro', '吉利汽车');

INSERT INTO car_type (type_name, brand) VALUES ('吉利帝豪', '吉利汽车');

INSERT INTO car_type (type_name, brand) VALUES ('吉利远景', '吉利汽车');

INSERT INTO car_type (type_name, brand) VALUES ('奇瑞瑞虎8', '奇瑞汽车');

INSERT INTO car_type (type_name, brand) VALUES ('奇瑞瑞虎7', '奇瑞汽车');

INSERT INTO car_type (type_name, brand) VALUES ('奇瑞艾瑞泽5', '奇瑞汽车');

INSERT INTO car_type (type_name, brand) VALUES ('宝马X5', '宝马');

INSERT INTO car_type (type_name, brand) VALUES ('宝马3系', '宝马');

INSERT INTO car_type (type_name, brand) VALUES ('宝马5系', '宝马');

INSERT INTO car_type (type_name, brand) VALUES ('奔驰C级', '奔驰');

INSERT INTO car_type (type_name, brand) VALUES ('奔驰E级', '奔驰');

INSERT INTO car_type (type_name, brand) VALUES ('奔驰GLC', '奔驰');

INSERT INTO car_type (type_name, brand) VALUES ('奥迪A4L', '奥迪');

INSERT INTO car_type (type_name, brand) VALUES ('奥迪Q5L', '奥迪');

INSERT INTO car_type (type_name, brand) VALUES ('奥迪A6L', '奥迪');

INSERT INTO car_type (type_name, brand) VALUES ('特斯拉Model S', '特斯拉');

INSERT INTO car_type (type_name, brand) VALUES ('特斯拉Model 3', '特斯拉');

INSERT INTO car_type (type_name, brand) VALUES ('特斯拉Model X', '特斯拉');

INSERT INTO car_type (type_name, brand) VALUES ('本田雅阁', '本田');

INSERT INTO car_type (type_name, brand) VALUES ('本田CR-V', '本田');

INSERT INTO car_type (type_name, brand) VALUES ('本田思域', '本田');

INSERT INTO car_type (type_name, brand) VALUES ('丰田卡罗拉', '丰田');

INSERT INTO car_type (type_name, brand) VALUES ('丰田普拉多', '丰田');

INSERT INTO car_type (type_name, brand) VALUES ('丰田RAV4荣放', '丰田');

-- Insert multiple entries into 'vehicle' table

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN031', '绿色', 2200, '比亚迪唐DM', '比亚迪');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN032', '橙色', 1800, '比亚迪宋', '比亚迪');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN033', '金色', 1600, '比亚迪秦Pro', '比亚迪');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN034', '黄色', 2000, '长城哈弗H6', '长城汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN035', '紫色', 1900, '长城哈弗H2', '长城汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN036', '粉色', 1700, '长城哈弗H9', '长城汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN037', '红色', 2500, '吉利博越Pro', '吉利汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN038', '黑色', 2000, '吉利帝豪', '吉利汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN039', '白色', 2200, '吉利远景', '吉利汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN040', '灰色', 2000, '奇瑞瑞虎8', '奇瑞汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN041', '银色', 2500, '奇瑞瑞虎7', '奇瑞汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN042', '蓝色', 2200, '奇瑞艾瑞泽5', '奇瑞汽车');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN043', '红色', 1800, '宝马X5', '宝马');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN044', '黑色', 2000, '宝马3系', '宝马');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN045', '白色', 2200, '宝马5系', '宝马');

INSERT INTO vehicle (vin, color, engine_displacement, type_name, manufacturer) VALUES ('VIN046', '灰色', 2000, '奔驰C级', '奔驰');

此处省略一些

-- Insert multiple entries into 'supplier' table

INSERT INTO supplier (supplier) VALUES ('全球汽车零件供应商');

INSERT INTO supplier (supplier) VALUES ('高性能零件有限公司');

INSERT INTO supplier (supplier) VALUES ('智能驱动系统供应商');

INSERT INTO supplier (supplier) VALUES ('优质汽车电子供应商');

INSERT INTO supplier (supplier) VALUES ('环保汽车配件供应商');

INSERT INTO supplier (supplier) VALUES ('先进材料科技公司');

INSERT INTO supplier (supplier) VALUES ('汽车安全系统有限公司');

INSERT INTO supplier (supplier) VALUES ('动力系统解决方案供应商');

INSERT INTO supplier (supplier) VALUES ('车辆信息娱乐系统供应商');

INSERT INTO supplier (supplier) VALUES ('汽车照明系统有限公司');

-- Insert multiple entries into 'parts_supply' table

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('比亚迪秦Pro', '环保汽车配件供应商', '座椅', '2023-01-20');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('长城哈弗H9', '先进材料科技公司', '车窗', '2023-02-25');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('吉利远景', '汽车安全系统有限公司', '刹车系统', '2023-03-30');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('奇瑞瑞虎7', '动力系统解决方案供应商', '启动器', '2023-04-04');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('宝马3系', '车辆信息娱乐系统供应商', '音响系统', '2023-05-09');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('奔驰E级', '汽车照明系统有限公司', '尾灯', '2023-06-14');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('奥迪Q5L', '全球汽车零件供应商', '空调系统', '2023-07-19');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('特斯拉Model 3', '高性能零件有限公司', '触摸屏', '2023-08-24');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('本田CR-V', '智能驱动系统供应商', '仪表盘', '2023-09-29');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('丰田RAV4荣放', '优质汽车电子供应商', '发动机控制单元', '2023-10-04');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('奇瑞艾瑞泽5', '环保汽车配件供应商', '排气管', '2023-11-09');

INSERT INTO parts_supply (type_name, supplier, part_type, supply_date) VALUES ('宝马5系', '先进材料科技公司', '车轮','2023-12-14');

-- Insert multiple entries into 'distributor' table

INSERT INTO distributor (distributor) VALUES ('东方汽车销售有限公司');

INSERT INTO distributor (distributor) VALUES ('环球车行');

INSERT INTO distributor (distributor) VALUES ('速驰汽车销售中心');

INSERT INTO distributor (distributor) VALUES ('明星汽车经销商');

INSERT INTO distributor (distributor) VALUES ('四海汽车贸易公司');

INSERT INTO distributor (distributor) VALUES ('银河汽车销售集团');

INSERT INTO distributor (distributor) VALUES ('阳光汽车经销商');

INSERT INTO distributor (distributor) VALUES ('宏伟汽车销售');

INSERT INTO distributor (distributor) VALUES ('骏马汽车销售有限公司');

INSERT INTO distributor (distributor) VALUES ('飞跃汽车销售中心');

-- Insert multiple entries into 'purchase' table

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN013', '东方汽车销售有限公司', '2023-01-16');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN014', '环球车行', '2023-02-21');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN015', '速驰汽车销售中心', '2023-03-26');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN016', '明星汽车经销商', '2023-04-01');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN017', '四海汽车贸易公司', '2023-05-06');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN018', '银河汽车销售集团', '2023-06-11');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN019', '阳光汽车经销商', '2023-07-16');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN020', '宏伟汽车销售', '2023-08-21');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN021', '骏马汽车销售有限公司', '2023-09-26');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN022', '飞跃汽车销售中心', '2023-10-31');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN023', '东方汽车销售有限公司', '2023-11-05');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN024', '环球车行', '2023-12-10');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN025', '速驰汽车销售中心', '2023-01-17');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN026', '明星汽车经销商', '2023-02-22');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN027', '四海汽车贸易公司', '2023-03-27');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN028', '银河汽车销售集团', '2023-04-02');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN029', '阳光汽车经销商', '2023-05-07');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN030', '宏伟汽车销售', '2023-06-12');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN031', '骏马汽车销售有限公司', '2023-07-17');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN032', '飞跃汽车销售中心', '2023-08-22');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN033', '东方汽车销售有限公司', '2023-09-27');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN034', '环球车行', '2023-10-01');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN035', '速驰汽车销售中心', '2023-11-06');

INSERT INTO purchase (VIN, distributor, purchase_date) VALUES ('VIN036', '明星汽车经销商', '2023-12-11');

-- Insert multiple entries into 'customer' table

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST001', '北京市朝阳区', '13800138000', 50000, '张伟', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST002', '上海市浦东新区', '13900139001', 55000, '李娜', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST003', '广州市天河区', '13700137002', 60000, '王浩', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST004', '深圳市南山区', '13600136003', 45000, '刘晨', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST005', '成都市武侯区', '13500135004', 48000, '陈薇', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST006', '杭州市西湖区', '13400134005', 53000, '李明', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST007', '武汉市江汉区', '13300133006', 58000, '赵丽', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST008', '南京市秦淮区', '13200132007', 47000, '孙伟', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST009', '西安市碑林区', '13100131008', 62000, '周强', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST010', '重庆市江北区', '13000130009', 51000, '吴倩', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST011', '苏州市姑苏区', '13900139010', 54000, '徐凯', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST012', '天津市和平区', '13800138011', 56000, '黄婷', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST013', '沈阳市沈河区', '13700137012', 61000, '曹阳', '男');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST014', '哈尔滨市道里区', '13600136013', 49000, '韩梅', '女');

INSERT INTO customer (customer_id, address, phone_number, income, name, sex) VALUES ('CUST015', '长春市南关区', '13500135014', 52000, '李华', '男');

-- Insert multiple entries into 'sales' table

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('东方汽车销售有限公司', 'CUST013', 360000, '2023-01-16', 'VIN013');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('环球车行', 'CUST014', 340000, '2023-02-21', 'VIN014');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('速驰汽车销售中心', 'CUST015', 370000, '2023-03-26', 'VIN015');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('明星汽车经销商', 'CUST016', 310000, '2023-04-01', 'VIN016');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('四海汽车贸易公司', 'CUST017', 330000, '2023-05-06', 'VIN017');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('银河汽车销售集团', 'CUST018', 380000, '2023-06-11', 'VIN018');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('阳光汽车经销商', 'CUST019', 300000, '2023-07-16', 'VIN019');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('宏伟汽车销售', 'CUST020', 320000, '2023-08-21', 'VIN020');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('骏马汽车销售有限公司', 'CUST021', 340000, '2023-09-26', 'VIN021');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('飞跃汽车销售中心', 'CUST022', 350000, '2023-10-31', 'VIN022');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('东方汽车销售有限公司', 'CUST023', 360000, '2023-11-05', 'VIN023');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('环球车行', 'CUST024', 310000, '2023-12-10', 'VIN024');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('速驰汽车销售中心', 'CUST025', 330000, '2023-01-17', 'VIN025');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('明星汽车经销商', 'CUST026', 340000, '2023-02-22', 'VIN026');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('四海汽车贸易公司', 'CUST027', 350000, '2023-03-27', 'VIN027');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('银河汽车销售集团', 'CUST028', 320000, '2023-04-02', 'VIN028');

INSERT INTO sales (distributor, customer_id, price, deal_date, VIN) VALUES ('阳光汽车经销商', 'CUST029', 360000, '2023-05-07', 'VIN029');

在数据库中进行实验调试。

五、实验结果

  1. 显示过去3年各品牌的销售趋势,按年、月分列。然后将这些数据按购买者的性别和收入范围进行分类。

SELECT

    EXTRACT(YEAR FROM deal_date) AS year,

    EXTRACT(MONTH FROM deal_date) AS month,

    brand,

    COUNT(*) AS sales_count,

    sex,

    CASE

        WHEN income < 30000 THEN '0-30000'

        WHEN income >= 30000 AND income < 60000 THEN '30000-60000'

        ELSE '60000以上'

    END AS income_range

FROM

    (((sales NATURAL JOIN distributor) NATURAL JOIN customer) NATURAL JOIN vehicle) NATURAL JOIN car_type

WHERE

    deal_date >= '2020-12-21'

GROUP BY

    EXTRACT(YEAR FROM deal_date),

    EXTRACT(MONTH FROM deal_date),

    brand,

    sex,

    income_range

ORDER BY

    EXTRACT(YEAR FROM deal_date),

    EXTRACT(MONTH FROM deal_date),

    brand,

    sex,

income_range;

运行结果:

  1. 假设发现供应商'高性能零件有限公司’在两个给定日期之间进行的变速器存在缺陷。找到每辆装有这种变速器的汽车的车辆识别号(VIN)以及向其销售的客户。

SELECT

    v.vin AS vehicle_vin,

    c.name AS customer_name,

    c.phone_number AS customer_phone

FROM

    vehicle v

JOIN

    sales s ON v.vin = s.vin

JOIN

    parts_supply p ON v.type_name = p.type_name

JOIN

    customer c ON s.customer_id = c.customer_id

JOIN

    purchase pc ON pc.vin = v.vin

WHERE

    p.supplier = '高性能零件有限公司'

    AND pc.purchase_date BETWEEN '2023-01-01' AND '2023-12-10';

查询结果:

  1. 按过去一年的销售金额找出前两大品牌

SELECT brand, SUM(price) AS total_sales_amount

FROM sales natural join (vehicle natural join car_type) WHERE deal_date >= 2023-00-00

GROUP BY brand ORDER BY  total_sales_amount DESC LIMIT 2;

  1. 根据过去一年的单位销售额找出前两大品牌。

SELECT

    brand,

    AVG(price) AS average_sales_amount

FROM

    sales

JOIN

    vehicle ON sales.VIN = vehicle.VIN

JOIN

    car_type ON vehicle.type_name = car_type.type_name

WHERE

    deal_date >= '2023-01-01'

GROUP BY

    brand

ORDER BY

    average_sales_amount DESC

LIMIT 2;

  1. 某种车型在哪个月卖得最好?

SELECT EXTRACT(MONTH FROM deal_date) AS month,

    COUNT(*) AS sales_count

FROM sales natural join vehicle

WHERE type_name = '车型1'

GROUP BY EXTRACT(MONTH FROM deal_date)

ORDER BY sales_count DESC LIMIT 1;

此处由于测试数据设置的问题,导致车辆查询结果若按月分类将出现大量count为1的情况,但不妨碍对数据库功能进行验证。

  1. 找到平均库存时间最长的经销商。

SELECT

    s.distributor,

    AVG(

        365 * (EXTRACT(YEAR FROM s.deal_date) - EXTRACT(YEAR FROM p.purchase_date)) +

        30 * (EXTRACT(MONTH FROM s.deal_date) - EXTRACT(MONTH FROM p.purchase_date)) +

        (EXTRACT(DAY FROM s.deal_date) - EXTRACT(DAY FROM p.purchase_date))

    ) AS avg_inventory_time

FROM

    sales s

JOIN

    purchase p ON s.vin = p.vin

GROUP BY

    s.distributor

ORDER BY

    avg_inventory_time DESC

LIMIT 1;

图像GUI设计:

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.sql.*;

public class CustomerGUI {

    public static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";

    public static final String DB_URL = "jdbc:mysql://localhost:3306/dbexperiment?&useSSL=false&serverTimezone=UTC";

    public static final String DB_USER = "root";

    public static final String DB_PASSWORD = "12138";

    public static void main(String[] args) {

        JFrame frame = new JFrame("CustomerGUI");

        frame.setSize(400, 380);

        JPanel panelInput = new JPanel();

        panelInput.setLayout(new GridLayout(5, 2, 10, 10));

        JLabel customerIdLabel = new JLabel("CustomerID:");

        JTextField customerIdText = new JTextField();

        JLabel nameLabel = new JLabel("Name:");

        JTextField nameText = new JTextField();

        JLabel sexLabel = new JLabel("Sex:");

        JTextField sexText = new JTextField();

        JLabel phoneNumberLabel = new JLabel("Phone number:");

        JTextField phoneNumberText = new JTextField();

        JLabel incomeLabel = new JLabel("Income:");

        JTextField incomeText = new JTextField();

        JButton submitButton = new JButton("Submit");

        panelInput.add(customerIdLabel);

        panelInput.add(customerIdText);

        panelInput.add(nameLabel);

        panelInput.add(nameText);

        panelInput.add(sexLabel);

        panelInput.add(sexText);

        panelInput.add(phoneNumberLabel);

        panelInput.add(phoneNumberText);

        panelInput.add(incomeLabel);

        panelInput.add(incomeText);

        frame.add(panelInput, BorderLayout.NORTH);

        frame.add(submitButton, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLocationRelativeTo(null);

        frame.setVisible(true);

        submitButton.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                String customerId = customerIdText.getText();

                try {

                    Class.forName(DRIVER_CLASS);

                    Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);

                    String querySQL = "SELECT * FROM customer WHERE customer_id = ?;";

                    PreparedStatement pst = conn.prepareStatement(querySQL);

                    pst.setString(1, customerId);

                    ResultSet rs = pst.executeQuery();

                    if (rs.next()) {

                        nameText.setText(rs.getString("name"));

                        sexText.setText(rs.getString("sex"));

                        phoneNumberText.setText(rs.getString("phone_number"));

                        incomeText.setText(String.valueOf(rs.getInt("income")));

                    } else {

                        JOptionPane.showMessageDialog(frame, "No customer found with ID: " + customerId);

                    }

                    rs.close();

                    pst.close();

                    conn.close();

                } catch (ClassNotFoundException | SQLException classNotFoundException) {

                    classNotFoundException.printStackTrace();

                }

            }

        });

    }

}

  • 总结及心得体会

      在本次实验中,成功创建了数据库和所需的表格,包括外键约束和适当的数据类型。

插入操作和查询操作验证了数据库模型的有效性,同时也展示了数据的一致性和完整性。

GUI程序能够成功连接数据库,并能根据用户的输入执行查询,显示结果。

通过本次实验,我深入了解了数据库的设计和实现过程。通过实践,我学会了如何创建和维护一个关系数据库,以及如何使用SQL来进行各种数据库操作。此外,Java GUI的开发让我体会到了前端与后端数据交互的实际应用,这对我的编程技能和数据库管理能力都是一次宝贵的提升。

在未来的学习中,我希望能够继续深化对数据库更高级特性的理解,例如触发器、存储过程以及数据库优化等。同时,我也期待能够学习更多关于用户界面设计和用户体验提升的知识,以创建更加直观和友好的应用程序。

报告评分:

                                      指导教师签字:

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值