中文显示姓名列和手机号
SELECT contact_name AS '姓名', contact_phone AS '手机号' FROM 2_公司id;
使用explain测试给出的查询语句,显示走了索引查询
EXPLAIN SELECT * FROM `7_订单数量` WHERE `countid` LIKE 'e%';
统计用户订单信息,查询所有用户的下单数量,并进行倒序排序。使用聚合函数查询所有用户的订单数量,倒序拍列结果
SELECT user_id ,sum(count_id) as '订单数量' from `4_订单id`
GROUP BY user_id
ORDER BY sum(count_id) DESC;
显示用户信息,显示用户钱包信息,进行多表联合查询
SELECT 1_用户id.username, 1_用户id.name, 8_账户表.balance,1_用户id.password,1_用户id.email,1_用户id.gender
FROM 1_用户id
JOIN 8_账户表 ON 1_用户id.user_id = 8_账户表.user_id;
查看订单中下单最多的产品对应的类别正确使用聚合函数,正确使用子查询
SELECT product_name
FROM (SELECT product_name, COUNT(*) AS order_countFROM 5_详情idGROUP BY product_name
) AS subquery
ORDER BY order_count DESC
LIMIT 1;
查询下单总金额最多的用户,并查询用户的全部信息与当前钱包余额。正确使用聚合函数,正确使用子查询,正确进行多表联合查询
SELECT u.*, a.balance
FROM 1_用户id u
JOIN 8_账户表 a ON u.user_id = a.user_id
WHERE u.user_id = (SELECT user_idFROM (SELECT user_id, SUM(price * quantity) AS total_amountFROM 4_订单id oJOIN 5_详情id d ON o.order_id = d.order_idGROUP BY user_id) AS subqueryORDER BY total_amount DESCLIMIT 1
);
5、存储过程创建
1、添加一个用户下订单的存储过程,存储过程名称叫做【create_order_infos()】
2、要求传入创建订单所必须的参数内容,例如:用户编号、商品编号、购买数量等信息。
3、需要根据传入的信息插入【用户钱包交易日志表】、【订单表】、【订单详情表】信息,修改【用户钱包表】、【商品表】。
因为没有product表需先创建
CREATE TABLE `product` (`product_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',`product_name` varchar(100) NOT NULL COMMENT '商品名称',`price` decimal(10,2) NOT NULL COMMENT '价格',`stock` int(11) NOT NULL COMMENT '库存',PRIMARY KEY (`product_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;INSERT INTO `product` VALUES (1, '手机', 5999.00, 10);
INSERT INTO `product` VALUES (2, '耳机', 299.00, 20);
然后完成存储过程
DELIMITER //
CREATE PROCEDURE create_order_infos(IN in_user_id INT,IN in_product_id INT,IN in_quantity INT
)
BEGINDECLARE product_price DECIMAL(10,2);DECLARE product_stock INT;DECLARE user_balance DECIMAL(10,2);DECLARE order_number VARCHAR(50);DECLARE order_id INT;DECLARE detail_id INT;-- 获取商品价格和库存SELECT price, stock INTO product_price, product_stockFROM productWHERE product_id = in_product_id;-- 检查库存是否足够IF product_stock < in_quantity THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不足';END IF;-- 获取用户余额(这里假设用户只有一个账户)SELECT balance INTO user_balanceFROM 8_账户表WHERE user_id = in_user_id;-- 检查余额是否足够IF user_balance < (product_price * in_quantity) THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '余额不足';END IF;-- 生成订单编号(这里简化为拼接当前时间)SET order_number = CONCAT('ORD', DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'));-- 插入订单表INSERT INTO 4_订单id (user_id, company_id, order_number, order_date, status_id, count_id)VALUES (in_user_id, 1, order_number, CURDATE(), 1, in_quantity); -- 假设默认公司ID为1,状态为待发货SET order_id = LAST_INSERT_ID(); -- 获取最新插入的订单ID-- 插入订单详情表INSERT INTO 5_详情id (order_id, product_name, quantity, price, category)SELECT order_id, product_name, in_quantity, product_price, '电子产品' -- 假设所有商品都是电子产品FROM productWHERE product_id = in_product_id;-- 更新商品库存UPDATE productSET stock = stock - in_quantityWHERE product_id = in_product_id;-- 更新用户余额(这里简化处理,不记录交易日志)UPDATE 8_账户表SET balance = balance - (product_price * in_quantity)WHERE user_id = in_user_id;-- 返回订单ID(这里通过SELECT返回,而不是OUT参数)SELECT order_id;
END //
DELIMITER ;
测试语句
-- 有一个用户id为5,二号商品,购买数量为1的商品
set @user_id=5;
set @product_id=2;
set @in_quantity=1;
set @order_id=NULL;
CALL create_order_infos(@user_id,@product_id,@in_quantity);
select @order_id;
-- 有一个用户id为1,一号商品,购买数量为1的商品
set @user_id=1;
set @product_id=1;
set @in_quantity=1;
set @order_id=NULL;
CALL create_order_infos(@user_id,@product_id,@in_quantity);
select @order_id;