SELECT语句基础知识
SELECT是SQL语言中最基础且重要的查询语句,用于从数据库中检索数据。每个SELECT查询都包含两个关键部分:SELECT子句指定要返回的列,FROM子句指定要查询的表。例如,SELECT FROM employees; 这条简单语句将从employees表中返回所有记录的所有列。星号()是通配符,表示所有列。
选择特定列
实际应用中,我们通常不需要返回所有列,而是指定需要的特定列。例如:SELECT first_name, last_name, department FROM employees; 这条语句只返回员工的名字、姓氏和部门信息,提高了查询效率并减少了不必要的数据传输。
使用别名
为了提高结果的可读性,可以使用AS关键字为列或表分配临时别名。例如:SELECT first_name AS 名, last_name AS 姓 FROM employees; 这将使输出结果的列标题显示为名和姓,而不是原始的英文字段名。
过滤数据:WHERE子句
WHERE子句用于筛选满足特定条件的记录。它可以与各种运算符配合使用,包括比较运算符(=, <, >, <=, >=, <>)和逻辑运算符(AND, OR, NOT)。
基本条件筛选
例如,要查找部门为销售的所有员工:SELECT FROM employees WHERE department = '销售'; 这里使用等号进行精确匹配查询。
复杂条件组合
可以使用多个条件进行更精确的筛选:SELECT FROM employees WHERE department = '销售' AND salary > 5000; 这条语句将返回销售部门中工资高于5000的员工记录。
模糊查询:LIKE操作符
当需要进行模式匹配而非精确匹配时,可以使用LIKE操作符配合通配符:%(匹配任意字符序列)和_(匹配单个字符)。例如:SELECT FROM employees WHERE last_name LIKE '张%'; 这将返回所有姓氏以张开头的员工。
排序结果:ORDER BY子句
ORDER BY子句允许我们对查询结果按一个或多个列进行排序。默认情况下按升序排列(ASC),也可以指定降序排列(DESC)。
单列排序
例如:SELECT first_name, last_name, salary FROM employees ORDER BY salary DESC; 这将按工资从高到低显示员工信息。
多列排序
可以指定多个排序条件:SELECT first_name, last_name, department, salary FROM employees ORDER BY department ASC, salary DESC; 这将先按部门升序排列,同一部门内再按工资降序排列。
聚合函数与分组
聚合函数对一组值执行计算并返回单个值,常与GROUP BY子句一起使用来分析数据。
常用聚合函数
常用的聚合函数包括:COUNT()(计数)、SUM()(求和)、AVG()(平均值)、MAX()(最大值)和MIN()(最小值)。例如:SELECT COUNT() FROM employees; 返回员工总数。
数据分组
GROUP BY子句将数据分成多个组,然后对每个组应用聚合函数。例如:SELECT department, AVG(salary) FROM employees GROUP BY department; 计算每个部门的平均工资。
分组后筛选:HAVING子句
HAVING子句用于对分组后的结果进行筛选,类似于WHERE但针对分组。例如:SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 6000; 只显示平均工资高于6000的部门。
多表查询:JOIN操作
在实际数据库中,数据通常分布在多个表中,JOIN操作允许我们将这些表连接起来进行查询。
INNER JOIN
内连接返回两个表中匹配的行:SELECT e.first_name, e.last_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id;
LEFT JOIN
左连接返回左表的所有行,即使右表中没有匹配:SELECT e.first_name, e.last_name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.id;
其他JOIN类型
除了内连接和左连接,还有RIGHT JOIN(右连接)、FULL OUTER JOIN(全外连接)和CROSS JOIN(交叉连接),每种连接类型都有其特定用途。
子查询与高级特性
子查询是嵌套在另一个查询中的查询,可用于更复杂的数据检索 scenarios。
标量子查询
返回单个值的子查询:SELECT first_name, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); 找出工资高于平均工资的员工。
关联子查询
子查询引用外部查询的列:SELECT department, first_name, last_name, salary FROM employees e1 WHERE salary = (SELECT MAX(salary) FROM employees e2 WHERE e2.department = e1.department); 找出每个部门工资最高的员工。
通用表表达式(CTE)
CTE提供了一种更清晰的方式编写复杂查询:WITH dept_avg AS (SELECT department, AVG(salary) avg_sal FROM employees GROUP BY department) SELECT FROM dept_avg WHERE avg_sal > 6000;
性能优化技巧
随着数据量增长,查询性能变得至关重要。
索引的使用
为经常用于WHERE、JOIN和ORDER BY的列创建索引,可以显著提高查询速度,但会增加插入和更新操作的开销。
避免SELECT
只选择需要的列而不是使用SELECT ,减少数据传输量和内存使用。
合理使用EXPLAIN
使用EXPLAIN命令分析查询执行计划,识别性能瓶颈并进行相应优化。
窗口函数
窗口函数是高级SQL特性,允许在行组(窗口)上执行计算,同时保留各行身份。
排名函数
ROW_NUMBER()、RANK()和DENSE_RANK()等函数可用于为结果集中的行分配排名:SELECT first_name, last_name, salary, RANK() OVER (ORDER BY salary DESC) as rank FROM employees;
分析函数
LAG()和LEAD()等函数可以访问当前行之前或之后的行中的数据,适用于趋势分析和比较:SELECT sales_date, amount, LAG(amount) OVER (ORDER BY sales_date) as previous_amount FROM sales;
878

被折叠的 条评论
为什么被折叠?



