Bootstrap

从入门到专业:SQL标准语法详解与高效编码规范指南

目录

    • 一、SQL的"普通话"——标准SQL
      • 1.1 为什么需要标准SQL?
    • 二、SQL三大语句类型(附记忆口诀)
      • 2.1 DDL(数据定义语言)——"盖房子"
      • 2.2 DML(数据操作语言)——"搬家具"
      • 2.3 DCL(数据控制语言)——"配钥匙"
    • 三、SQL书写规范(避免被同事吐槽)
      • 3.1 基础排版规范
      • 3.2 注释规范
    • 四、新手必看避坑指南
      • 4.1 常见错误
      • 4.2 安全操作建议
    • 五、实战训练(含答案解析)
      • 5.1 创建商品表
      • 5.2 数据验证
    • 六、学习资源推荐

一、SQL的"普通话"——标准SQL

1.1 为什么需要标准SQL?

场景标准SQL写法MySQL方言Oracle方言
获取当前时间CURRENT_TIMESTAMPNOW()SYSDATE
限制查询结果数FETCH FIRST 5 ROWSLIMIT 5WHERE ROWNUM <=5
字符串连接CONCAT('A', 'B')'A' || 'B'CONCAT('A', 'B')

重要建议

  1. 优先学习标准SQL语法(占80%使用场景)
  2. 各数据库特有语法用时查阅文档即可

二、SQL三大语句类型(附记忆口诀)

2.1 DDL(数据定义语言)——“盖房子”

-- 创建用户表(带注释规范)
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    username VARCHAR(20) NOT NULL COMMENT '用户名',
    reg_date DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 修改表结构(新增字段)
ALTER TABLE users ADD COLUMN phone VARCHAR(15) COMMENT '联系电话';

2.2 DML(数据操作语言)——“搬家具”

-- 插入数据(明确指定字段)
INSERT INTO users (username, phone) 
VALUES ('张三', '13800138000');

-- 更新数据(必须带WHERE!)
UPDATE users SET phone='13912345678' 
WHERE user_id = 1;  -- 指定条件

-- 删除数据(危险操作示范)
DELETE FROM users WHERE user_id = 1; -- 生产环境慎用

2.3 DCL(数据控制语言)——“配钥匙”

-- 创建只读账号(权限控制示例)
CREATE USER 'read_user'@'%' IDENTIFIED BY 'Read@123';
GRANT SELECT ON mydb.* TO 'read_user'@'%';

记忆口诀

  • DDL:Create(建)、Alter(改)、Drop(删)
  • DML:Insert(增)、Update(改)、Delete(删)
  • DCL:Grant(授权)、Revoke(收权)

三、SQL书写规范(避免被同事吐槽)

3.1 基础排版规范

-- 好的写法(清晰易读)
SELECT 
    u.user_id,
    u.username,
    COUNT(o.order_id) AS order_count
FROM users AS u
LEFT JOIN orders AS o 
    ON u.user_id = o.user_id
WHERE u.reg_date >= '2024-01-01'
GROUP BY u.user_id
HAVING order_count > 3
ORDER BY order_count DESC;

-- 坏的写法(难以维护)
SELECT u.user_id,u.username,COUNT(o.order_id) AS order_count FROM users u LEFT JOIN orders o ON u.user_id=o.user_id WHERE u.reg_date>='2024-01-01' GROUP BY u.user_id HAVING order_count>3 ORDER BY order_count DESC;

3.2 注释规范

/* 
订单统计查询
创建人:张三
日期:2025-02-21
*/
SELECT 
    product_id,
    SUM(quantity) AS total_qty -- 总销售数量
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY product_id;

四、新手必看避坑指南

4.1 常见错误

错误类型错误示例正确写法原因说明
忘记WHERE条件UPDATE users SET status=0添加WHERE user_id=1001避免全表更新
混淆引号使用WHERE name = "张三"WHERE name = '张三'字符串必须用单引号
NULL值判断错误WHERE age = NULLWHERE age IS NULLNULL需要特殊运算符
错误使用保留字CREATE TABLE (group INT)改用group_namegroup是SQL保留字

4.2 安全操作建议

  1. 数据修改前先查询
    -- 先确认要影响的数据
    SELECT * FROM users WHERE age > 30; 
    -- 再执行删除
    DELETE FROM users WHERE age > 30;
    
  2. 使用事务保护重要操作
    START TRANSACTION;
    UPDATE account SET balance = balance - 100 WHERE user_id = 1;
    UPDATE account SET balance = balance + 100 WHERE user_id = 2;
    COMMIT; -- 确认无误后提交
    

五、实战训练(含答案解析)

5.1 创建商品表

需求

  • 表名:products
  • 字段:
    • 商品ID(主键,自增长)
    • 商品名称(最长50字符,必填)
    • 价格(正数,保留两位小数)
    • 库存量(默认0)
    • 上架时间(自动记录)

参考答案

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(50) NOT NULL,
    price DECIMAL(10,2) CHECK (price > 0),
    stock INT DEFAULT 0,
    list_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

5.2 数据验证

-- 插入测试数据
INSERT INTO products (product_name, price, stock)
VALUES ('无线键盘', 199.99, 50);

-- 查询结果
SELECT * FROM products;
/* 预期输出:
product_id | product_name | price | stock | list_time
----------------------------------------------------
1          | 无线键盘     |199.99 | 50    |2025-02-21 19:30:00
*/

六、学习资源推荐

  1. 在线练习平台

  2. 推荐书籍

    • 《SQL必知必会》——快速入门首选
    • 《MySQL是怎样运行的》——深入理解原理
  3. 开发工具


下期预告:《表的创建、更新及删除》
互动话题:你在学习SQL时遇到过哪些坑?欢迎评论区留言讨论!
温馨提示:点击【关注】不迷路,每天持续输出

;