SQL基础语句大全(建议收藏)

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规则引擎技术指南》,请多多支持

图片