Skip to content

MySQL - 查询

MySQL 查询是用于与数据库交互的命令。它们大致分为两类:

  • 数据定义语言 (DDL): 定义或修改数据库结构的命令。示例:CREATE、ALTER、DROP。
  • 数据操作语言 (DML): 管理数据库中数据的命令。示例:INSERT、SELECT、UPDATE、DELETE。

本教程将通过使用 products 表作为示例,引导您学习管理数据库最基本的查询。为了提高可读性,我们将 SQL 关键字大写,尽管 MySQL 对大小写不敏感。

首先,我们创建一个新数据库来存放表。然后,我们选择它,使其成为后续命令的活动数据库。

CREATE DATABASE database_name;
USE database_name;
-- 创建一个名为 'my_store' 的新数据库
CREATE DATABASE my_store;
-- 将 'my_store' 设置为活动数据库
USE my_store;

CREATE TABLE 语句定义了一个新表、其列以及每列的数据类型和约束。

CREATE TABLE table_name (
column1_name data_type [constraints],
column2_name data_type [constraints],
...
PRIMARY KEY (primary_key_column)
);

此示例包含常见的数据完整性约束:

CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
in_stock INT NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • AUTO_INCREMENT:自动为每个新行生成唯一的数字。
  • PRIMARY KEY:唯一标识表中的每条记录。
  • NOT NULL:确保列不能包含 NULL 值。
  • UNIQUE:确保列中的所有值都不同。
  • DEFAULT:当未指定值时,为列设置默认值。

INSERT INTO 语句向表中添加新的数据行。

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT INTO products (sku, name, price, in_stock)
VALUES
('BK-001', 'Modern JavaScript', 29.99, 100),
('DB-002', 'SQL for Beginners', 24.99, 50),
('FW-003', 'Learning React', 39.99, 75);

SELECT 语句用于查询数据库并检索符合您指定条件的数据。

SELECT * FROM products;
-- 查找所有价格低于 $30 的产品
SELECT name, price FROM products
WHERE price < 30.00;

UPDATE 语句修改表中现有记录。

警告: UPDATE 语句务必使用 WHERE 子句。否则,您将更新表中的所有行。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
-- 将 'SQL for Beginners' 这本书打折
UPDATE products
SET price = 19.99
WHERE sku = 'DB-002';

ALTER TABLE 语句用于在现有表中添加、删除或修改列。

-- 添加一个用于产品描述的新列
ALTER TABLE products
ADD COLUMN description TEXT;
-- 修改列的数据类型
ALTER TABLE products
MODIFY COLUMN name VARCHAR(300) NOT NULL;
-- 删除 description 列
ALTER TABLE products
DROP COLUMN description;

DELETE 和 TRUNCATE 都用于从表中删除数据,但它们的工作方式不同。

根据 WHERE 子句删除一行或多行。它是一种 DML 操作,因此速度较慢,会记录每次行删除,并且可以在事务中回滚。它不会重置 AUTO_INCREMENT 计数器。

-- 警告:请务必小心使用 WHERE 子句!
DELETE FROM products WHERE in_stock = 0;

快速删除表中的所有行。它是一种 DDL 操作,不容易回滚,并且会重置所有 AUTO_INCREMENT 值。对于清空整个表来说,它比 DELETE 快得多。

TRUNCATE TABLE products;

DROP TABLE 语句会彻底删除表的结构及其所有数据。此操作不可逆。

DROP TABLE table_name;
-- 这将永久删除 products 表。
DROP TABLE products;