SQL查询-电商数据案例

假设我们现在需要是某电商平台数据分析,由于业务需要,需要用sql取数

包括,Python连接数据库到模拟电商数据库,到sql场景查询

1,Python连接SQL数据库

以下是使用Python连接MySQL数据库并进行操作的示例代码:

import random
import time
import pymysql

# 定义名字数据
xing = ["王", "李", "张", "刘", "陈", "杨", "黄", "赵", "吴", "周"]
ming = ["伟", "芳", "娜", "敏", "静", "丽", "强", "磊", "军", "洋"]

# 连接数据库
conn = pymysql.connect(
    host="192.168.1.80",
    user="admin",
    password="123",
    database="management_systems",
    charset="utf8"
)
cursor = conn.cursor()

# 生成随机生日
a1 = (1980, 1, 1, 0, 0, 0, 0, 0, 0)
a2 = (2000, 12, 31, 23, 59, 59, 0, 0, 0)
start = time.mktime(a1)
end = time.mktime(a2)

# 插入学生数据
for i in range(1, 37):
    for j in range(1, 51):
        random_xing = random.randint(0, len(xing) - 1)
        random_ming = random.randint(0, len(ming) - 1)
        t = random.randint(start, end)
        date_t = time.localtime(t)
        birthday = time.strftime("%Y-%m-%d", date_t)
        sql = f"INSERT INTO student(class_id, student_name, student_birthday, sex) VALUES ({i}, '{xing[random_xing]}{ming[random_ming]}', '{birthday}', {random.randint(0, 1)})"
        cursor.execute(sql)

conn.commit()

# 查询数据
sql = """
SELECT 
    s.class_id, 
    c.class_name, 
    s.student_name, 
    s.student_birthday, 
    s.sex 
FROM 
    student s 
JOIN 
    class c 
ON 
    s.class_id = c.class_id
WHERE 
    s.student_birthday > '1990-01-01' 
ORDER BY 
    s.class_id, s.student_birthday;
"""
cursor.execute(sql)
result = cursor.fetchall()
for row in result:
    print(row)

# 关闭连接
cursor.close()
conn.close()

2,模拟数据库

假设我们有一个偏真实的电商数据库,其中包括以下几张主要数据表:

  • users:用户信息表
  • products:产品信息表
  • orders:订单表
  • order_items:订单详情表
  • reviews:产品评论表

以下是这些表的结构和部分复杂的SQL操作示例:

数据表结构

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    category VARCHAR(50),
    price DECIMAL(10, 2),
    stock INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    total_amount DECIMAL(10, 2),
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

CREATE TABLE order_items (
    order_item_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    product_id INT,
    quantity INT,
    price DECIMAL(10, 2),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

CREATE TABLE reviews (
    review_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    user_id INT,
    rating INT CHECK (rating BETWEEN 1 AND 5),
    comment TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES products(product_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

插入数据

import pymysql
import random
import time

# 连接数据库
conn = pymysql.connect(
    host="192.168.1.80",
    user="admin",
    password="123",
    database="ecommerce",
    charset="utf8"
)
cursor = conn.cursor()

# 插入用户数据
users = [("user1", "user1@example.com"), ("user2", "user2@example.com")]
for user in users:
    sql = f"INSERT INTO users(username, email) VALUES ('{user[0]}', '{user[1]}')"
    cursor.execute(sql)

# 插入产品数据
products = [("Product1", "Category1", 100.00, 10), ("Product2", "Category2", 200.00, 20)]
for product in products:
    sql = f"INSERT INTO products(product_name, category, price, stock) VALUES ('{product[0]}', '{product[1]}', {product[2]}, {product[3]})"
    cursor.execute(sql)

conn.commit()

# 插入订单和订单详情数据
order_data = [(1, '2024-01-01', 300.00), (2, '2024-01-02', 400.00)]
order_items_data = [(1, 1, 2, 100.00), (1, 2, 1, 200.00), (2, 1, 3, 300.00)]

for order in order_data:
    sql = f"INSERT INTO orders(user_id, order_date, total_amount) VALUES ({order[0]}, '{order[1]}', {order[2]})"
    cursor.execute(sql)

for item in order_items_data:
    sql = f"INSERT INTO order_items(order_id, product_id, quantity, price) VALUES ({item[0]}, {item[1]}, {item[2]}, {item[3]})"
    cursor.execute(sql)

conn.commit()

# 插入评论数据
reviews = [(1, 1, 5, "Excellent product!"), (2, 2, 4, "Very good.")]
for review in reviews:
    sql = f"INSERT INTO reviews(product_id, user_id, rating, comment) VALUES ({review[0]}, {review[1]}, {review[2]}, '{review[3]}')"
    cursor.execute(sql)

conn.commit()
cursor.close()
conn.close()

3,复杂查询示例

-- 查询每个用户的订单总金额及订单数量
SELECT 
    u.user_id, 
    u.username, 
    COUNT(o.order_id) AS order_count, 
    SUM(o.total_amount) AS total_spent 
FROM 
    users u 
LEFT JOIN 
    orders o 
ON 
    u.user_id = o.user_id 
GROUP BY 
    u.user_id, u.username;

-- 查询每个产品的平均评分及评论数量
SELECT 
    p.product_id, 
    p.product_name, 
    AVG(r.rating) AS average_rating, 
    COUNT(r.review_id) AS review_count 
FROM 
    products p 
LEFT JOIN 
    reviews r 
ON 
    p.product_id = r.product_id 
GROUP BY 
    p.product_id, p.product_name;

-- 查询订单详情,包含订单信息、用户信息及产品信息
SELECT 
    o.order_id, 
    u.username, 
    o.order_date, 
    p.product_name, 
    oi.quantity, 
    oi.price 
FROM 
    orders o 
JOIN 
    users u 
ON 
    o.user_id = u.user_id 
JOIN 
    order_items oi 
ON 
    o.order_id = oi.order_id 
JOIN 
    products p 
ON 
    oi.product_id = p.product_id;

-- 查询每个用户在每个类别上的花费总金额
SELECT 
    u.user_id, 
    u.username, 
    p.category, 
    SUM(oi.price * oi.quantity) AS total_spent 
FROM 
    users u 
JOIN 
    orders o 
ON 
    u.user_id = o.user_id 
JOIN 
    order_items oi 
ON 
    o.order_id = oi.order_id 
JOIN 
    products p 
ON 
    oi.product_id = p.product_id 
GROUP BY 
    u.user_id, u.username, p.category;

-- 查询在2024年每个月的销售总额和销售量
SELECT 
    YEAR(o.order_date) AS year, 
    MONTH(o.order_date) AS month, 
    SUM(oi.price * oi.quantity) AS total_sales, 
    SUM(oi.quantity) AS total_quantity 
FROM 
    orders o 
JOIN 
    order_items oi 
ON 
    o.order_id = oi.order_id 
WHERE 
    YEAR(o.order_date) = 2024 
GROUP BY 
    YEAR(o.order_date), MONTH(o.order_date);

通过这些示例,您可以看到如何使用Python连接数据库,生成和插入随机数据,以及进行复杂的SQL查询。

(交个朋友/技术接单/ai办公/性价比资源,注明来意)

e6dc3a6f9b5a4fb29434c33a001b09d0.png

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/663207.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】python 全国5A级景区数据采集与pyecharts可视化(源码+数据+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Liunx上安装MySQL

该文章是介绍的是 Ubuntu 操作系统,如果有使用 CentOS 的小伙伴不会的话可以私信我~ 1. 查找安装包 apt list |grep "mysql-server" 2. 安装mysql sudo apt install mysql-server 注意:安装的到最后一步会问你是否继续,输入y / Y就…

python内存马学习

python内存马学习 python内存马学习 python内存马学习环境搭建和复现分析payloadFlask 请求上下文管理机制bypass高版本flask内存马的利用before_request**after_request** teardown_requesterrorhandler相关例题H&NCTF 2024 ezFlask python内存马 环境搭建和复现 from fl…

SQL问题的常用信息收集命令及解决思路 |OceanBase应用实践

面对SQL问题,大家的常用的分析思路是: 一、问题是否源于SQL本身?是的话需进行SQL调优。 二、SQL语句本身无误,但执行效果并未达到我们的预期效果。 检查当前的服务器负载状况,例如CPU利用率、内存占用、IO读写等关键…

图书管理系统——java基础(源码)后续引入数据库,Swing程序设计,支持关注!后续更新……

学了java想要练手,图书管理系统这个项目非常适合你 项目需求大体想法: 能够查看书籍,借阅书籍,打印书籍等功能。输出姓名后能进入为普通用户模式或者管理员模式。 各类包之间协同合作之间关系讲解。 做这个项目的始终是为了对…

新疆 | 金石商砼效率革命背后的逻辑

走进标杆企业,感受名企力量,探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是新疆砼行业的龙头企业:新疆兵团建工金石商品混凝土有限责任公司(以下简称:新疆金石)。 从年产80万方到120万方&am…

计算机图形学入门03:基本变换

变换(Transformation)可分为模型(Model)变换和视图(Viewing)变换。在3D虚拟场景中相机的移动和旋转,角色人物动画都需要变换,用来描述物体运动。将三维世界投影变换到2D屏幕上成像出来,也需要变换。 1.二维变换 1.1缩放变换 如上图所示&…

自动化测试-ddt数据驱动yaml文件实战(详细)

前言 ddt 驱动 yaml/yml 文件来实现数据驱动测试 ddt.file_data:装饰测试方法,参数是文件名。文件可以是 json 或者 yaml 类型。 注意:如果文件是以 “.yml”或者".yaml" 结尾,ddt 会作为 yaml 类型处理,…

期权与股票在交易上是有什么区别吗?

国内的股票市场,只能做多,T1交易。期权则分为4个方向,买入看涨期权,买入看跌期权,也就是做多和做空T0双向交易,同时每个方向还区分不同的行权价,每个行权价对应的4个方向的期权,都有…

精通推荐算法6:用户行为序列建模 -- 总体架构

1 行为序列建模技术架构 身处目前这个信息爆炸的时代,用户在各推荐场景上有丰富的行为序列。将行为序列特征引入推荐算法中,有利于丰富特征工程体系、获得更立体和更全面的信息,同时可以表达用户兴趣演化过程,并捕获用户实时兴趣…

取代或转型?人工智能对软件测试的影响(内附工具推荐)

在当今快速发展的数字环境中,从移动App到基于Web的平台,软件已成为我们日常生活和工作不可或缺的一部分。然而,随着软件系统变得越来越复杂,如何确保其质量和可靠性已成为开发人员和测试人员所面临的一大重要挑战。 这就是软件测…

python探索时钟模拟之旅:从设计到实现

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、设计时钟类 三、代码实现 四、扩展功能:指定步数后自动停止 五…

<Transition> expects exactly one child element or component.

近日在vue中使用 Transition 标签是发生了如下报错: [plugin:vite:vue] expects exactly one child element or component. 原因: 仅支持单个元素或组件作为其插槽内容。如果内容是一个组件,这个组件必须仅有一个根元素。 原始代码&#xff1…

【产品经理】技术知识

引言:        在最近频繁的产品管理职位面试中,我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察,更多的是在复杂多变的环境中,如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…

应急通信保障之多链路聚合通信设备在应急救援实施中的解决方案

在当今信息化社会,应急通信保障已成为各类救援任务中不可或缺的一环。尤其在复杂多变的应急救援现场,如何确保通信畅通、信息传递及时,直接关系到救援行动的成败。近年来,多链路聚合通信设备以其独特的优势,逐渐在应急…

一款超好用的国产Redis可视化工具

一、简介 1、这是一款追求极致性能(它可以支持前面100万数据的展示。)海量数据下低内存占用、极简布局、高效交互、跨平台、支持反序列化Java字节码的redis可视化客户端工具。 支持三大操作系统Windows、MacOS、Linux,适合不同操作系统口味的…

网络延迟监控

网络中的延迟是指数据通过网络传输到其预期目的地所需的时间,它通常表示为往返延迟,即数据从一个位置传输到另一个位置所需的时间。 网络延迟(也称为滞后)定义为数据包通过多个网络设备进行封装、传输和处理,直到到达…

linux镜像虚拟机创建共享文件夹详细步骤 -- 和本地电脑传输文件

主机与虚拟机之间传递文件,最快捷的方法莫过于共享文件夹。此方法不需要复制文件,而且可以节省硬盘空间。 具体设置步骤如下: 打开自己的电脑,创建共享的文件夹,完成后鼠标右击刚刚创建的共享文件夹,选择…

《C语言深度解剖》(16):C语言的文件读写操作

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多C语言深度解剖点击专栏链接查看&…

RTPS协议之Messages Module

目录 Messages ModuleType定义RTPS消息结构RTPS消息头子消息结构 RTPS消息接收者SubmessageElementsRTPS HeaderRTPS Submessages Messages Module RTPS Writer和RTPS Reader之间的交换数据的消息。 Type定义 TypePurposeProtocolId_tSubmessageFlagsub msg flagSubmessageK…