引言SQLStructured Query Language结构化查询语言是与关系型数据库交互的核心工具。无论是数据分析师、后端开发工程师还是产品经理掌握 SQL 的核心技能都至关重要。本文将系统性地介绍 SQL 中最常用、最核心的技能并通过清晰的示例帮助你快速上手和巩固。1. 数据查询基础SELECT 与 FROMSELECT和FROM是 SQL 的基石用于从表中检索数据。核心语法SELECT列名1,列名2,...FROM表名;示例假设我们有一个employees表员工表包含id,name,department,salary等列。-- 查询所有员工的所有信息SELECT*FROMemployees;-- 查询所有员工的姓名和部门SELECTname,departmentFROMemployees;2. 数据过滤WHERE 子句WHERE子句用于根据指定条件过滤记录。核心语法SELECT列名FROM表名WHERE条件;常用运算符等于比较或!不等于BETWEEN ... AND ...在某个范围内LIKE模糊匹配%匹配任意字符_匹配单个字符IN (...)在列表中IS NULL是空值示例-- 查询销售部门的所有员工SELECT*FROMemployeesWHEREdepartmentSales;-- 查询薪资大于 50000 的员工姓名SELECTnameFROMemployeesWHEREsalary50000;-- 查询姓名以 ‘张’ 开头的员工SELECT*FROMemployeesWHEREnameLIKE张%;-- 查询部门为 ‘Sales’ 或 ‘Marketing’ 的员工SELECT*FROMemployeesWHEREdepartmentIN(Sales,Marketing);3. 数据排序ORDER BY 子句ORDER BY子句用于对结果集进行排序默认升序ASC降序使用DESC。核心语法SELECT列名FROM表名ORDERBY列名1[ASC|DESC],列名2[ASC|DESC];示例-- 按薪资从高到低排序所有员工SELECTname,salaryFROMemployeesORDERBYsalaryDESC;-- 先按部门升序排列同部门内按薪资降序排列SELECTname,department,salaryFROMemployeesORDERBYdepartmentASC,salaryDESC;4. 数据聚合与分组GROUP BY 与聚合函数聚合函数对一组值执行计算并返回单个值。GROUP BY子句将结果集按一列或多列分组常与聚合函数一起使用。常用聚合函数COUNT()计数SUM()求和AVG()求平均值MAX()求最大值MIN()求最小值核心语法SELECT聚合函数(列名),分组列FROM表名GROUPBY分组列;示例-- 统计每个部门的员工数量SELECTdepartment,COUNT(*)asemployee_countFROMemployeesGROUPBYdepartment;-- 计算每个部门的平均薪资和最高薪资SELECTdepartment,AVG(salary)asavg_salary,MAX(salary)asmax_salaryFROMemployeesGROUPBYdepartment;5. 分组后过滤HAVING 子句WHERE子句在分组前过滤行而HAVING子句在分组后过滤分组结果。核心语法SELECT聚合函数(列名),分组列FROM表名GROUPBY分组列HAVING分组后条件;示例-- 查询员工数量超过 5 人的部门SELECTdepartment,COUNT(*)asemployee_countFROMemployeesGROUPBYdepartmentHAVINGCOUNT(*)5;-- 查询平均薪资超过 60000 的部门SELECTdepartment,AVG(salary)asavg_salaryFROMemployeesGROUPBYdepartmentHAVINGAVG(salary)60000;6. 数据连接JOINJOIN用于根据两个或多个表之间的相关列合并行。这是处理关系型数据的核心技能。常用 JOIN 类型INNER JOIN返回两个表中匹配的行。LEFT (OUTER) JOIN返回左表的所有行以及右表中匹配的行。不匹配的右表部分为 NULL。RIGHT (OUTER) JOIN返回右表的所有行以及左表中匹配的行。不匹配的左表部分为 NULL。FULL (OUTER) JOIN返回两个表中所有的行不匹配的部分为 NULL。核心语法SELECT列名FROM表AJOIN表BON表A.关联列表B.关联列;示例假设我们还有一个orders表订单表包含order_id,employee_id,amount等列通过employee_id与employees表关联。-- 查询所有员工及其订单信息内连接只显示有订单的员工SELECTe.name,e.department,o.order_id,o.amountFROMemployees eINNERJOINorders oONe.ido.employee_id;-- 查询所有员工以及他们的订单信息左连接即使员工没有订单也会显示SELECTe.name,e.department,o.order_id,o.amountFROMemployees eLEFTJOINorders oONe.ido.employee_id;7. 子查询子查询是嵌套在其他 SQL 查询中的查询。它可以出现在SELECT、FROM、WHERE或HAVING子句中。示例-- 在 WHERE 子句中使用子查询查询薪资高于平均薪资的员工SELECTname,salaryFROMemployeesWHEREsalary(SELECTAVG(salary)FROMemployees);-- 在 FROM 子句中使用子查询派生表SELECTdept_stats.department,dept_stats.avg_salFROM(SELECTdepartment,AVG(salary)asavg_salFROMemployeesGROUPBYdepartment)ASdept_statsWHEREdept_stats.avg_sal50000;8. 数据操作INSERT, UPDATE, DELETE除了查询SQL 也用于操作数据。INSERT插入数据-- 插入一行完整数据INSERTINTOemployees(id,name,department,salary)VALUES(101,张三,Engineering,75000);-- 插入多行数据INSERTINTOemployees(id,name,department,salary)VALUES(102,李四,Sales,60000),(103,王五,Marketing,55000);UPDATE更新数据-- 将员工 ‘张三’ 的部门更新为 ‘Management’UPDATEemployeesSETdepartmentManagementWHEREname张三;-- 为所有销售部门的员工加薪 10%UPDATEemployeesSETsalarysalary*1.10WHEREdepartmentSales;DELETE删除数据-- 删除 id 为 101 的员工DELETEFROMemployeesWHEREid101;-- 删除所有薪资低于 30000 的员工谨慎使用DELETEFROMemployeesWHEREsalary30000;9. 数据定义CREATE TABLE, ALTER TABLE, DROP TABLE这些语句用于定义和修改数据库结构。CREATE TABLE创建表CREATETABLEemployees(idINTPRIMARYKEY,nameVARCHAR(100)NOTNULL,departmentVARCHAR(50),salaryDECIMAL(10,2),hire_dateDATEDEFAULTCURRENT_DATE);ALTER TABLE修改表结构-- 添加一个新列ALTERTABLEemployeesADDCOLUMNemailVARCHAR(255);-- 修改列的数据类型ALTERTABLEemployeesALTERCOLUMNsalaryTYPEDECIMAL(12,2);-- 删除一个列ALTERTABLEemployeesDROPCOLUMNemail;DROP TABLE删除表-- 删除表极其危险会丢失所有数据DROPTABLEemployees;总结掌握以上 SQL 技能你就能应对日常工作中 80% 以上的数据库操作需求。核心路径是查询SELECT - 过滤WHERE - 排序ORDER BY - 聚合分组GROUP BY/HAVING - 连接JOIN。数据操作增删改和表结构操作DDL则用于维护数据本身。建议在本地安装 MySQL、PostgreSQL 或使用在线 SQL 练习平台结合本文的示例进行实操是掌握 SQL 最快的方式。