MYSQL 三、mysql基础知识 7(MySQL8其它新特性)

        一、mysql8新特性概述

        MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上 做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。

         1.1 MySQL8.0 新增特性

        1. 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展,传统的关系型数据库已经越来越不能满足需求。从5.6版本开始,MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化,以更灵活的方式实现NoSQL功能,不再依赖模式(schema)。

        2. 更好的索引 在查询中,正确地使用索引可以提高查询的效率。MySQL 8中新增了 隐藏索引 和 降序索引 。隐藏索引可以用来测试去掉索引对查询性能的影响。在查询中混合存在多列索引时,使用降序索引可以提高查询的性能。

        3.更完善的JSON支持 MySQL从5.7开始支持原生JSON数据的存储,MySQL 8对这一功能做了优化,增加了聚合函数 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() ,将参数聚合为JSON数组或对象,新增了行内操作符 ->>,是列路径运算符 ->的增强,对JSON排序做了提升,并优化了JSON的更新操作。

        4.安全和账户管理 MySQL 8中新增了 caching_sha2_password 授权插件、角色、密码历史记录和FIPS模式支持,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作。

        5.InnoDB的变化 InnoDB是MySQL默认的存储引擎 ,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。在MySQL 8 版本中,InnoDB在自增、索引、加密、死锁、共享锁等方面做了大量的 改进和优化 ,并且支持原子数据定义语言(DDL),提高了数据安全性,对事务提供更好的支持。

        6.数据字典 在之前的MySQL版本中,字典数据都存储在元数据文件和非事务表中。从MySQL 8开始新增了事务数据字典,在这个字典里存储着数据库对象信息,这些数据字典存储在内部事务表中。

        7. 原子数据定义语句 MySQL 8开始支持原子数据定义语句(Automic DDL),即 原子DDL 。目前,只有InnoDB存储引擎支持原子DDL。原子数据定义语句(DDL)将与DDL操作相关的数据字典更新、存储引擎操作、二进制日志写入结合到一个单独的原子事务中,这使得即使服务器崩溃,事务也会提交或回滚。 使用支持原子操作的存储引擎所创建的表,在执行DROP TABLE、CREATE TABLE、ALTER TABLE、RENAME TABLE、TRUNCATE TABLE、CREATE TABLESPACE、DROP TABLESPACE等操作时,都支持原子操 作,即事务要么完全操作成功,要么失败后回滚,不再进行部分提交。 对于从MySQL 5.7复制到MySQL 8版本中的语句,可以添加 IF EXISTS 或 IF NOT EXISTS 语句来避免发生错误。

       8.资源管理 MySQL 8开始支持创建和管理资源组,允许将服务器内运行的线程分配给特定的分组,以便 线程根据组内可用资源执行。组属性能够控制组内资源,启用或限制组内资源消耗。数据库管理员能够 根据不同的工作负载适当地更改这些属性。 目前,CPU时间是可控资源,由“虚拟CPU”这个概念来表 示,此术语包含CPU的核心数,超线程,硬件线程等等。服务器在启动时确定可用的虚拟CPU数量。拥有 对应权限的数据库管理员可以将这些CPU与资源组关联,并为资源组分配线程。 资源组组件为MySQL中的资源组管理提供了SQL接口。资源组的属性用于定义资源组。MySQL中存在两个默认组,系统组和用户 组,默认的组不能被删除,其属性也不能被更改。对于用户自定义的组,资源组创建时可初始化所有的属性,除去名字和类型,其他属性都可在创建之后进行更改。 在一些平台下,或进行了某些MySQL的配置时,资源管理的功能将受到限制,甚至不可用。例如,如果安装了线程池插件,或者使用的是macOS系统,资源管理将处于不可用状态。在FreeBSD和Solaris系统中,资源线程优先级将失效。在Linux系统中,只有配置了CAP_SYS_NICE属性,资源管理优先级才能发挥作用。

        9.字符集支持 MySQL 8中默认的字符集由 latin1 更改为 utf8mb4 ,并首次增加了日语所特定使用的集 合,utf8mb4_ja_0900_as_cs。

        10.优化器增强 MySQL优化器开始支持隐藏索引和降序索引。隐藏索引不会被优化器使用,验证索引的必 要性时不需要删除索引,先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。降序索引允许优化器对多个列进行排序,并且允许排序顺序不一致。

        11.公用表表达式 公用表表达式(Common Table Expressions)简称为CTE,MySQL现在支持递归和非递 归两种形式的CTE。CTE通过在SELECT语句或其他特定语句前 使用WITH语句对临时结果集 进行命名。

        基础语法如下:

WITH cte_name (col_name1,col_name2 ...) AS (Subquery)
SELECT * FROM cte_name;
        Subquery代表子查询,子查询前使用 WITH 语句将结果集命名为 cte_name ,在后续的查询中即可使用 cte_name进行查询。
        12.窗口函数 MySQL 8 开始支持窗口函数。在之前的版本中已存在的大部分 聚合函数 在 MySQL 8 中也可以 作为窗口函数来使用。

        13.正则表达式支持 MySQL 在 8.0.4 以后的版本中采用支持 Unicode 的国际化组件库实现正则表达式操作, 这种方式不仅能提供完全的Unicode 支持,而且是多字节安全编码。 MySQL 增加了 REGEXP_LIKE() 、 EGEXP_INSTR()、 REGEXP_REPLACE() 和 REGEXP_SUBSTR() 等函数来提升性能。另外, regexp_stack_limit 和 regexp_time_limit 系统变量能够通过匹配引擎来控制资源消耗。
        
        14.内部临时表 TempTable 存储引擎取代 MEMORY 存储引擎成为内部临时表的默认存储引擎 。 TempTable 存储引擎为VARCHAR 和 VARBINARY 列提供高效存储 internal_tmp_mem_storage_engine 会话变量定义了内部 临时表的存储引擎,可选的值有两个,TempTable 和 MEMORY ,其中 TempTable 为默认的存储引擎。temptable_max_ram系统配置项定义了 TempTable 存储引擎可使用的最大内存数量。
        15.日志记录 在 MySQL 8 中错误日志子系统由一系列 MySQL 组件构成。这些组件的构成由系统变量 log_error_services来配置,能够实现日志事件的过滤和写入。
        16.备份锁 新的备份锁允许在线备份期间执行数据操作语句,同时阻止可能造成快照不一致的操作。新 备份锁由 LOCK INSTANCE FOR BACKUP 和 UNLOCK INSTANCE 语法提供支持,执行这些操作需要备份管理 员特权。
        17.增强的 MySQL 复制 MySQL 8 复制支持对 JSON 文档 进行部分更新的 二进制日志记录 ,该记录 使用紧凑 的二进制格式 ,从而节省记录完整 JSON 文档的空间。当使用基于语句的日志记录时,这种紧凑的日志记 录会自动完成,并且可以通过将新的binlog_row_value_options 系统变量值设置为 PARTIAL_JSON 来启用。
        1.2 MySQL8.0移除的旧特性
        在MySQL 5.7 版本上开发的应用程序如果使用了 MySQL8.0 移除的特性,语句可能会失败,或者产生不同的执行结果。为了避免这些问题,对于使用了移除特性的应用,应当尽力修正避免使用这些特性,并尽可能使用替代方法。
        1. 查询缓存 查询缓存已被移除 ,删除的项有:
                 ( 1 )语句: FLUSH QUERY CACHE 和 RESET QUERY CACHE。
                 ( 2 )系统变量: query_cache_limit 、 query_cache_min_res_unit 、 query_cache_size 、 query_cache_type、 query_cache_wlock_invalidate 。
                 ( 3 )状态变量: Qcache_free_blocks 、 Qcache_free_memory、 Qcache_hits 、 Qcache_inserts 、 Qcache_lowmem_prunes 、 Qcache_not_cached、 Qcache_queries_in_cache、 Qcache_total_blocks 。
                 ( 4 )线程状态: checking privileges on cached query、 checking query cache for query 、 invalidating query cache entries 、 sending cached result to client、 storing result in query cache 、 waiting for query cache lock 。
        
        2.加密相关 删除的加密相关的内容有: ENCODE() 、 DECODE() 、 ENCRYPT()、 DES_ENCRYPT() 和 DES_DECRYPT()函数,配置项 des-key-file ,系统变量 have_crypt , FLUSH 语句的 DES_KEY_FILE 选项, HAVE_CRYPT CMake选项。 对于移除的 ENCRYPT() 函数,考虑使用 SHA2() 替代,对于其他移除的函数,使 用AES_ENCRYPT() 和 AES_DECRYPT() 替代。
        3.空间函数相关 在 MySQL 5.7 版本中,多个空间函数已被标记为过时。这些过时函数在 MySQL 8 中都已被 移除,只保留了对应的ST_ 和 MBR 函数。
        4.\N和 NULL 在 SQL 语句中,解析器不再将 \N 视为 NULL ,所以在 SQL 语句中应使用 NULL 代替 \N 。这项变化不会影响使用LOAD DATA INFILE 或者 SELECT...INTO OUTFILE 操作文件的导入和导出。在这类操作中, NULL 仍等同于\N 。
        
        5. mysql_install_db 在 MySQL 分布中,已移除了 mysql_install_db 程序,数据字典初始化需要调用带着 -- initialize或者 --initialize-insecure 选项的 mysqld 来代替实现。另外, --bootstrap 和 INSTALL_SCRIPTDIR CMake也已被删除。
        6.通用分区处理程序 通用分区处理程序已从 MySQL 服务中被移除。为了实现给定表分区,表所使用的存 储引擎需要自有的分区处理程序。 提供本地分区支持的MySQL 存储引擎有两个,即 InnoDB 和 NDB ,而在 MySQL 8中只支持 InnoDB 。
        7.系统和状态变量信息 在 INFORMATION_SCHEMA 数据库中,对系统和状态变量信息不再进行维护。 GLOBAL_VARIABLES、 SESSION_VARIABLES 、 GLOBAL_STATUS 、 SESSION_STATUS 表都已被删除。另外,系 统变量show_compatibility_56 也已被删除。被删除的状态变量有 Slave_heartbeat_period 、 Slave_last_heartbeat,Slave_received_heartbeats、 Slave_retried_transactions 、 Slave_running 。以上被删除 的内容都可使用性能模式中对应的内容进行替代。
        8.mysql_plugin工具 mysql_plugin 工具用来配置 MySQL 服务器插件,现已被删除,可使用 --plugin-load 或 - -plugin-load-add选项在服务器启动时加载插件或者在运行时使用 INSTALL PLUGIN 语句加载插件来替代该 工具
        

        二、新特性1:窗口函数

        2.1 使用窗口函数前后对比
# 假设我现在有这样一个数据表,它显示了某购物网站在每个城市每个区的销售额:
CREATE TABLE sales(id INT PRIMARY KEY AUTO_INCREMENT,city VARCHAR(15),county VARCHAR(15),sales_value DECIMAL
);INSERT INTO sales(city,county,sales_value)
VALUES
('北京','海淀',10.00),
('北京','朝阳',20.00),
('上海','黄埔',30.00),
('上海','长宁',10.00);# 查询:
mysql> SELECT * FROM sales;
+----+------+--------+-------------+
| id | city | county | sales_value |
+----+------+--------+-------------+
| 1 | 北京 | 海淀 | 10 |
| 2 | 北京 | 朝阳 | 20 |
| 3 | 上海 | 黄埔 | 30 |
| 4 | 上海 | 长宁 | 10 |
+----+------+--------+-------------+
4 rows in set (0.00 sec)# 需求:现在计算这个网站在每个城市的销售总额、在全国的销售总额、每个区的销售额占所在城市销售
额中的比率,以及占总销售额中的比率。# 如果用分组和聚合函数,就需要分好几步来计算。
# 第一步,计算总销售金额,并存入临时表 a:
CREATE TEMPORARY TABLE a -- 创建临时表
SELECT SUM(sales_value) AS sales_value -- 计算总计金额
FROM sales;# 查看一下临时表 a :
mysql> SELECT * FROM a;
+-------------+
| sales_value |
+-------------+
| 70 |
+-------------+
1 row in set (0.00 sec)# 第二步,计算每个城市的销售总额并存入临时表 b:
CREATE TEMPORARY TABLE b -- 创建临时表
SELECT city,SUM(sales_value) AS sales_value -- 计算城市销售合计
FROM sales
GROUP BY city;# 查看临时表 b :
mysql> SELECT * FROM b;
+------+-------------+
| city | sales_value |
+------+-------------+
| 北京 | 30 |
| 上海 | 40 |
+------+-------------+
2 rows in set (0.00 sec)# 第三步,计算各区的销售占所在城市的总计金额的比例,和占全部销售总计金额的比例。我们可以通过
下面的连接查询获得需要的结果:mysql> SELECT s.city AS 城市,s.county AS 区,s.sales_value AS 区销售额,
-> b.sales_value AS 市销售额,s.sales_value/b.sales_value AS 市比率,
-> a.sales_value AS 总销售额,s.sales_value/a.sales_value AS 总比率
-> FROM sales s
-> JOIN b ON (s.city=b.city) -- 连接市统计结果临时表
-> JOIN a -- 连接总计金额临时表
-> ORDER BY s.city,s.county;
+------+------+----------+----------+--------+----------+--------+
| 城市 | 区 | 区销售额 | 市销售额 | 市比率 | 总销售额 | 总比率 |
+------+------+----------+----------+--------+----------+--------+
| 上海 | 长宁 | 10 | 40 | 0.2500 | 70 | 0.1429 |
| 上海 | 黄埔 | 30 | 40 | 0.7500 | 70 | 0.4286 |
| 北京 | 朝阳 | 20 | 30 | 0.6667 | 70 | 0.2857 |
| 北京 | 海淀 | 10 | 30 | 0.3333 | 70 | 0.1429 |
+------+------+----------+----------+--------+----------+--------+
4 rows in set (0.00 sec)#结果显示:市销售金额、市销售占比、总销售金额、总销售占比都计算出来了。#同样的查询,如果用窗口函数,就简单多了。我们可以用下面的代码来实现:mysql> SELECT city AS 城市,county AS 区,sales_value AS 区销售额,
-> SUM(sales_value) OVER(PARTITION BY city) AS 市销售额, -- 计算市销售额
-> sales_value/SUM(sales_value) OVER(PARTITION BY city) AS 市比率,
-> SUM(sales_value) OVER() AS 总销售额, -- 计算总销售额
-> sales_value/SUM(sales_value) OVER() AS 总比率
-> FROM sales
-> ORDER BY city,county;
+------+------+----------+----------+--------+----------+--------+
| 城市 | 区 | 区销售额 | 市销售额 | 市比率 | 总销售额 | 总比率 |
+------+------+----------+----------+--------+----------+--------+
| 上海 | 长宁 | 10 | 40 | 0.2500 | 70 | 0.1429 |
| 上海 | 黄埔 | 30 | 40 | 0.7500 | 70 | 0.4286 |
| 北京 | 朝阳 | 20 | 30 | 0.6667 | 70 | 0.2857 |
| 北京 | 海淀 | 10 | 30 | 0.3333 | 70 | 0.1429 |
+------+------+----------+-----------+--------+----------+--------+
4 rows in set (0.00 sec)# 结果显示,我们得到了与上面那种查询同样的结果。
# 使用窗口函数,只用了一步就完成了查询。而且,由于没有用到临时表,执行的效率也更高了。很显
然,在这种需要用到分组统计的结果对每一条记录进行计算的场景下,使用窗口函数更好。

2.2 窗口函数分类

        MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。

        窗口函数可以分为 静态窗口函数 和 动态窗口函数 。
  •                 静态窗口:函数的窗口大小是固定的,不会因为记录的不同而不同;
  •                 动态窗口:函数的窗口大小会随着记录的不同而变化

        MySQL官方网站窗口函数的网址为https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number。

        窗口函数总体上可以分为序号函数、分布函数、前后函数、首尾函数和其他函数,如下表:
函数分类函数

函数说明

序号函数ROW_NUMBER()顺序排序
RANK()并列排序,会跳过重复的序号,比如序号1、1、3
DENSE_RANK()并列排序,不会跳过重复的序号,比如序号为1、1、2
分布函数PERCENT_RANK()等值百分比
CUME_DIST()累积分布值
前后函数LAG(expr,n)返回当前行的前n行的expr的值
LEAD(expr,n)返回当前行的后n行的expr的值
首位函数FIRST_VALUE(expr)返回第一个expr的值
LAST_VALUE(expr)返回最后一个expr的值
其他函数NTH_VALUE(expr,n)返回第n个expr的值
NTILE(n)将分区中的有序数据分为n个桶,记录桶编号

        

        2.3 语法结构

        窗口函数的语法结构是:

函数 OVER ( [ PARTITION BY 字段名 ORDER BY 字段名 ASC | DESC ] )
或者是:
函数 OVER 窗口名 … WINDOW 窗口名 AS ( [ PARTITION BY 字段名 ORDER BY 字段名 ASC | DESC ] )
  • OVER 关键字指定函数窗口的范围。
    • 如果省略后面括号中的内容,则窗口会包含满足WHERE条件的所有记录,窗口函数会基于所有满足WHERE条件的记录进行计算。
    • 如果OVER关键字后面的括号不为空,则可以使用如下语法设置窗口。
  • 窗口名:为窗口设置一个别名,用来标识窗口。
  • PARTITION BY子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可以在每个分组中分别执行。
  • ORDER BY子句:指定窗口函数按照哪些字段进行排序。执行排序操作使窗口函数按照排序后的数据记录的顺序进行编号。
  • FRAME子句:为分区中的某个子集定义规则,可以用来作为滑动窗口使用。
        2.4 分类讲解
# 创建表:
CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,category_id INT,category VARCHAR(15),NAME VARCHAR(30),price DECIMAL(10,2),stock INT,upper_time DATETIME
);# 添加数据:
INSERT INTO goods(category_id,category,NAME,price,stock,upper_time)
VALUES
(1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '卫衣', 89.90, 1500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '牛仔裤', 89.90, 3500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00'),
(2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'),
(2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'),
(2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
(2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'),
(2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'),
(2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');
        
        下面针对goods表中的数据来验证每个窗口函数的功能。
# 1. 序号函数# 1.ROW_NUMBER()函数
# ROW_NUMBER()函数能够对数据中的序号进行顺序显示。
# 举例:查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。mysql> SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS
row_num,
-> id, category_id, category, NAME, price, stock
-> FROM goods;
+---------+----+-------------+---------------+------------+---------+-------+
| row_num | id | category_id | category      | NAME       | price   | stock |
+---------+----+-------------+---------------+------------+---------+-------+
| 1       | 6  | 1           | 女装/女士精品  | 呢绒外套    | 399.90  | 1200 |
| 2       | 3  | 1           | 女装/女士精品  | 卫衣        | 89.90   | 1500 |
| 3       | 4  | 1           | 女装/女士精品  | 牛仔裤      | 89.90   | 3500 |
| 4       | 2  | 1           | 女装/女士精品  | 连衣裙      | 79.90   | 2500 |
| 5       | 1  | 1           | 女装/女士精品  | T恤         | 39.90   | 1000 |
| 6       | 5  | 1           | 女装/女士精品  | 百褶裙       | 29.90   | 500 |
| 1       | 8  | 2           | 户外运动      | 山地自行车    | 1399.90 | 2500 |
| 2       | 11 | 2           | 户外运动      | 运动外套      | 799.90  | 500 |
| 3       | 12 | 2           | 户外运动      | 滑板          | 499.90  | 1200 |
| 4       | 7  | 2           | 户外运动      | 自行车       | 399.90  | 1000 |
| 5       | 10 | 2           | 户外运动      | 骑行装备     | 399.90  | 3500 |
| 6       | 9  | 2           | 户外运动      | 登山杖      | 59.90    | 1500 |
+---------+----+-------------+---------------+------------+---------+-------+
12 rows in set (0.00 sec)# 举例:查询 goods 数据表中每个商品分类下价格最高的3种商品信息。mysql> SELECT *
-> FROM (
-> SELECT ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY price DESC) AS
row_num,
-> id, category_id, category, NAME, price, stock
-> FROM goods) t
-> WHERE row_num <= 3;
+---------+----+-------------+---------------+------------+---------+-------+
| row_num | id | category_id | category      | NAME       | price   | stock |
+---------+----+-------------+---------------+------------+---------+-------+
| 1       | 6  | 1           | 女装/女士精品  | 呢绒外套    | 399.90 | 1200 |
| 2       | 3  | 1           | 女装/女士精品  | 卫衣        | 89.90 | 1500 |
| 3       | 4  | 1           | 女装/女士精品  | 牛仔裤      | 89.90 | 3500 |
| 1       | 8  | 2           | 户外运动       | 山地自行车  | 1399.90 | 2500 |
| 2       | 11 | 2           | 户外运动       | 运动外套    | 799.90 | 500 |
| 3       | 12 | 2           | 户外运动       | 滑板        | 499.90 | 1200 |
+---------+----+-------------+---------------+------------+----------+-------+
6 rows in set (0.00 sec)# 在名称为“女装/女士精品”的商品类别中,有两款商品的价格为89.90元,分别是卫衣和牛仔裤。两款商品
的序号都应该为2,而不是一个为2,另一个为3。此时,可以使用RANK()函数和DENSE_RANK()函数解
决。# 2.RANK()函数
# 使用RANK()函数能够对序号进行并列排序,并且会跳过重复的序号,比如序号为1、1、3。
# 举例:使用RANK()函数获取 goods 数据表中各类别的价格从高到低排序的各商品信息。mysql> SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS row_num,
-> id, category_id, category, NAME, price, stock
-> FROM goods;
+---------+----+-------------+---------------+------------+---------+-------+
| row_num | id | category_id | category | NAME | price | stock |
+---------+----+-------------+---------------+------------+---------+-------+
| 1 | 6 | 1 | 女装/女士精品 | 呢绒外套 | 399.90 | 1200 |
| 2 | 3 | 1 | 女装/女士精品 | 卫衣 | 89.90 | 1500 |
| 2 | 4 | 1 | 女装/女士精品 | 牛仔裤 | 89.90 | 3500 |
| 4 | 2 | 1 | 女装/女士精品 | 连衣裙 | 79.90 | 2500 |
| 5 | 1 | 1 | 女装/女士精品 | T恤 | 39.90 | 1000 |
| 6 | 5 | 1 | 女装/女士精品 | 百褶裙 | 29.90 | 500 |
| 1 | 8 | 2 | 户外运动 | 山地自行车 | 1399.90 | 2500 |
| 2 | 11 | 2 | 户外运动 | 运动外套 | 799.90 | 500 |
| 3 | 12 | 2 | 户外运动 | 滑板 | 499.90 | 1200 |
| 4 | 7 | 2 | 户外运动 | 自行车 | 399.90 | 1000 |
| 4 | 10 | 2 | 户外运动 | 骑行装备 | 399.90 | 3500 |
| 6 | 9 | 2 | 户外运动 | 登山杖 | 59.90 | 1500 |
+---------+----+-------------+---------------+------------+---------+-------+
12 rows in set (0.00 sec)

        

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)

云资源同步是通过apikey去单向同步云上的主机资源和云区域信息&#xff0c;目前支持腾讯云和亚马逊云。主要特性 1、蓝鲸配置平台周期性的单向只读同步云主机和vpc&#xff08;对应蓝鲸云区域&#xff09;信息&#xff0c;第一次全量&#xff0c;后面增量 2、默认同步到主机池…

Webrtc支持FFMPEG硬解码之NVIDA(二)

一、前言 此系列文章分分为三篇, Webrtc支持FFMPEG硬解码之Intel(一)-CSDN博客 Webrtc支持FFMPEG硬解码之NVIDA(二)-CSDN博客 Webrtc支持FFMPEG硬解码之解码实现-CSDN博客 AMD硬解目前还没找到可用解码器,欢迎留言交流 二、环境 Windows平台 VS2019 Cmake 三、下…

短剧系统源码短剧平台开发短剧小程序APP短剧模版Java源码

一.管理端设置及操作 1.系统配置 系统的配置项都在该列表中,使用前请配置好参数 2.签到积分设置 签到可以获取设置积分,连续签到按照设置的积分规则走,积分可以兑换余额,兑换比例按照配置104,余额可以消费 3.用户中心 所有的用户注册后都会在该列表展示,可以查看用户详情,也…

正点原子imx6ull 进度条颜色、logo位置上偏或色偏等问题

正点原子imx6ull 进度条改颜色 logo位置上偏或显示色偏等问题 开机进度条logo问题进度条界面全屏logo位置上偏进度条界面logo其他问题进度条界面去掉中间这条杠 uboot界面logo问题不显示uboot界面的打印信息uboot显示logo不理想uboot不显示logo 开机进度条logo问题 进度条界面…

拿来做课设哈哈哈-“久坐提醒器”的网页应用

这篇文章将介绍一个名为“久坐提醒器”的网页应用&#xff0c;它通过HTML、CSS和JavaScript三种技术实现。下面是对这三种技术在实现该应用中的作用和代码的详细解析。 HTML&#xff1a;构建网页结构 HTML&#xff08;HyperText Markup Language&#xff09;是网页的基础结构…

2. ceph存储组件

ceph存储组件 一、ceph存储介绍1、ceph介绍2、ceph提供的存储接口 二、ceph的核心组件三、crush算法 一、ceph存储介绍 分布式存储/文件系统&#xff0c;数据按特定的算法分散存储到不同的设备上 存在数据副本机制&#xff0c;保证数据的可靠性 典型的开源软件&#xff1a; ce…

申办引调水乙级资质关于办公场所和技术装备的要求

申办引调水乙级资质时&#xff0c;关于办公场所和技术装备的要求主要包括以下几点&#xff1a; 办公场所&#xff1a; 固定办公地点&#xff1a;企业应具备固定的办公场所&#xff0c;作为日常运营和设计工作的基础。办公场所需满足设计团队的工作需求&#xff0c;包括设计绘图…

LabVIEW RT在非NI硬件上的应用与分析

LabVIEW RT&#xff08;实时操作系统&#xff09;可运行在非NI&#xff08;National Instruments&#xff09;硬件上&#xff0c;如研华工控机&#xff0c;但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…

神经网络字符分类

按照题目要求修改了多层感知机 题目将图片的每个点作为输入&#xff0c;其中大小为28*28&#xff0c;中间有两个大小为100的隐藏层&#xff0c;激活函数是relu&#xff0c;然后输出大小是10&#xff0c;激活函数是softmax 优化器是Adam&#xff0c;结合了AdaGrad和RMSProp算法…

Segmentation fault的原因和例子

最近有用cpp写点东西&#xff0c;然后就碰到Segmentation fault了&#xff0c;调试的时候&#xff0c;ide指出报错的地方看着没问题。后来研究发现&#xff0c;是递归层数太多导致的。 “Segmentation fault”&#xff08;简称"segfault"&#xff09;是一个常见的计…

机器学习python实践——关于ward聚类分层算法的一些个人心得

最近在利用python跟着参考书进行机器学习相关实践&#xff0c;相关案例用到了ward算法&#xff0c;但是我理论部分用的是周志华老师的《西瓜书》&#xff0c;书上没有写关于ward的相关介绍&#xff0c;所以自己网上查了一堆资料&#xff0c;都很难说清楚ward算法&#xff0c;幸…

Python之Pandas详解

Pandas是Python语言的一个扩展程序库&#xff0c;用于数据分析。 Pandas是一个开放源码、BSD许可的库&#xff0c;提供高性能、易于使用的数据结构和数据分析工具。 Pandas名字衍生自术语 “panel data”&#xff08;面板数据&#xff09;和 “Python data analysis”&#x…

AIGC绘画设计:Midjourney V6 来袭,该版本有哪些新功能?

Midjourney V6 支持更自然的语言输入&#xff0c;可以处理更自然地对话式&#xff08;以前的版本是以关键字为中心的&#xff09;提示&#xff0c;对复杂提示有了更好的解释能力。大幅增加了每个 /image 的内存&#xff0c;可以处理更长、更详细的提示&#xff08;从40 直接提升…

Spark 面试题(七)

1. Spark中的Transform和Action&#xff0c;为什么Spark要把操作分为Transform 和Action&#xff1f;常用的列举一些&#xff0c;说下算子原理 &#xff1f; 在Spark中&#xff0c;操作被分为转换&#xff08;Transformation&#xff09;和行动&#xff08;Action&#xff09;…

Android framework的Zygote源码分析

文章目录 Android framework的Zygote源码分析linux的fork Android framework的Zygote源码分析 init.rc 在Android系统中&#xff0c;zygote是一个native进程&#xff0c;是Android系统上所有应用进程的父进程&#xff0c;我们系统上app的进程都是由这个zygote分裂出来的。zyg…

Processing java 动态海报 地球日

【Processing java 动态海报 地球日】

12、云服务器上搭建环境

云服务器上搭建环境 12.1 选择一款远程连接工具(mobax) 有很多,比如mobax、xshll等等,我这里选择mobax,下载个免费版的即可 安装完成后,双击打开: 第一步,创建远程连接的用户,用户默认为root,密码为远程服务器的密码 第二步,输入远程公网IP,选择刚刚创建的用…

[C][数据结构][排序][下][快速排序][归并排序]详细讲解

文章目录 1.快速排序1.基本思想2.hoare版本3.挖坑法4.前后指针版本5.非递归版本改写 2.归并排序 1.快速排序 1.基本思想 任取待排序元素序列的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右…

技术选型考察哪些方面

在进行技术选型时&#xff0c;需要考虑多个方面&#xff0c;确保所选择的技术能够满足项目的需求&#xff0c;并且在实施过程中具备可行性和可维护性。以下是一些主要考察方面&#xff1a; 1. 业务需求匹配 功能需求&#xff1a;技术能否满足当前及未来的功能需求。性能需求&…