Skip to content

sql-syntax

SQL(Structured Query Language,结构化查询语言)语法是编写有效 SQL 查询的规则和准则集合。所有 SQL 语句都以关键字(如 SELECT、INSERT、CREATE)开头,并且通常以分号 (;) 结尾。分号作为语句终止符,允许您在单个批处理中运行多个命令。

SQL 关键字(如 SELECT、FROM、WHERE 等)不区分大小写。SELECT 和 select 是相同的。然而,表名和列名的大小写敏感性取决于数据库系统及其配置。例如,Linux 上的 MySQL 默认对表名区分大小写。

最佳实践: 为了最大程度地提高可读性和一致性,请将 SQL 关键字写成 UPPERCASE(大写),将表名/列名写成 snake_case(蛇形命名法,例如 product_orders)。这会使查询更容易阅读。

SQL 命令在逻辑上分为几个类别。最常见的三个是:

  • 数据定义语言 (DDL): 定义和管理数据库结构。(例如,CREATE TABLE,ALTER TABLE)。
  • 数据操作语言 (DML): 用于添加、修改和删除数据。(例如,INSERT,UPDATE,DELETE)。
  • 数据查询语言 (DQL): 最常见的类别,用于检索数据。(例如,SELECT)。

DDL 语句用于构建和修改数据库对象的结构。

在数据库中创建一个新表。

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 customers ADD COLUMN email VARCHAR(255) UNIQUE;
-- 删除现有列
ALTER TABLE customers DROP COLUMN age;

永久删除表及其所有数据。请谨慎使用!

DROP TABLE customers;

DML 语句用于管理表中的数据。

向表中添加新的数据行。指定列是推荐的、更安全的语法。

-- 推荐:指定列
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);

修改现有记录。务必使用 WHERE 子句,以避免更新表中的所有行。

UPDATE customers
SET salary = 80000.00, address = 'New York'
WHERE name = 'Alice';

删除现有记录。务必使用 WHERE 子句,以避免删除所有数据。

DELETE FROM customers
WHERE name = 'Charlie';

SELECT 是 SQL 的主力,用于检索数据。它有许多可选子句来细化结果。

-- DQL 示例的参考表
SELECT * FROM customers;
idnameageaddresssalary
1Ramesh32Ahmedabad2000.00
2Khilan25Delhi1500.00
3kaushik23Kota2000.00
4Chaitali25Mumbai6500.00
5Hardik27Bhopal8500.00

根据特定条件过滤记录。

SELECT name, salary FROM customers WHERE salary > 5000;

组合多个条件。

SELECT name, age, salary FROM customers
WHERE salary > 2000 AND age < 30;

检查值是否与列表中的任何值匹配。

SELECT * FROM customers WHERE name IN ('Khilan', 'Hardik');

对字符串执行模式匹配。% 是零个或多个字符的通配符。

SELECT * FROM customers WHERE address LIKE 'M%'; -- 查找以 'M' 开头的地址

对结果集进行排序。ASC 用于升序(默认),DESC 用于降序。

SELECT name, salary FROM customers ORDER BY salary DESC;

将具有相同值的行分组为汇总行,然后过滤这些组。

-- 查找有多个客户的年龄
SELECT age, COUNT(id) AS number_of_customers
FROM customers
GROUP BY age
HAVING 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, salary
FROM delhi_customers
WHERE salary > 1000;