SQL语句大全,从基础到高级,一网打尽
在数据驱动的时代,SQL(Structured Query Language)作为数据库查询和管理的标准语言,其重要性不言而喻,无论是数据分析师、开发人员还是数据库管理员,掌握SQL都是必备技能之一,本文将带你从基础到高级,全面了解SQL的各种常用语句,帮助你在数据处理和分析中更加得心应手。
1. 基础查询
1.1 选择所有列
SELECT * FROM table_name;
这条语句用于从表中选择所有列的数据。 表示选择所有列。
1.2 选择特定列
SELECT column1, column2 FROM table_name;
如果你只需要表中的某些特定列,可以使用这种方式来选择。
1.3 条件查询
SELECT * FROM table_name WHERE condition;
通过WHERE
子句,你可以根据条件筛选出符合条件的记录。
SELECT * FROM employees WHERE salary > 50000;
1.4 排序
SELECT * FROM table_name ORDER BY column1 ASC/DESC;
使用ORDER BY
子句可以对查询结果进行排序。ASC
表示升序,DESC
表示降序。
SELECT * FROM employees ORDER BY salary DESC;
1.5 分组
SELECT column1, COUNT(*) FROM table_name GROUP BY column1;
使用GROUP BY
子句可以将数据按某一列或多列分组,并对每个分组进行聚合操作。
SELECT department, COUNT(*) FROM employees GROUP BY department;
1.6 聚合函数
SQL 提供了多种聚合函数,如COUNT()
,SUM()
,AVG()
,MIN()
,MAX()
等,这些函数可以对数据进行统计分析。
SELECT AVG(salary) FROM employees;
2. 连接查询
2.1 内连接
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
内连接(INNER JOIN)返回两个表中满足连接条件的记录。
SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;
2.2 左连接
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
左连接(LEFT JOIN)返回左表中的所有记录,以及右表中满足连接条件的记录,如果右表中没有匹配的记录,则返回 NULL。
SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id;
2.3 右连接
SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
右连接(RIGHT JOIN)返回右表中的所有记录,以及左表中满足连接条件的记录,如果左表中没有匹配的记录,则返回 NULL。
SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.department_id;
2.4 全外连接
SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
全外连接(FULL OUTER JOIN)返回两个表中所有记录,无论是否满足连接条件,如果某一方没有匹配的记录,则返回 NULL。
SELECT employees.name, departments.department_name FROM employees FULL OUTER JOIN departments ON employees.department_id = departments.department_id;
3. 子查询
子查询是在另一个查询内部嵌套的查询,子查询可以出现在SELECT
,FROM
,WHERE
和HAVING
子句中。
3.1 单行子查询
SELECT * FROM table1 WHERE column = (SELECT column FROM table2 WHERE condition);
单行子查询返回一个值。
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
3.2 多行子查询
SELECT * FROM table1 WHERE column IN (SELECT column FROM table2 WHERE condition);
多行子查询返回多个值。
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');
4. 高级查询
4.1 联合查询
SELECT * FROM table1 UNION SELECT * FROM table2;
联合查询(UNION)用于合并两个或多个查询的结果集。UNION
默认去除重复记录,如果需要保留重复记录,可以使用UNION ALL
。
SELECT name FROM employees UNION SELECT name FROM contractors;
4.2 交叉连接
SELECT * FROM table1 CROSS JOIN table2;
交叉连接(CROSS JOIN)返回两个表的笛卡尔积,即所有可能的组合。
SELECT employees.name, departments.department_name FROM employees CROSS JOIN departments;
4.3 自连接
自连接是指在一个表上进行两次连接,假设有一个员工表,包含员工的上级信息,可以通过自连接查询某个员工的所有下属。
SELECT e1.name AS manager, e2.name AS employee FROM employees e1 JOIN employees e2 ON e1.employee_id = e2.manager_id;
4.4 窗口函数
窗口函数(Window Functions)允许你在一组相关行上执行计算,同时保持每行的独立性,常见的窗口函数包括ROW_NUMBER()
,RANK()
,DENSE_RANK()
,LEAD()
,LAG()
,SUM()
,AVG()
等。
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
5. 数据修改
5.1 插入数据
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
插入数据时,可以指定插入的列和对应的值。
INSERT INTO employees (name, salary) VALUES ('John Doe', 60000);
5.2 更新数据
UPDATE table_name SET column1 = value1 WHERE condition;
更新数据时,可以使用SET
子句指定要更新的列和新值,并使用WHERE
子句指定更新条件。
UPDATE employees SET salary = 70000 WHERE name = 'John Doe';
5.3 删除数据
DELETE FROM table_name WHERE condition;
删除数据时,使用WHERE
子句指定删除条件。
DELETE FROM employees WHERE name = 'John Doe';
6. 事务控制
事务是一组 SQL 语句,它们作为一个整体一起执行,事务控制语句包括BEGIN
,COMMIT
,ROLLBACK
和SAVEPOINT
。
6.1 开始事务
BEGIN;
6.2 提交事务
COMMIT;
6.3 回滚事务
ROLLBACK;
6.4 设置保存点
SAVEPOINT savepoint_name;
设置保存点后,可以在需要时回滚到该保存点。
BEGIN; SAVEPOINT before_update; UPDATE employees SET salary = 70000 WHERE name = 'John Doe'; ROLLBACK TO SAVEPOINT before_update; COMMIT;
7. 索引和优化
索引可以提高查询性能,但也会增加存储开销,创建索引时需要权衡利弊。
7.1 创建索引
CREATE INDEX index_name ON table_name (column1, column2);
CREATE INDEX idx_employee_name ON employees (name);
7.2 删除索引
DROP INDEX index_name;
DROP INDEX idx_employee_name;
8. 视图
视图是一种虚拟表,其内容由查询定义,视图可以简化复杂的查询,提高可读性和维护性。
8.1 创建视图
CREATE VIEW view_name AS SELECT * FROM table_name WHERE condition;
CREATE VIEW high_salary_employees AS SELECT * FROM employees WHERE salary > 50000;
8.2 查询视图
SELECT * FROM view_name;
SELECT * FROM high_salary_employees;
8.3 删除视图
DROP VIEW view
相关文章