【数据库差异研究】别名与表字段冲突,不同数据库在where中的处理行为

news/2024/12/21 20:15:57/

目录

⚛️总结

☪️1 问题描述

☪️2 测试用例

♋2.1 测试单层查询

♏2.1.1 SQLITE数据库

♐2.1.2 ORACLE数据库

♑2.1.3 PG数据库

♋2.2 测试嵌套查询

♉2.2.1 SQLITE数据库

♈2.2.2 ORACLE数据库

🔯2.2.3 PG数据库


⚛️总结

单层查询

数据库类型别名与表字段重名冲突处理方式
SQLITEWHERE 子句中使用表字段而非别名
ORACLEWHERE 子句中使用表字段而非别名
PGWHERE 子句中使用表字段而非别名

嵌套查询

查询类型子查询内层 where 冲突处理外层 where 冲突处理
SQLITE有别名使用表字段使用子查询中的表字段
SQLITE无别名使用表字段使用子查询中的表字段
ORACLE有别名使用表字段使用子查询中的表字段
ORACLE无别名使用表字段使用子查询中的表字段
PG有别名使用表字段使用子查询中的表字段
PG无别名PG报错PG报错

☪️1 问题描述

一、当单层查询发生别名与表字段重名冲突时,不同数据库在where中的处理行为是怎样的呢?

这里的处理行为无非两种

  • where 处理的是表字段而非别名。
  • where 处理的是别名而非表字段。

说明:对于表字段与别名重名冲突, where 有时处理的是表字段而非别名,有时处理的是别名而非表字段。显然这种数据库设计是存在问题的,本文不予考虑。


二、当嵌套查询发生别名与表字段重名冲突时,不同数据库在where中的处理行为是怎样的呢?

详见后文。


☪️2 测试用例

本文设计的测试表与数据如下:

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');

u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

使用 LEFT JION 查询语句如下:

-- LEFT JION 之后的表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

LEFT JION 之后的表——后续称之为 查询表

client_iduser_token
2211111111
10002100021

对于 查询表 的表字段 user_token(别名) u_client 的表字段 user_token(表字段) 发生了重名冲突。


2.1 测试单层查询

在测试用例基础上,设计的测试用例与预期行为如下:

测试场景一:

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111';
  • 结果如下,说明在单层查询中,当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。
    client_iduser_token
    2211111111
  • 结果如下,说明在单层查询中,当别名和表字段发生重名冲突时,在 where 中使用的是别名而非表字段。
    client_iduser_token

 测试场景二(二次验证):

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '211111111';
  • 结果如下,说明在单层查询中,当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。
    client_iduser_token
  • 结果如下,说明在单层查询中,当别名和表字段发生重名冲突时,在 where 中使用的是别名而非表字段。
    client_iduser_token
    2211111111

♏2.1.1 SQLITE数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景一:

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。


 测试场景二(二次验证):

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '211111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。

结论

单层查询:当别名和表字段发生重名冲突时,SQLITE 在 where 中使用的是表字段而非别名。


♐2.1.2 ORACLE数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景一:

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。


 测试场景二(二次验证):

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '211111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。

结论

单层查询:当别名和表字段发生重名冲突时,ORACLE 在 where 中使用的是表字段而非别名。


♑2.1.3 PG数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景一:

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。


 测试场景二(二次验证):

SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '211111111';

结论:说明当别名和表字段发生重名冲突时,在 where 中使用的是表字段而非别名。

结论

单层查询:当别名和表字段发生重名冲突时,PG 在 where 中使用的是表字段而非别名。


2.2 测试嵌套查询

根据3.1 章节可知:单层查询

数据库类型别名与表字段重名冲突处理方式
SQLITEWHERE 子句中使用表字段而非别名
ORACLEWHERE 子句中使用表字段而非别名
PGWHERE 子句中使用表字段而非别名

在测试用例基础上,设计的测试用例与预期行为如下:

测试场景三(嵌套查询——含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111') t
WHERE t.user_token = '211111111';
  • 结果如下,说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是实际的表字段。
    client_iduser_token
  • 结果如下,说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。
    client_iduser_token
    2211111111

  测试场景四(嵌套查询——不含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111')
WHERE user_token = '211111111';
  • 结果如下,说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是实际的表字段。
    client_iduser_token
  • 结果如下,说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。
     
    client_iduser_token
    2211111111

♉2.2.1 SQLITE数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景三(嵌套查询——含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111') t
WHERE t.user_token = '211111111';

 结论:说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。


  测试场景四(嵌套查询——不含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111')
WHERE user_token = '211111111';

 结论:说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。

结论

嵌套查询: 说明在嵌套查询中子查询有或没有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询中的表字段。


♈2.2.2 ORACLE数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景三(嵌套查询——含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111') t
WHERE t.user_token = '211111111';

结论:说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。


  测试场景四(嵌套查询——不含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111')
WHERE user_token = '211111111';

 

 结论:说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。

结论

嵌套查询: 说明在嵌套查询中子查询有或没有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询中的表字段。


🔯2.2.3 PG数据库

基础数据——满足测试表与数据

-- 创建表 u_client
CREATE TABLE u_client (client_id VARCHAR(20) PRIMARY KEY,Name VARCHAR(50),personalID VARCHAR(20),address VARCHAR(100),user_token VARCHAR(20),Email VARCHAR(50),mobile_tel VARCHAR(20)
);-- 插入数据到 u_client 表
INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('2', 'test', '20240702', 'hangzhou', '11111111', '306891687@163.com', '13345671234');INSERT INTO u_client(client_id, Name, personalID, address, user_token, Email, mobile_tel)
VALUES('10002', 'test', '20240702', 'hangzhou', '1', '306891687@163.com', '13345671234');-- 创建表 u_fund_account
CREATE TABLE u_fund_account (password VARCHAR(50),client_id VARCHAR(20),fund_account VARCHAR(50),PRIMARY KEY(client_id, fund_account)
);-- 插入数据到 u_fund_account 表
INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD1', '2', 'account1');INSERT INTO u_fund_account(password, client_id, fund_account)
VALUES('PWD2', '10002', 'account2');-- 查询表
select * from u_client;
select * from u_fund_account;-- 查询表
SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id;

表u_client

client_idNamepersonalIDaddressuser_tokenEmailmobile_tel
2test20240702hangzhou11111111306891687@163.com13345671234
10002test20240702hangzhou1306891687@163.com13345671234

u_fund_account

passwordclient_idfund_account
PWD12account1
PWD210002account2

查询表

client_iduser_token
2211111111
10002100021

别名冲突查询结果

测试场景三(嵌套查询——含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111') t
WHERE t.user_token = '211111111';

 结论:说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。


  测试场景四(嵌套查询——不含子查询别名):

SELECT * FROM
(SELECTa.client_id AS client_id,b.client_id || a.user_token AS user_token
FROM u_client a LEFT JOIN u_fund_account b 
ON a.client_id = b.client_id
WHERE user_token = '11111111')
WHERE user_token = '211111111';

结论:PG报错。

对于高斯数据库

结论:说明在嵌套查询中子查询有别名,高斯数据库在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。

结论

嵌套查询:

  • 说明在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。
  • 说明在嵌套查询中子查询无别名,PG报错,但对于高斯数据库
    在嵌套查询中子查询有别名,在内层查询的别名和表字段发生重名冲突时,内层 where 中使用的是表字段而非别名;外层 where 中使用的是子查询结果中的表字段。


http://www.ppmy.cn/news/1534409.html

相关文章

Codeforces Round 121 (Div. 1) C题 Fools and Roads(LCA最近公共祖先,树上差分)

题目链接 https://codeforces.com/problemset/problem/191/C 思路 一道比较板的LCA和树上差分的题。 先预处理出这棵树的LCA,之后对于每一对 a i , b i a_{i},b_{i} ai​,bi​,在树上做差分,最后用 d f s dfs dfs处理差分数组即可。 树上…

“衣依”服装销售平台:Spring Boot技术架构剖析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…

VS Code 图形化合并工具

VS Code 图形化合并工具能够帮助你更直观地进行代码合并和解决冲突 1. VS Code 内置的 Git 合并工具 VS Code 自带的 Git 支持已经非常强大,能够在合并冲突时提供直观的图形化界面,帮助你轻松解决冲突。以下是使用内置功能的步骤: 步骤一&…

中安未来 OCR—— 开启高效驾驶证识别新时代

在数字化飞速发展的今天,光学字符识别(OCR)技术正逐渐成为各行业提高效率、降低成本的重要工具。而中安未来的 OCR 技术,以其卓越的性能和广泛的应用场景,在众多 OCR 解决方案中脱颖而出。其中,驾驶证识别功…

基于大数据技术的足球数据分析与可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

yolov8/9/11模型在中医舌苔分类中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、11模型在中医舌苔分类中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这种人工诊…

事后被动处置向事前主动预警转变的智慧工业开源了

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

用责任链模式改造 if else

我的上一篇文章,因为if else 多了,捣鼓很久,今天用责任链模式改造一下。 代码写着写着,if else if 逻辑忘记了,哎。。。-CSDN博客 责任链模式(Chain of Responsibility Pattern) 1. 什么是责任…