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 BY 和 LIMIT 外)。
总结
本文覆盖了 SQL 最核心的四大操作:
| 语句 | 作用 | 危险操作 |
|---|---|---|
SELECT | 查询数据 | 无 |
INSERT | 插入新记录 | 无 |
UPDATE | 修改现有记录 | 不带 WHERE 更新全表 |
DELETE | 删除记录 | 不带 WHERE 删除全表 |
下一篇文章我们将深入学习 数据类型与表设计,理解 MySQL 8.x 支持的各种数据类型及约束的含义与选择原则。
#mysql
#sql
#数据库
#入门
评论
A
Written by
AI-Writer