SELECT 语句是 SQL 中最基本也是最重要的命令,用于从数据库中检索数据。
SELECT column1, column2, ...
FROM table_name;
-- 选择所有列
SELECT * FROM employees;
-- 选择特定列
SELECT first_name, last_name, salary FROM employees;
SELECT * FROM employees
WHERE department = 'IT' AND salary > 50000;
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC, last_name ASC;
SELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary
FROM employees
GROUP BY department;
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 60000;
SELECT first_name, last_name
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'New York'
);
-- 内连接
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
-- 左外连接
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
-- 并集 (UNION)
SELECT employee_id FROM current_employees
UNION
SELECT employee_id FROM former_employees;
-- 交集 (INTERSECT - 部分数据库支持)
SELECT employee_id FROM full_time_employees
INTERSECT
SELECT employee_id FROM managers;
SELECT
COUNT(*) as total_employees,
AVG(salary) as average_salary,
MAX(salary) as max_salary,
MIN(salary) as min_salary,
SUM(salary) as total_salary_payout
FROM employees;
SELECT
CONCAT(first_name, ' ', last_name) as full_name,
UPPER(last_name) as last_name_upper,
LENGTH(first_name) as name_length,
SUBSTRING(email, 1, 5) as email_prefix
FROM employees;
SELECT
first_name,
hire_date,
CURRENT_DATE - hire_date as days_employed,
EXTRACT(YEAR FROM hire_date) as hire_year
FROM employees;
SELECT
first_name,
last_name,
salary,
CASE
WHEN salary < 50000 THEN 'Junior'
WHEN salary BETWEEN 50000 AND 80000 THEN 'Mid-level'
ELSE 'Senior'
END as employee_level
FROM employees;
SELECT *
LIMIT
或 TOP
子句-- MySQL/PostgreSQL 中的 EXPLAIN
EXPLAIN SELECT * FROM employees WHERE department = 'IT';
-- SQL Server 中的执行计划
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM employees WHERE department = 'IT';
GO
SET SHOWPLAN_TEXT OFF;
GO
不同数据库的分页语法有所不同:
-- MySQL/PostgreSQL
SELECT * FROM employees
ORDER BY last_name
LIMIT 10 OFFSET 20; -- 跳过20条,取10条
-- SQL Server
SELECT * FROM employees
ORDER BY last_name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- Oracle
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM employees ORDER BY last_name
) a WHERE ROWNUM <= 30
) WHERE rn > 20;
在某些情况下,你可能需要构建动态 SQL 查询:
-- 使用存储过程构建动态 SQL (SQL Server 示例)
CREATE PROCEDURE GetEmployeesByDepartment
@deptName VARCHAR(50)
AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM employees WHERE department = @deptParam';
EXEC sp_executesql @sql,
N'@deptParam VARCHAR(50)',
@deptParam = @deptName;
END;
通过掌握这些 SELECT 语句的技术和最佳实践,你将能够高效地从数据库中检索数据,满足各种业务需求。