数据库联表Sql语句(3个表)建一个新表(MySQL,Postgresql,SQL server)2
若要依据 SELECT USERS.ID,USERS.NAME,USERS.EMAIL,USERS.ID_CARD,USERS.V_CARD,USERS.ADDRESS,v_card.type,v_card.amount,id_card.province FROM USERS JOIN v_card on USERS.V_CARD=v_card.v_card JOIN id_card on USERS.ID_CARD=id_card.id_card
这个查询结果创建一个新表,不同数据库系统有不同的实现方式,下面为你分别介绍。
MySQL
在 MySQL 里,你可以运用 CREATE TABLE ... AS
语句按照查询结果来创建新表,示例如下:
CREATE TABLE combined_table AS
SELECT USERS.ID,
USERS.NAME,
USERS.EMAIL,
USERS.ID_CARD,
USERS.V_CARD,
USERS.ADDRESS,
v_card.type,
v_card.amount,
id_card.province
FROM USERS
JOIN v_card ON USERS.V_CARD = v_card.v_card
JOIN id_card ON USERS.ID_CARD = id_card.id_card;
这里的 combined_table
是新表的名称,CREATE TABLE ... AS
会把查询结果的列结构和数据复制到新表中。
PostgreSQL
PostgreSQL 同样支持 CREATE TABLE ... AS
语法,示例代码如下:
CREATE TABLE combined_table AS
SELECT USERS.ID,
USERS.NAME,
USERS.EMAIL,
USERS.ID_CARD,
USERS.V_CARD,
USERS.ADDRESS,
v_card.type,
v_card.amount,
id_card.province
FROM USERS
JOIN v_card ON USERS.V_CARD = v_card.v_card
JOIN id_card ON USERS.ID_CARD = id_card.id_card;
此代码中的 combined_table
是新表名,该语句会依据查询结果生成新表。
SQL Server
在 SQL Server 中,可使用 SELECT ... INTO
语句创建新表,示例如下:
SELECT USERS.ID,
USERS.NAME,
USERS.EMAIL,
USERS.ID_CARD,
USERS.V_CARD,
USERS.ADDRESS,
v_card.type,
v_card.amount,
id_card.province
INTO combined_table
FROM USERS
JOIN v_card ON USERS.V_CARD = v_card.v_card
JOIN id_card ON USERS.ID_CARD = id_card.id_card;
上述代码会把查询结果插入到新创建的 combined_table
中。
注意事项
- 新表的列名和数据类型会依据查询结果自动推断生成。
- 不同数据库系统对于表名、列名等的命名规则可能存在差异,要遵循对应数据库的规则。
- 上述代码中的
combined_table
可替换为你实际想要的表名。
各数据库建表语句
根据你之前查询语句中涉及的三个表 USERS
、v_card
和 id_card
,下面为你提供不同数据库系统下创建这三个表的 SQL 语句示例。
MySQL 建表语句
-- 创建 USERS 表
CREATE TABLE IF NOT EXISTS USERS (
ID INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
EMAIL VARCHAR(255) UNIQUE NOT NULL,
ID_CARD VARCHAR(18) UNIQUE NOT NULL,
V_CARD VARCHAR(50),
ADDRESS VARCHAR(255)
);
-- 创建 v_card 表
CREATE TABLE IF NOT EXISTS v_card (
v_card VARCHAR(50) PRIMARY KEY,
type VARCHAR(50),
amount DECIMAL(10, 2)
);
-- 创建 id_card 表
CREATE TABLE IF NOT EXISTS id_card (
id_card VARCHAR(18) PRIMARY KEY,
province VARCHAR(100)
);
PostgreSQL 建表语句
-- 创建 USERS 表
CREATE TABLE IF NOT EXISTS USERS (
ID SERIAL PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
EMAIL VARCHAR(255) UNIQUE NOT NULL,
ID_CARD VARCHAR(18) UNIQUE NOT NULL,
V_CARD VARCHAR(50),
ADDRESS VARCHAR(255)
);
-- 创建 v_card 表
CREATE TABLE IF NOT EXISTS v_card (
v_card VARCHAR(50) PRIMARY KEY,
type VARCHAR(50),
amount DECIMAL(10, 2)
);
-- 创建 id_card 表
CREATE TABLE IF NOT EXISTS id_card (
id_card VARCHAR(18) PRIMARY KEY,
province VARCHAR(100)
);
SQL Server 建表语句
-- 创建 USERS 表
CREATE TABLE USERS (
ID INT IDENTITY(1,1) PRIMARY KEY,
NAME NVARCHAR(255) NOT NULL,
EMAIL NVARCHAR(255) UNIQUE NOT NULL,
ID_CARD NVARCHAR(18) UNIQUE NOT NULL,
V_CARD NVARCHAR(50),
ADDRESS NVARCHAR(255)
);
-- 创建 v_card 表
CREATE TABLE v_card (
v_card NVARCHAR(50) PRIMARY KEY,
type NVARCHAR(50),
amount DECIMAL(10, 2)
);
-- 创建 id_card 表
CREATE TABLE id_card (
id_card NVARCHAR(18) PRIMARY KEY,
province NVARCHAR(100)
);
代码解释
USERS
表:ID
:在 MySQL 中是自增整数类型,PostgreSQL 用SERIAL
实现自增,SQL Server 用IDENTITY(1,1)
实现自增,作为主键唯一标识每个用户。NAME
:存储用户姓名,非空。EMAIL
:存储用户邮箱,要求唯一且非空。ID_CARD
:存储用户身份证号,唯一且非空。V_CARD
:用于关联v_card
表。ADDRESS
:存储用户地址。
v_card
表:v_card
:作为主键,唯一标识每张虚拟卡。type
:存储虚拟卡类型。amount
:存储虚拟卡金额,精确到小数点后两位。
id_card
表:id_card
:作为主键,对应USERS
表中的身份证号。province
:存储身份证对应的省份信息。
你可以根据实际使用的数据库系统选择相应的建表语句。