MySQL SQL 语法基础:DDL、DML 及常用查询详解
本文深入解析 MySQL 核心 SQL 语法结构,从数据定义语言(DDL)的表结构与索引管理,到数据操作语言(DML)的数据增删改查,提供完整的代码示例与逻辑说明,帮助开发者建立规范的数据库操作习惯。
数据定义语言(DDL):构建数据库结构
DDL(Data Definition Language)主要用于定义数据库对象的结构,包括表格、字段类型及相互关系。这是创建数据库时最先规划的环节,决定了数据的存储形态与完整性约束。
第1步:创建数据表
目的:在数据库中建立新的数据存储容器,定义列名、数据类型及约束条件。
CREATE TABLE table_name (
column1 datatype [NOT NULL] [NOT NULL PRIMARY KEY],
column2 datatype [NOT NULL],
...);
参数说明:
- datatype:指定字段的数据格式,需严格匹配后续写入的数据类型。
- NOT NULL:约束该字段不允许为空值。
- PRIMARY KEY:将字段设为主键,确保唯一标识性。
第2步:修改表结构
注意:标准 SQL 通常不支持直接删除已定义的列,主要操作为添加新列或调整主键约束。
添加新列:
ALTER TABLE table_name ADD COLUMN column_name datatype;
设置或删除主键:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
ALTER TABLE table_name DROP PRIMARY KEY;
第3步:建立与维护索引
目的:通过索引加速特定字段的查询速度,减少全表扫描开销。
CREATE INDEX index_name ON table_name (column_name);
若不再需要某索引,可使用 DROP INDEX index_name 删除。同时,使用 DROP TABLE table_name 可彻底删除表及其所有数据,操作前请确认重要数据已备份。
核心数据形态(Data Types)参考
选择合适的字段类型对性能至关重要。以下是 MySQL 中常用的数据类型及其特性:
SMALLINT:16 位整数,适用于较小范围的数值统计。INTEGER:32 位整数,通用整型存储。DECIMAL(p,s):精确十进制数。p 为总位数,s 为小数位数。若不指定,默认 p=5, s=0,常用于金额等需高精度的场景。FLOAT / DOUBLE:分别为 32 位和 64 位实数,用于科学计算或近似值存储。CHAR(n) / VARCHAR(n):定长与变长字符串。CHAR最大长度建议不超过 254 以保持效率;VARCHAR最大长度可达 4000,适合长度不确定的文本。DATE / TIME / TIMESTAMP:分别记录日期、时间及带千分之一秒的时间戳。其中GRAPHIC(n)及VARGRAPHIC(n)等双字节类型主要用于特殊字符集支持。
数据操作语言(DML):数据增删改查
完成结构定义后,接下来是实际的数据操作,主要包括插入(Insert)、查询(Select)、更新(Update)和删除(Delete)。
第1步:增加数据(INSERT)
目的:向表中插入新记录。
指定列名插入(推荐,顺序明确):
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
若未指定列名,系统将按表定义顺序填入数据,但需确保数据类型严格吻合。此外,也可通过子查询将其他表的数据迁入当前表:
INSERT INTO table_name (column1, ...)
SELECT columnx, ...
FROM another_table;
第2步:查询数据(SELECT)
目的:从数据库中检索所需信息,是最复杂的操作场景。
基本查询与条件过滤
SELECT * FROM table_name WHERE condition;
-- 例如:select * from user where age > 18;
- * 表示返回所有列,生产环境中建议仅列出需要的具体字段以优化 IO。
- WHERE 后接条件表达式,支持 =, >, <, >=, <=, <> 及逻辑运算符 AND/OR。
排序与限制
SELECT column1, column2
FROM table_name
ORDER BY column2 DESC;
- ORDER BY 指定排序列。加 DESC 为降序,默认为 ASC 升序。
组合查询与聚合分析
当需要跨表获取数据或使用统计函数时:
-- 联合查询(内连接逻辑)
SELECT * FROM table1, table2
WHERE table1.colum1 = table2.column1;
-- 聚合统计(计数、求和、平均等)
SELECT COUNT(*), SUM(column1), AVG(column2), MAX(col), MIN(col)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > threshold;
- GROUP BY:按指定列分组,必须配合聚合函数使用。
- HAVING:对分组后的结果进行过滤,不同于 WHERE 先过滤行再分组,HAVING 用于过滤组。
复杂查询技巧
针对特定场景的高效写法:
- 存在性检查(EXISTS):
SELECT * FROM table1 WHERE EXISTS (SELECT * FROM table2 WHERE ...); - 集合匹配(IN):
SELECT * FROM table1 WHERE col IN ('val1', 'val2'); - 范围与模糊匹配(BETWEEN / LIKE):
SELECT * FROM table1 WHERE col BETWEEN start AND end; SELECT * FROM table1 WHERE col LIKE 'prefix%';
第3步:更改数据(UPDATE)
风险提醒:执行更新前务必确认 WHERE 条件,否则会导致全表数据被覆盖。
UPDATE table_name
SET column1 = 'new_value'
WHERE condition;
第4步:删除数据(DELETE)
风险提醒:同 UPDATE,若无 WHERE 条件将清空整张表数据。
DELETE FROM table_name WHERE condition;
日期比较与特殊场景处理
在不同数据库或集成环境中,日期格式的语法可能有所差异。以下是常见情况的处理示例:
- Access 数据库:使用井号包裹日期
WHERE mydate #2000-01-01# - Oracle/标准 SQL:使用 CAST 或 TO_DATE 函数
WHERE mydate > TO_DATE('2000-01-01','yyyy-mm-dd') - 动态拼接示例(Delphi/编程环境):
thedate := '2000-01-01'; Query1.SQL.Add('SELECT * FROM abc WHERE mydate > cast(''' + thedate + ''' as date)');
若涉及时间精度比较,可完整传入时分秒:
TO_DATE('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')
以上就是 MySQL SQL 语法的详细内容,更多关于 MySQL 数据库优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













