select * from a left join b ON case when b.column like '%-%' THEN a.column1 = b.column ELSE a.column2 = b.column END
时间: 2024-04-10 08:29:00 浏览: 14
您的 SQL 查询语句是一个左连接(LEFT JOIN)操作,将表a和表b进行关联。关联条件使用了CASE语句,根据b.column列的值是否包含"-"来确定使用哪个列进行匹配。
如果b.column列的值包含"-",则使用a.column1列与b.column列进行匹配;否则,使用a.column2列与b.column列进行匹配。
该查询语句会返回表a和表b中根据关联条件匹配的所有行,包括a表中没有匹配到的行。
请注意,根据具体数据库的不同,语法可能会略有差异。上述查询语句是一种通用的写法,但在特定数据库中可能需要适当调整。
相关问题
使用达梦数据库运行上述sql
根据您的要求,我将使用达梦数据库来运行您提供的 SQL 查询语句。
在达梦数据库中,LEFT JOIN 和 CASE 语句的语法与标准 SQL 有些许差异。请参考以下的 SQL 查询语句,以达到您的目的:
```sql
SELECT *
FROM a
LEFT JOIN b ON (CASE WHEN b.column LIKE '%-%' THEN a.column1 ELSE a.column2 END) = b.column;
```
请注意,上述语句中的关联条件已经做了相应的调整,以适应达梦数据库的语法要求。您可以将该查询语句在达梦数据库中执行,以获取预期的结果。
如果您在具体环境中遇到问题,请查阅达梦数据库的文档或联系相关支持团队,以获取更准确的语法和支持信息。
1. 创建学生食堂饭卡管理数据库:CardDB 2.创建数据表:T_card、T_add_money、T_consume_money 3. 创建主外键约束,以及默认约束 期中默认约束,T_card表中,饭卡生成时间”2022-1-1” 4. 给每个表插入6条以上数据,使插入数据符合真实数据库逻辑 5. 完成以下查询条件 (1)查询所有“李”姓同学,最大的饭卡余额和最小饭卡余额 (2)查询在充值时间段“2022-1-2”到“2023-3-5”之间,饭卡充值金额由小到大进行排序 (3)要求在充值时间“2022-3-1”号到“2022-6-1”这三个月中,给每个学生的饭卡余额都统一增长10%,输出学生姓名,饭卡余额,充值时间 (4)要求当饭卡余额不足100元时,要求输出本次消费金额以后,饭卡还剩多少余额,且输出学生姓名,和饭卡最后余额 (5) 要求学号在(1001\1005\1003)三位同学中,所有的充值金额总和,本次消费金额综合。
以下是基于 MySQL 数据库的实现:
1. 创建学生食堂饭卡管理数据库:CardDB
```mysql
CREATE DATABASE CardDB;
USE CardDB;
```
2. 创建数据表:T_card、T_add_money、T_consume_money
```mysql
CREATE TABLE T_card (
s_id INT PRIMARY KEY,
s_name VARCHAR(20) NOT NULL,
s_gender CHAR(1) NOT NULL,
s_card_id CHAR(10) NOT NULL UNIQUE,
s_card_balance DECIMAL(10, 2) DEFAULT 0.00,
s_card_create_time DATE DEFAULT '2022-01-01'
);
CREATE TABLE T_add_money (
add_id INT PRIMARY KEY AUTO_INCREMENT,
s_id INT,
add_money DECIMAL(10, 2) NOT NULL,
add_time DATE NOT NULL,
FOREIGN KEY (s_id) REFERENCES T_card(s_id)
);
CREATE TABLE T_consume_money (
consume_id INT PRIMARY KEY AUTO_INCREMENT,
s_id INT,
consume_money DECIMAL(10, 2) NOT NULL,
consume_time DATE NOT NULL,
FOREIGN KEY (s_id) REFERENCES T_card(s_id)
);
```
3. 创建主外键约束,以及默认约束
```mysql
-- 创建主键约束
ALTER TABLE T_card ADD CONSTRAINT pk_s_id PRIMARY KEY (s_id);
-- 创建外键约束
ALTER TABLE T_add_money ADD CONSTRAINT fk_s_id FOREIGN KEY (s_id) REFERENCES T_card(s_id);
ALTER TABLE T_consume_money ADD CONSTRAINT fk_s_id FOREIGN KEY (s_id) REFERENCES T_card(s_id);
-- 创建默认约束
ALTER TABLE T_card ALTER COLUMN s_card_create_time SET DEFAULT '2022-01-01';
```
4. 给每个表插入6条以上数据,使插入数据符合真实数据库逻辑
```mysql
-- 插入数据到 T_card 表
INSERT INTO T_card (s_id, s_name, s_gender, s_card_id, s_card_balance) VALUES
(1001, '张三', '男', '1001', 50.00),
(1002, '李四', '女', '1002', 100.00),
(1003, '王五', '男', '1003', 200.00),
(1004, '赵六', '女', '1004', 150.00),
(1005, '孙七', '男', '1005', 80.00),
(1006, '周八', '女', '1006', 120.00);
-- 插入数据到 T_add_money 表
INSERT INTO T_add_money (s_id, add_money, add_time) VALUES
(1001, 20.00, '2022-01-05'),
(1002, 30.00, '2022-02-10'),
(1003, 50.00, '2022-02-15'),
(1004, 40.00, '2022-03-05'),
(1005, 10.00, '2022-03-20'),
(1006, 60.00, '2022-04-01');
-- 插入数据到 T_consume_money 表
INSERT INTO T_consume_money (s_id, consume_money, consume_time) VALUES
(1001, 10.00, '2022-01-06'),
(1002, 20.00, '2022-02-12'),
(1003, 30.00, '2022-02-18'),
(1004, 50.00, '2022-03-10'),
(1005, 15.00, '2022-03-22'),
(1006, 40.00, '2022-04-05');
```
5. 完成以下查询条件
(1)查询所有“李”姓同学,最大的饭卡余额和最小饭卡余额
```mysql
SELECT
s_name, MAX(s_card_balance) AS max_balance, MIN(s_card_balance) AS min_balance
FROM
T_card
WHERE
s_name LIKE '李%';
```
(2)查询在充值时间段“2022-1-2”到“2023-3-5”之间,饭卡充值金额由小到大进行排序
```mysql
SELECT
T_card.s_name, T_add_money.add_money, T_add_money.add_time
FROM
T_card
JOIN
T_add_money
ON
T_card.s_id = T_add_money.s_id
WHERE
T_add_money.add_time BETWEEN '2022-01-02' AND '2023-03-05'
ORDER BY
T_add_money.add_money ASC;
```
(3)要求在充值时间“2022-3-1”号到“2022-6-1”这三个月中,给每个学生的饭卡余额都统一增长10%,输出学生姓名,饭卡余额,充值时间
```mysql
UPDATE
T_card
SET
s_card_balance = s_card_balance * 1.1
WHERE
s_id IN (
SELECT
s_id
FROM
T_add_money
WHERE
add_time BETWEEN '2022-03-01' AND '2022-06-01'
);
SELECT
T_card.s_name, T_card.s_card_balance, T_add_money.add_time
FROM
T_card
JOIN
T_add_money
ON
T_card.s_id = T_add_money.s_id
WHERE
T_add_money.add_time BETWEEN '2022-03-01' AND '2022-06-01';
```
(4)要求当饭卡余额不足100元时,要求输出本次消费金额以后,饭卡还剩多少余额,且输出学生姓名,和饭卡最后余额
```mysql
SELECT
T_card.s_name,
CASE
WHEN T_card.s_card_balance - T_consume_money.consume_money >= 100.00 THEN T_consume_money.consume_money
ELSE T_card.s_card_balance - 100.00
END AS after_consume_balance
FROM
T_card
JOIN
T_consume_money
ON
T_card.s_id = T_consume_money.s_id;
```
(5)要求学号在(1001\1005\1003)三位同学中,所有的充值金额总和,本次消费金额综合。
```mysql
SELECT
T_card.s_id,
SUM(T_add_money.add_money) AS add_total,
SUM(T_consume_money.consume_money) AS consume_total
FROM
T_card
LEFT JOIN
T_add_money
ON
T_card.s_id = T_add_money.s_id
LEFT JOIN
T_consume_money
ON
T_card.s_id = T_consume_money.s_id
WHERE
T_card.s_id IN (1001, 1005, 1003)
GROUP BY
T_card.s_id;
```