sql-syntax
SQL - 核心语法和语句
Section titled “SQL - 核心语法和语句”1. 什么是 SQL 语法?
Section titled “1. 什么是 SQL 语法?”SQL(Structured Query Language,结构化查询语言)语法是编写有效 SQL 查询的规则和准则集合。所有 SQL 语句都以关键字(如 SELECT、INSERT、CREATE)开头,并且通常以分号 (;) 结尾。分号作为语句终止符,允许您在单个批处理中运行多个命令。
2. 大小写敏感性和命名约定
Section titled “2. 大小写敏感性和命名约定”SQL 关键字(如 SELECT、FROM、WHERE 等)不区分大小写。SELECT 和 select 是相同的。然而,表名和列名的大小写敏感性取决于数据库系统及其配置。例如,Linux 上的 MySQL 默认对表名区分大小写。
最佳实践: 为了最大程度地提高可读性和一致性,请将 SQL 关键字写成 UPPERCASE(大写),将表名/列名写成 snake_case(蛇形命名法,例如 product_orders)。这会使查询更容易阅读。
3. SQL 语句的主要类别
Section titled “3. SQL 语句的主要类别”SQL 命令在逻辑上分为几个类别。最常见的三个是:
- 数据定义语言 (DDL): 定义和管理数据库结构。(例如,
CREATE TABLE,ALTER TABLE)。 - 数据操作语言 (DML): 用于添加、修改和删除数据。(例如,
INSERT,UPDATE,DELETE)。 - 数据查询语言 (DQL): 最常见的类别,用于检索数据。(例如,
SELECT)。
4. 数据定义语言 (DDL)
Section titled “4. 数据定义语言 (DDL)”DDL 语句用于构建和修改数据库对象的结构。
CREATE TABLE
Section titled “CREATE TABLE”在数据库中创建一个新表。
CREATE TABLE customers ( id INT PRIMARY KEY AUTO_INCREMENT, -- AUTO_INCREMENT 用于 MySQL/MariaDB name VARCHAR(255) NOT NULL, age INT, address VARCHAR(255), salary DECIMAL(10, 2));ALTER TABLE
Section titled “ALTER TABLE”修改现有表,例如,添加或删除列。
-- 添加新列ALTER TABLE customers ADD COLUMN email VARCHAR(255) UNIQUE;
-- 删除现有列ALTER TABLE customers DROP COLUMN age;DROP TABLE
Section titled “DROP TABLE”永久删除表及其所有数据。请谨慎使用!
DROP TABLE customers;5. 数据操作语言 (DML)
Section titled “5. 数据操作语言 (DML)”DML 语句用于管理表中的数据。
INSERT INTO
Section titled “INSERT INTO”向表中添加新的数据行。指定列是推荐的、更安全的语法。
-- 推荐:指定列INSERT INTO customers (name, age, salary)VALUES ('Alice', 30, 75000.00);
-- 一次插入多行INSERT INTO customers (name, age, salary)VALUES ('Bob', 25, 60000.00), ('Charlie', 35, 90000.00);UPDATE
Section titled “UPDATE”修改现有记录。务必使用 WHERE 子句,以避免更新表中的所有行。
UPDATE customersSET salary = 80000.00, address = 'New York'WHERE name = 'Alice';DELETE
Section titled “DELETE”删除现有记录。务必使用 WHERE 子句,以避免删除所有数据。
DELETE FROM customersWHERE name = 'Charlie';6. 数据查询语言 (DQL)
Section titled “6. 数据查询语言 (DQL)”SELECT 是 SQL 的主力,用于检索数据。它有许多可选子句来细化结果。
-- DQL 示例的参考表SELECT * FROM customers;| id | name | age | address | salary |
|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
带 WHERE 子句的 SELECT
Section titled “带 WHERE 子句的 SELECT”根据特定条件过滤记录。
SELECT name, salary FROM customers WHERE salary > 5000;带 AND / OR / NOT 的 SELECT
Section titled “带 AND / OR / NOT 的 SELECT”组合多个条件。
SELECT name, age, salary FROM customersWHERE salary > 2000 AND age < 30;带 IN 的 SELECT
Section titled “带 IN 的 SELECT”检查值是否与列表中的任何值匹配。
SELECT * FROM customers WHERE name IN ('Khilan', 'Hardik');带 LIKE 的 SELECT
Section titled “带 LIKE 的 SELECT”对字符串执行模式匹配。% 是零个或多个字符的通配符。
SELECT * FROM customers WHERE address LIKE 'M%'; -- 查找以 'M' 开头的地址带 ORDER BY 的 SELECT
Section titled “带 ORDER BY 的 SELECT”对结果集进行排序。ASC 用于升序(默认),DESC 用于降序。
SELECT name, salary FROM customers ORDER BY salary DESC;带 GROUP BY 和 HAVING 的 SELECT
Section titled “带 GROUP BY 和 HAVING 的 SELECT”将具有相同值的行分组为汇总行,然后过滤这些组。
-- 查找有多个客户的年龄SELECT age, COUNT(id) AS number_of_customersFROM customersGROUP BY ageHAVING COUNT(id) > 1;7. 高级查询结构:公用表表达式 (CTEs)
Section titled “7. 高级查询结构:公用表表达式 (CTEs)”对于复杂的查询,子查询可能会变得难以阅读。公用表表达式(CTE),通过 WITH 子句定义,允许您创建一个临时的、命名的结果集,您可以在主查询中引用它。这显著提高了可读性和组织性。
-- 使用 CTE 查找德里高收入客户WITH delhi_customers AS ( SELECT id, name, salary FROM customers WHERE address = 'Delhi')SELECT name, salaryFROM delhi_customersWHERE salary > 1000;