SELECT * FROM (
SELECT 'OrangeDBM' as AUTHOR,department, name, salary,
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
) t
WHERE rn <= 2;
示例:日环比销售额
SELECT 'OrangeDBM' as AUTHOR,date, sales, LAG(sales) OVER (ORDER BY date) AS prev_day_sales
FROM sales;
示例:将当前日期与下一日期进行比较
SELECT 'OrangeDBM' as AUTHOR,date, sales, LEAD(sales) OVER (ORDER BY date) AS next_day_sales
FROM sales;
计算每日环比增长率
SELECT 'OrangeDBM' as AUTHOR,date, sales - LAG(sales) OVER (ORDER BY date) AS growth
FROM sales;
-- 查找年龄大于 18 的学生,按年龄降序排列 SELECTDISTINCT name, age FROM students WHERE age >18 ORDERBY age DESC LIMIT5;
-- 计算平均年龄 SELECT AVG(age) FROM students;
-- 合并姓名与固定字符串 SELECT CONCAT('学生姓名: ', name) AS student_info FROM students;
-- 查询学生及其选修的课程名 SELECT students.name, courses.course_name FROM students INNERJOIN enrollments ON students.id = enrollments.student_id INNERJOIN courses ON enrollments.course_id = courses.id;
-- 查找成绩高于平均分的学生 ID SELECT student_id FROM grades WHERE score > (SELECT AVG(score) FROM grades);
WITH RankedOrders AS ( SELECT*, ROW_NUMBER() OVER ( PARTITION BY customer_id, product ORDERBY id ASC ) as rn FROM orders ) DELETEFROM orders WHERE id IN ( SELECT id FROM RankedOrders WHERE rn >1 );
SELECT
Product_Name AS Name, -- ALIAS
SUM(Amount) AS Total_Sales -- FUNCTIONS (SUM)FROM Sales
WHERE Region IN ('North', 'East') -- WHERE & INGROUPBY Product_Name -- GROUP BYHAVING SUM(Amount) > 1000-- HAVINGORDERBY Total_Sales DESC; -- ORDER BY & DESC
-- Table structure for products -- ---------------------------- DROP TABLE IF EXISTS `products`; CREATE TABLE `products` ( `id` int(0) NULL DEFAULT NULL, `productname` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `category` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `price` int(0) NULL DEFAULT NULL, `stock_qty` int(0) NULL DEFAULT NULL, `supplier_id` int(0) NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of products -- ---------------------------- INSERT INTO `products` VALUES (1, 'Laptop', 'Electronics', 75000, 15, 101); INSERT INTO `products` VALUES (2, 'Mouse', 'Electronics', 1500, 50, 102); INSERT INTO `products` VALUES (3, 'Chair', 'Furniture', 8000, 25, 103); INSERT INTO `products` VALUES (4, 'Keyboard', 'Electronics', 2500, 30, 102); INSERT INTO `products` VALUES (5, 'Desk', 'Furniture ', 15000, 10, 103); INSERT INTO `products` VALUES (6, 'Monitor', 'Electronics', 25000, 20, 101); INSERT INTO `products` VALUES (7, 'Table', 'Furniture', 5000, 40, 104); INSERT INTO `products` VALUES (8, 'Webcam', 'Electronics', 3000, 35, 102);
SET FOREIGN_KEY_CHECKS = 1;
按供应商统计产品总数
SELECT 'OrangeDBM' as AUTHOR, supplier_id, COUNT(*) AS product_count FROM products GROUP BY supplier_id;
查找包含超过 2 个产品的类别
SELECT 'OrangeDBM' as AUTHOR, category, COUNT(*) AS total_products FROM products GROUP BY category HAVING COUNT(*) > 2;
查找整体第二高的价格
SELECT 'OrangeDBM' as AUTHOR, MAX(price) FROM products WHERE price < (SELECT MAX(price) FROM products);
查找最昂贵的电子产品
SELECT 'OrangeDBM' as AUTHOR, productname, price FROM products WHERE category = 'Electronics' AND price = (SELECT MAX(price) FROM products WHERE category = 'Electronics');
-- ---------------------------- -- Table structure for employees -- ---------------------------- DROP TABLE IF EXISTS `employees`; CREATE TABLE `employees` ( `id` int(0) NULL DEFAULT NULL, `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `department` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `salary` int(0) NULL DEFAULT NULL, `manager_id` int(0) NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_bin ROW_FORMAT = Dynamic;
-- ---------------------------- -- Records of employees -- ---------------------------- INSERT INTO `employees` VALUES (1, 'Aditi', 'HR', 30000, 5); INSERT INTO `employees` VALUES (2, 'Rahul', 'IT', 50000, 6); INSERT INTO `employees` VALUES (3, 'Neha', 'IT', 60000, 6); INSERT INTO `employees` VALUES (4, 'Aman', 'Sales', 40000, 7); INSERT INTO `employees` VALUES (5, 'Kiran', 'HR', 70000, 0); INSERT INTO `employees` VALUES (6, 'Mohit', 'IT', 80000, 0); INSERT INTO `employees` VALUES (7, 'Suresh', 'Sales', 65000, 0); INSERT INTO `employees` VALUES (8, 'Pooja', 'HR', 30000, 5);
DROP TABLE IF EXISTS `customers`; CREATE TABLE `customers` ( `customer_id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NOT NULL, `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, PRIMARY KEY (`customer_id`) USING BTREE, UNIQUE INDEX `email`(`email`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_bin ROW_FORMAT = Dynamic;
-- ---------------------------- -- Records of customers -- ---------------------------- INSERT INTO `customers` VALUES (1, 'John Doe', 'john@example.com', '1234567890'); INSERT INTO `customers` VALUES (2, 'Jane Smith', 'jane@example.com', '0987654321'); INSERT INTO `customers` VALUES (5, 'Blau Hoss', 'Blau@example.com', '11111111');
DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `id` int(0) NULL DEFAULT NULL, `customer_id` int(0) NULL DEFAULT NULL, `product` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NULL DEFAULT NULL, `order_date` datetime(0) NULL DEFAULT NULL ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_bin ROW_FORMAT = Dynamic;
-- ---------------------------- -- Records of orders -- ---------------------------- INSERT INTO `orders` VALUES (1, 101, 'Laptop', '2026-01-15 00:00:00'); INSERT INTO `orders` VALUES (3, 102, 'Phone', '2026-01-16 00:00:00'); INSERT INTO `orders` VALUES (4, 101, 'Tablet', '2026-01-17 00:00:00');
SET FOREIGN_KEY_CHECKS = 1;
问题描述:从 employees 表中查找第二高的薪资。
解决方案
SELECT MAX(salary) FROM employees WHERE salary < ( SELECT MAX(salary) FROM employees );
问题描述:编写一条查询语句,查找第 3 高的薪水。
解决方案
SELECT salary FROM ( SELECT salary, DENSE_RANK() OVER(ORDER BY salary DESC) r FROM employees ) t WHERE r = 3;
问题描述:找出 employees 表中所有重复的姓名。
解决方案
SELECT name, COUNT() FROM employees GROUP BY name HAVING COUNT() > 1;
问题描述:找出未下过任何订单的客户。
解决方案
SELECT c.name FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id WHERE o.customer_id IS NULL;
问题描述:找出每个部门中薪资最高的3名员工。
解决方案
SELECT * FROM ( SELECT name, department, salary, ROW_NUMBER() OVER( PARTITION BY department ORDER BY salary DESC ) r FROM employees ) t WHERE r <= 3;