mysql

SQL 基础语法

By AI-Writer 6 min read

SQL 基础语法

SQL(Structured Query Language,结构化查询语言)是操作关系型数据库的标准语言。MySQL 8.x 完全支持 ANSI SQL 标准,同时扩展了大量自有语法。本文以一个示例数据库 shop 为例,系统讲解 SELECT、INSERT、UPDATE、DELETE 四大核心语句,以及别名、注释、DISTINCT、LIMIT 等常用子句。

约定:本文所有 SQL 语句均以 mysql> 命令行提示符或 sql 代码块展示,读者可以在自己的 MySQL 环境中直接执行。

示例数据库

为便于演示,先创建测试数据库和表:

sql
-- 创建示例数据库
CREATE DATABASE IF NOT EXISTS shop;
USE shop;

-- 创建用户表
CREATE TABLE users (
    id       INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50)  NOT NULL,
    email    VARCHAR(100),
    age      INT,
    city     VARCHAR(50),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 插入测试数据
INSERT INTO users (username, email, age, city) VALUES
    ('alice',   'alice@example.com',   28, 'Beijing'),
    ('bob',     'bob@example.com',     22, 'Shanghai'),
    ('charlie', 'charlie@example.com', 35, 'Beijing'),
    ('david',   'david@example.com',   30, 'Guangzhou'),
    ('emma',    'emma@example.com',    25, 'Shanghai');

SELECT 查询

SELECT 是最常用的 SQL 语句,用于从表中读取数据。

基本查询

sql
-- 查询表中所有列(不推荐在生产环境使用,优先列出具体列名)
SELECT * FROM users;

-- 查询指定列
SELECT username, email, city FROM users;

-- 带文字计算的查询
SELECT username, age, age + 1 AS age_next_year FROM users;

列别名

使用 AS 为列或计算结果指定临时名称,使输出更易读:

sql
SELECT
    username      AS '用户名',
    email         AS '邮箱',
    age           AS '年龄',
    age * 12      AS '月龄'       -- 无 AS 也可,MySQL 自动用表达式做列名
FROM users;

DISTINCT 去重

sql
-- 列出所有城市(每个城市只出现一次)
SELECT DISTINCT city FROM users;

-- 多列组合去重
SELECT DISTINCT city, age FROM users;

LIMIT 限制行数

sql
-- 只返回前 3 条记录
SELECT * FROM users LIMIT 3;

-- 跳过前 2 条,返回接下来的 3 条(OFFSET 语法)
SELECT * FROM users LIMIT 3 OFFSET 2;

-- MySQL 简写(OFFSET 可省略关键字)
SELECT * FROM users LIMIT 2, 3;

注意LIMIT 在 MySQL 中写在 ORDER BY 之后(如果有的话),用于限制最终返回的结果集行数。

INSERT 插入

基本插入

sql
-- 指定列名插入(推荐,避免因表结构变更导致错误)
INSERT INTO users (username, email, age, city)
VALUES ('frank', 'frank@example.com', 31, 'Shenzhen');

-- 全列插入(需确保 VALUES 顺序与表结构完全一致)
INSERT INTO users
VALUES (6, 'grace', 'grace@example.com', 27, 'Chengdu', NOW());

-- 批量插入(性能远优于多次单行 INSERT)
INSERT INTO users (username, email, age, city) VALUES
    ('henry',   'henry@example.com',   29, 'Hangzhou'),
    ('ivy',     'ivy@example.com',     24, 'Wuhan'),
    ('jack',    'jack@example.com',    33, 'Nanjing');

插入或更新(ON DUPLICATE KEY UPDATE)

当插入的主键或唯一键冲突时,执行更新而非报错:

sql
-- 如果 id=1 的记录存在则更新 email,否则插入新记录
INSERT INTO users (id, username, email, age, city)
VALUES (1, 'alice', 'alice_new@example.com', 29, 'Beijing')
ON DUPLICATE KEY UPDATE email = VALUES(email), age = VALUES(age);

UPDATE 更新

基本更新

sql
-- 将 id=1 的用户年龄改为 29
UPDATE users SET age = 29 WHERE id = 1;

-- 一次更新多列
UPDATE users
SET
    email    = 'alice@newdomain.com',
    city     = 'Hangzhou',
    age      = age + 1       -- 基于原有值计算
WHERE id = 1;

警告UPDATE 语句务必带 WHERE 条件,否则会更新整张表的所有记录!

多表更新

sql
-- 假设有 orders 表含 user_id 外键
UPDATE users u, orders o
SET u.city = 'Shanghai'
WHERE u.id = o.user_id AND o.amount > 1000;

DELETE 删除

基本删除

sql
-- 删除指定记录
DELETE FROM users WHERE id = 6;

-- 删除满足条件的多个记录
DELETE FROM users WHERE city = 'Guangzhou';

警告:同样,不带 WHERE 的 DELETE 会清空整张表!清空整表推荐使用 TRUNCATE TABLE(更快,但不可回滚)。

sql
-- 清空表(DDL 级别,速度极快,主键自增重置)
TRUNCATE TABLE users;

带子查询的删除

sql
-- 删除 age 大于平均年龄的用户
DELETE FROM users
WHERE age > (SELECT avg_age FROM (SELECT AVG(age) AS avg_age FROM users) AS t);

注意:MySQL 不允许在 DELETE 语句中直接引用目标表作为子查询,需包装一层子查询绕过此限制。

SQL 注释

sql
-- 单行注释(MySQL 也支持 # 风格)
SELECT * FROM users;  -- 这是注释

# 另一种单行注释风格
SELECT * FROM users;

 /*
    多行注释
    可写在语句中间
 */
SELECT username /* 列别名 */ AS name FROM users;

执行顺序与逻辑

理解 SQL 语句的执行顺序有助于写出正确的复杂查询:

sql
SELECT username, city, age     -- 5. 投影(SELECT 列)
FROM users                       -- 1. 确定数据源(FROM)
WHERE age > 25                   -- 2. 行过滤
GROUP BY city                   -- 3. 分组
HAVING COUNT(*) >= 1            -- 4. 组过滤
ORDER BY age DESC               -- 6. 排序
LIMIT 10;                       -- 7. 限制行数

MySQL 内部按上述顺序处理,但 SELECT 语句中的列引用按书写顺序解析(除 ORDER BYLIMIT 外)。

总结

本文覆盖了 SQL 最核心的四大操作:

语句作用危险操作
SELECT查询数据
INSERT插入新记录
UPDATE修改现有记录不带 WHERE 更新全表
DELETE删除记录不带 WHERE 删除全表

下一篇文章我们将深入学习 数据类型与表设计,理解 MySQL 8.x 支持的各种数据类型及约束的含义与选择原则。

#mysql #sql #数据库 #入门

评论

A

Written by

AI-Writer

Related Articles

mysql
#3

数据类型与表设计

深入理解 MySQL 8.x 的数值、字符、日期类型,以及主键、外键、NOT NULL、UNIQUE、DEFAULT 等约束的含义与实战选择

Read More
mysql
#5

条件过滤与聚合查询

掌握 WHERE、LIKE、IN、BETWEEN、ORDER BY、LIMIT、GROUP BY、HAVING 等子句,实现精确数据筛选、分组统计与结果排序

Read More
mysql
#2

SQL 基础语法

掌握 MySQL 中 SELECT、INSERT、UPDATE、DELETE 四大核心语句,以及别名、注释、DISTINCT、LIMIT 等实用技巧

Read More