查看: 122|回复: 1

数据库MySQL

[复制链接]

2

主题

14

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2022-11-30 10:54:37 | 显示全部楼层 |阅读模式
本文将记录一些 MySQL 数据库的使用方式。
<hr/>

  • 数据库MySQL

    • 数据库
    • 模拟场景
    • 实用的查询语句

      • 检索全部原料和检索价格最低的原料
      • 检索产品的原料
      • 表形式附录


数据库

数据库的定义十分的宏大和明确,是结构化信息或数据的有组织的集合。但我认为从使用来角度来讲,数据库恰恰是将用户从繁杂的数据结构和管理中解放出来。用户甚至无须费心去规划数据之间的关系。
在数据库的帮助下,他们只需要在日常工作中维护一些必要的信息即可,用户逐条地将这些信息存储到数据库中之后,这些信息之间的联系可以依靠数据库来建立和维护。
数据库的定义
数据库是结构化信息或数据(一般以电子形式存储在计算机系统中)的有组织的集合,通常由数据库管理系统 (DBMS) 来控制。在现实中,数据、DBMS 及关联应用一起被称为数据库系统,通常简称为数据库。
为了提高数据处理和查询效率,当今最常见的数据库通常以行和列的形式将数据存储在一系列的表中,支持用户便捷地访问、管理、修改、更新、控制和组织数据。另外,大多数数据库都使用结构化查询语言 (SQL) 来编写和查询数据。

数据库是什么 | Oracle 中国
模拟场景

我们首先来构建这样一个场景,它可以说是一个最基本的数据场景。在这个场景中,我们有一个“原料仓库”,原料是各种各样的原料,原料具有几种属性,包括它的名称、种类、单位和价格等,它们可能来自不同的产地和批次,不同产地和批次之间也具有不同的价格。
另外,我们还有一个“产品仓库”,它是产品的集合,产品是由“原料”组成的。因此产品除了具有品名、功能等属性之外,还需要说明它需要哪些“原料”以及它们的数量,这些原料可以用来确定产品是否可用,并且计算得到产品的价格。
那么,在这个场景下,我们的数据包含两个表,一个是原料表,另一个是产品表。而数据库存在的意义就是维护这两表,并且在给定某一个产品时,数据库应该能够从原料表中提取出相应的条目,用来确定产品的“价格”,以及告知哪些原料不在原料仓库中。



查询关系示意图

实用的查询语句

为了达到数据库的使用目的,我们首先建立数据表,它们在 PANDAS 的形式下,它们的形式如文章最后的图所示。
在这里,我们关注如何从 MySQL 数据库中检索这些数据,实用的检索语句细节如下
检索全部原料和检索价格最低的原料

检索全部原料比较简单,只需要遍历整个表即可。比较复杂的是如何检索出全部原料,同时去除重复值。因为如前所述,同一种原料可以有不止一条记录,这些记录的价格不同。因此,我们要做两件事情,首先是按价格进行排序,取出价格最小的资源,而当价格重复时,我们选“最新”添加的条目,因此,查询语句为
// Select entries with lowest prices
SELECT DISTINCT * FROM RESOURCE
     WHERE PRICE IN (SELECT MAX(price) FROM RESOURCE GROUP BY UID)

// Only select one entry with lowest prices
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
    SELECT * FROM (
        SELECT t1.*
        FROM RESOURCE t1
        JOIN (
            SELECT MIN(price) AS price
            FROM RESOURCE t1
            GROUP BY UID
            ) t2
        ON t2.price = t1.price
    ) t3
) t4
GROUP BY UID)
检索产品的原料

针对特定的产品,检索它的原料可以用最简单的方式,就是按照产品表列出的原料,在原料表中进行查询,两个表做交运算就可以得到产品需要的原料;但由于原料表可能有重复物料,这样做可能会导致物料重复,因此需要进行过滤;另外,还需要考虑哪些物料不在原料表中,查询语句为
# Simple joint
SELECT *
FROM PRODUCT a
JOIN RESOURCE b
ON a.SRC = b.UID
WHERE a.uid = '{p}'

# Select lowest price with latest entry
SELECT *
FROM PRODUCT a
JOIN
    (
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
    SELECT * FROM (
        SELECT t1.*
        FROM RESOURCE t1
        JOIN (
            SELECT MIN(price) AS price
            FROM RESOURCE t1
            GROUP BY UID
            ) t2
        ON t2.price = t1.price
    ) t3
) t4
GROUP BY UID)
    )as b
ON a.SRC = b.UID
WHERE a.uid = '{p}'

# Not have resources
SELECT *
FROM PRODUCT a
WHERE a.uid = '{p}'
    AND a.src NOT IN (SELECT UID FROM RESOURCE)
最后,我们还要求数据库进行一些简单的计算,计算的内容可以包括对应项相乘并相加。在本场景中,它可以用来计算商品的价格,查询语句如下
# The price

sql = f"""
SELECT SUM(a.COUNT * b.PRICE)
FROM PRODUCT a
JOIN (
SELECT t0.*
FROM RESOURCE t0
WHERE id in (SELECT MAX(id) AS id FROM (
    SELECT * FROM (
        SELECT t1.*
        FROM RESOURCE t1
        JOIN (
            SELECT MIN(price) AS price
            FROM RESOURCE t1
            GROUP BY UID
            ) t2
        ON t2.price = t1.price
    ) t3
) t4
GROUP BY UID)
    ) b
ON a.SRC = b.UID
WHERE a.uid = '{p}'
"""

db.execute(sql)
表形式附录




原料表示意图



产品表示意图
回复

使用道具 举报

3

主题

8

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2025-3-21 16:23:26 | 显示全部楼层
好,很好,非常好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表