SQL基础语句大全(建议收藏)
一、单表查询
1.1 基础查询
(1)查询所有列
SELECT * FROM employees;
SELECT * 表示选取表中所有字段,适用于快速查看全表数据。
(2)查询指定列
SELECT last_name, salary, email FROM employees;
通过明确列名筛选所需字段,减少数据传输量。
(3)去重查询(DISTINCT)
SELECT DISTINCT department_id FROM employees;
DISTINCT 用于消除重复记录,适用于统计唯一值场景。
(4)列别名
SELECT last_name AS 姓, first_name AS 名 FROM employees;
-- 或省略AS
SELECT last_name 姓, first_name 名 FROM employees;
别名提升结果可读性,常用于字段名复杂或需要重命名的情况。
1.2 数据过滤(WHERE子句)
(1)比较运算符
SELECT * FROM products WHERE price > 100; -- 大于
SELECT * FROM products WHERE price <= 50; -- 小于等于
SELECT * FROM customers WHERE age = 18; -- 等于
支持 >, <, =, !=, >=, <= 等运算符。
(2)逻辑运算符
-- AND:同时满足多个条件
SELECT * FROM orders WHERE total_price > 1000 AND status = 'paid';
-- OR:满足任一条件
SELECT * FROM employees WHERE department_id = 10 OR salary > 5000;
-- NOT:取反条件
SELECT * FROM products WHERE NOT category = 'Electronics';
(3)IN与BETWEEN
-- IN:匹配列表中的任意值
SELECT * FROM customers WHERE city IN ('北京', '上海', '广州');
-- BETWEEN:范围查询(闭区间)
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-03-31';
(4)模糊匹配(LIKE)
-- 匹配以“张”开头的姓名
SELECT * FROM employees WHERE last_name LIKE '张%';
-- 匹配包含“科技”的地址
SELECT * FROM customers WHERE address LIKE '%科技%';
通配符 % 表示任意字符,_ 表示单个字符。
(5)NULL值处理
-- 查询未填写邮箱的用户
SELECT * FROM users WHERE email IS NULL;
-- 查询已填写电话号码的用户
SELECT * FROM users WHERE phone IS NOT NULL;
需用 IS NULL 或 IS NOT NULL 判断空值。
二、聚合函数与分组统计
2.1 常用聚合函数
SELECT COUNT(*) AS total FROM orders; -- 统计行数
SELECT SUM(sales) AS total_sales FROM orders; -- 求和
SELECT AVG(salary) AS avg_salary FROM employees; -- 平均值
SELECT MAX(price) AS max_price FROM products; -- 最大值
SELECT MIN(price) AS min_price FROM products; -- 最小值
聚合函数用于对数据集进行统计计算。
2.2 分组统计(GROUP BY)
-- 按部门统计平均薪资
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
-- 按城市和性别分组统计用户数
SELECT city, gender, COUNT(*) AS user_count
FROM users
GROUP BY city, gender;
GROUP BY 需与非聚合字段结合使用,支持多字段分组。
2.3 分组后过滤(HAVING)
-- 筛选平均薪资超过5000的部门
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
HAVING 用于对分组后的结果进行条件过滤(类似WHERE,但作用于分组后)。
三、多表查询与表连接
3.1 内连接(INNER JOIN)
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;
仅返回两表中匹配的行,适用于需要精确关联的场景。
3.2 左连接(LEFT JOIN)
SELECT employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;
保留左表所有记录,右表无匹配时填充NULL。
3.3 右连接与全外连接
-- 右连接(RIGHT JOIN)
SELECT employees.last_name, departments.department_name
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.department_id;
-- 全外连接(FULL OUTER JOIN)
SELECT * FROM table1
FULL OUTER JOIN table2
ON table1.id = table2.id;
右连接保留右表全部数据,全外连接保留两表所有记录。
3.4 自连接
-- 查询员工及其经理的姓名
SELECT e1.employee_name, e2.employee_name AS manager_name
FROM employees e1
LEFT JOIN employees e2
ON e1.manager_id = e2.employee_id;
通过表别名实现同一表的关联查询。
四、子查询与联合查询
4.1 子查询
(1)WHERE子句中的子查询
-- 查询薪资高于平均薪资的员工
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
(2)FROM子句中的子查询
-- 统计每个部门的最高薪资
SELECT department_id, max_salary
FROM (SELECT department_id, MAX(salary) AS max_salary
FROM employees
GROUP BY department_id) AS dept_salary;
(3)EXISTS子查询
-- 查询有订单的客户
SELECT * FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
EXISTS 用于判断子查询是否返回结果。
4.2 联合查询(UNION)
-- 合并两个查询结果(自动去重)
SELECT city FROM customers
UNION
SELECT city FROM suppliers;
-- 保留重复记录(UNION ALL)
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;
UNION 要求列数和数据类型一致。
五、常用函数
5.1 字符串函数
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; -- 拼接
SELECT UPPER(name) FROM products; -- 转大写
SELECT SUBSTRING(address, 1, 3) FROM customers; -- 截取子串
SELECT LENGTH(description) FROM articles; -- 计算长度
5.2 数值函数
SELECT ROUND(price, 2) FROM products; -- 四舍五入保留两位小数
SELECT ABS(profit) FROM sales; -- 绝对值
SELECT CEIL(3.2); -- 向上取整(结果4)
SELECT FLOOR(3.7); -- 向下取整(结果3)
5.3 时间日期函数
SELECT NOW(); -- 当前日期时间
SELECT DATE_FORMAT(order_date, '%Y-%m') FROM orders; -- 格式化日期
SELECT DATEDIFF('2025-03-31', '2025-03-01'); -- 日期差值(30天)
SELECT DATE_ADD('2025-03-01', INTERVAL 7 DAY); -- 日期加减
六、基本操作语句
6.1 DDL(数据定义语言)
(1)数据库操作
CREATE DATABASE company; -- 创建数据库
DROP DATABASE company; -- 删除数据库
ALTER DATABASE company CHARACTER SET utf8; -- 修改字符集:ml-citation{ref="2,8" data="citationList"}
(2)表操作
-- 创建表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2)
);
-- 修改表结构
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
ALTER TABLE employees DROP COLUMN email;
6.2 DML(数据操作语言)
-- 插入数据
INSERT INTO employees (id, name, salary)
VALUES (1, '张三', 8000);
-- 更新数据
UPDATE employees SET salary = 9000 WHERE id = 1;
-- 删除数据
DELETE FROM employees WHERE salary < 5000;
七、总结
本文系统梳理了SQL基础语句,涵盖单表查询、多表关联、聚合统计、子查询等核心操作。建议结合实际业务场景练习,并收藏本文作为速查手册。后续可深入学习索引优化、事务控制等进阶内容。
技术不分好坏,合适的地方使用合适的技术;优雅的代码,清晰的逻辑,给你的每一个项目更好的归宿。
送给您的一封信:
尊敬的同仁,您好:
我是《Drools 规则引擎技术指南》的作者来志辉 。非常感谢大家对本书及相关技术的关注。为方便交流,特提供以下联系方式与交流群组:
-
微信号:Lai01102020
-
企鹅号:448998253
QQ讨论群:974369023 及 676219749,群文件中准备了丰富的开源文档与开源项目资源,供大家学习参考。在群内,大家不仅可以围绕 Drools 规则引擎技术展开深入探讨,还能发布招聘信息,进行其他技术领域的学习交流,期待您的加入,共同营造活跃的技术交流氛围 。
微信讨论群:因人数已达扫码进群上限,烦请添加我的个人微信,我会及时邀请您入群,一起在群里畅聊技术,分享经验 。
希望这些渠道能助力大家在技术学习与交流的道路上更进一步,期待与各位在群里相见!
微信公众号:程序猿之塞伯坦,欢迎大家阅览和点评
我的代表作:《Drools规则引擎技术指南》,请多多支持