中文显示姓名列和手机号
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_count
FROM 5_详情id
GROUP 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_id
FROM (
SELECT user_id, SUM(price * quantity) AS total_amount
FROM 4_订单id o
JOIN 5_详情id d ON o.order_id = d.order_id
GROUP BY user_id
) AS subquery
ORDER BY total_amount DESC
LIMIT 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
)
BEGIN
DECLARE 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_stock
FROM product
WHERE product_id = in_product_id;
-- 检查库存是否足够
IF product_stock < in_quantity THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不足';
END IF;
-- 获取用户余额(这里假设用户只有一个账户)
SELECT balance INTO user_balance
FROM 8_账户表
WHERE user_id = in_user_id;
-- 检查余额是否足够
IF user_balance < (product_price * in_quantity) THEN
SIGNAL 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 product
WHERE product_id = in_product_id;
-- 更新商品库存
UPDATE product
SET stock = stock - in_quantity
WHERE 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;