文章目录
- 一、基本规则
- 二、标识符规则
- 三、数据类型
- 四、运算符
- 五、关键字
- 六、SQL 语句的通用语法结构
历史文章点击👉:SQL
🐈⬛github:https://github.com/mysql
💻官网: https://www.mysql.com
🌏维基百科:https://zh.wikipedia.org/wiki/MySQL
MySQL的语法主要遵循SQL标准。
简单说明,有些内容后面特定章节介绍。
一、基本规则
☘️ (1) SQL语句的基本结构
MySQL语句通常以关键字(如SELECT
、INSERT
、UPDATE
等)开头,以分号(;
)结尾。例如:
SELECT * FROM table_name;
☘️ (2) 大小写敏感性
- 关键字(如
SELECT
、FROM
、WHERE
等):不区分大小写,SELECT
和select
是等效的。 - 数据库名、表名和字段名:
- 默认情况下,表名和数据库名在Windows系统中不区分大小写;
- 但在Linux系统中区分大小写。
- 字段名通常不区分大小写。
☘️ (3) 注释
- 单行注释:
--
或#
-- 这是单行注释 SELECT * FROM table_name; # 这也是单行注释
- 多行注释:
/* */
/* 这是多行注释 可以包含多行内容 */ SELECT * FROM table_name;
☘️ (4)字符串和日期
- 字符串:用单引号(
'
)或双引号("
)括起来。例如:'Hello, world!' 或 "Hello, world!"
- 日期和时间:通常用
YYYY-MM-DD
或YYYY-MM-DD HH:MM:SS
格式表示。例如:'2025-03-10' 或 '2025-03-10 12:34:56'
二、标识符规则
- 表名和列名:
- 可以由字母、数字、下划线 (
_
) 组成。 - 必须以字母或下划线开头。
- 不能与 MySQL 的关键字冲突(如
SELECT
、FROM
)。 - 如果与关键字冲突,可以用反引号包裹,例如:
`select`
。
- 可以由字母、数字、下划线 (
- 数据库名:
- 规则与表名和列名类似。
- 区分大小写(取决于操作系统)。
三、数据类型
分类 | 数据类型 | 描述 | 示例 |
---|---|---|---|
整数类型 | TINYINT | 8位有符号整数,范围为-128到127;无符号范围为0到255。 | TINYINT(4) |
SMALLINT | 16位有符号整数,范围为-32768到32767;无符号范围为0到65535。 | SMALLINT(6) | |
MEDIUMINT | 24位有符号整数,范围为-8388608到8388607;无符号范围为0到16777215。 | MEDIUMINT(9) | |
INT 或 INTEGER | 32位有符号整数,范围为-2147483648到2147483647;无符号范围为0到4294967295。 | INT(11) | |
BIGINT | 64位有符号整数,范围为-9223372036854775808到9223372036854775807;无符号范围为0到18446744073709551615。 | BIGINT(20) | |
浮点数类型 | FLOAT[(M,D)] | 单精度浮点数,存储近似值。可选精度M 和小数位数D 。 | FLOAT(5,2) |
DOUBLE[(M,D)] 或 DOUBLE PRECISION | 双精度浮点数,存储近似值。可选精度M 和小数位数D 。 | DOUBLE(10,4) | |
DECIMAL(precision, scale) | 定点数,存储精确值。precision 为总位数,scale 为小数位数。 | DECIMAL(10,2) | |
字符串类型 | CHAR(length) | 定长字符串,最大长度为255字符。length 为字符数。 | CHAR(10) |
VARCHAR(length) | 变长字符串,最大长度为65535字符。length 为字符数。 | VARCHAR(255) | |
TEXT | 用于存储大量文本数据,最大长度为65535字符。 | TEXT | |
BLOB | 用于存储二进制数据,最大长度为65535字节。 | BLOB | |
日期和时间 | DATE | 日期值,格式为YYYY-MM-DD 。 | DATE |
TIME | 时间值,格式为HH:MM:SS 。 | TIME | |
DATETIME | 日期和时间值,格式为YYYY-MM-DD HH:MM:SS 。 | DATETIME | |
TIMESTAMP | 时间戳,范围为1970-01-01 00:00:01 到2038-01-19 03:14:07 。 | TIMESTAMP | |
YEAR | 年份值,格式为YYYY (四位年份)。 | YEAR |
四、运算符
分类 | 运算符 | 描述 | 示例 |
---|---|---|---|
算术运算符 | + | 加法运算。 | SELECT 1 + 2; |
- | 减法运算。 | SELECT 5 - 3; | |
* | 乘法运算。 | SELECT 4 * 3; | |
/ | 除法运算,返回浮点结果。 | SELECT 10 / 2; | |
DIV | 整数除法,返回整数结果。 | SELECT 10 DIV 3; | |
% 或 MOD | 求余运算,返回除法的余数。 | SELECT 10 % 3; 或 SELECT 10 MOD 3; | |
+ 或 - | 单目运算符,用于正数或负数。 | SELECT +5; 或 SELECT -5; | |
比较运算符 | = | 等于。 | SELECT * FROM table_name WHERE column = 1; |
<> 或 != | 不等于。 | SELECT * FROM table_name WHERE column <> 1; | |
< | 小于。 | SELECT * FROM table_name WHERE column < 1; | |
> | 大于。 | SELECT * FROM table_name WHERE column > 1; | |
<= | 小于等于。 | SELECT * FROM table_name WHERE column <= 1; | |
>= | 大于等于。 | SELECT * FROM table_name WHERE column >= 1; | |
IS NULL | 检查值是否为NULL 。 | SELECT * FROM table_name WHERE column IS NULL; | |
IS NOT NULL | 检查值是否不为NULL 。 | SELECT * FROM table_name WHERE column IS NOT NULL; | |
IS [NOT] DISTINCT FROM | 检查两个值是否相同或不同(NULL 值也视为相等)。 | SELECT * FROM table_name WHERE column IS DISTINCT FROM value; | |
逻辑运算符 | AND | 逻辑“与”,表示两个条件都为真时返回真。 | WHERE condition1 AND condition2; |
OR | 逻辑“或”,表示两个条件中任意一个为真时返回真。 | WHERE condition1 OR condition2; | |
NOT | 逻辑“非”,用于否定条件。 | WHERE NOT condition; | |
XOR | 逻辑“异或”,表示两个条件中只有一个为真时返回真。 | WHERE condition1 XOR condition2; | |
位运算符 | & | 位“与”,对两个值的二进制位进行逐位“与”运算。 | SELECT 5 & 3; |
` | ` | 位“或”,对两个值的二进制位进行逐位“或”运算。 | |
^ | 位“异或”,对两个值的二进制位进行逐位“异或”运算。 | SELECT 5 ^ 3; | |
~ | 位“非”,对值的二进制位进行逐位取反运算。 | SELECT ~5; | |
<< | 左移运算,将值的二进制位向左移动指定的位数。 | SELECT 5 << 1; | |
>> | 右移运算,将值的二进制位向右移动指定的位数。 | SELECT 5 >> 1; | |
其他运算符 | BETWEEN | 检查值是否在指定范围内。 | SELECT * FROM table_name WHERE column BETWEEN value1 AND value2; |
IN | 检查值是否在一组值中。 | SELECT * FROM table_name WHERE column IN (value1, value2, ...); | |
LIKE | 模糊匹配字符串,% 表示任意字符序列,_ 表示单个字符。 | SELECT * FROM table_name WHERE column LIKE 'pattern'; | |
REGEXP | 正则表达式匹配。 | SELECT * FROM table_name WHERE column REGEXP 'pattern'; | |
CONCAT | 字符串连接。 | SELECT CONCAT('Hello', ' ', 'World'); | |
IS [NOT] TRUE | 检查布尔值是否为真或假。 | SELECT * FROM table_name WHERE condition IS TRUE; |
五、关键字
关键字 | 含义 | 示例 |
---|---|---|
SELECT | 从表中检索数据。 | SELECT * FROM table_name; |
INSERT | 向表中插入新数据。 | INSERT INTO table_name VALUES (...); |
UPDATE | 更新表中的数据。 | UPDATE table_name SET column = value WHERE condition; |
DELETE | 删除表中的数据。 | DELETE FROM table_name WHERE condition; |
CREATE | 创建数据库、表或其他对象。 | CREATE TABLE table_name (...); |
DROP | 删除数据库、表或其他对象。 | DROP TABLE table_name; |
ALTER | 修改表结构(添加、删除或修改列)。 | ALTER TABLE table_name ADD COLUMN column_name datatype; |
TRUNCATE | 清空表中的所有数据,但保留表结构。 | TRUNCATE TABLE table_name; |
FROM | 指定从哪个表中检索数据。 | SELECT * FROM table_name; |
WHERE | 指定条件,用于过滤数据。 | SELECT * FROM table_name WHERE condition; |
AND | 用于组合多个条件,表示逻辑“与”。 | WHERE condition1 AND condition2; |
OR | 用于组合多个条件,表示逻辑“或”。 | WHERE condition1 OR condition2; |
NOT | 用于否定条件,表示逻辑“非”。 | WHERE NOT condition; |
IN | 检查某个值是否在一组值中。 | WHERE column IN (value1, value2, ...); |
BETWEEN | 检查某个值是否在指定范围内。 | WHERE column BETWEEN value1 AND value2; |
LIKE | 用于模糊匹配字符串。 | WHERE column LIKE 'pattern'; |
ORDER BY | 按指定列对结果集进行排序。 | SELECT * FROM table_name ORDER BY column ASC; |
GROUP BY | 按指定列对结果集进行分组。 | SELECT column, COUNT(*) FROM table_name GROUP BY column; |
HAVING | 用于对分组后的结果进行过滤。 | SELECT column, COUNT(*) FROM table_name GROUP BY column HAVING COUNT(*) > 1; |
JOIN | 用于连接多个表。 | SELECT * FROM table1 JOIN table2 ON table1.id = table2.id; |
INNER JOIN | 返回两个表中匹配的记录。 | SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; |
LEFT JOIN | 返回左表的所有记录,以及右表中匹配的记录。 | SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; |
RIGHT JOIN | 返回右表的所有记录,以及左表中匹配的记录。 | SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id; |
FULL JOIN | 返回两个表中所有匹配和不匹配的记录。MySQL不支持FULL JOIN ,但可以通过UNION 实现。 | SELECT * FROM table1 UNION SELECT * FROM table2; |
DISTINCT | 用于返回唯一值,去除重复行。 | SELECT DISTINCT column FROM table_name; |
AS | 用于为列或表指定别名。 | SELECT column AS alias FROM table_name AS alias; |
CASE | 用于条件表达式。 | SELECT CASE WHEN condition THEN value1 ELSE value2 END FROM table_name; |
LIMIT | 用于限制查询结果的数量。 | SELECT * FROM table_name LIMIT 10; |
OFFSET | 与LIMIT 一起使用,跳过指定数量的记录。 | SELECT * FROM table_name LIMIT 10 OFFSET 5; |
UNION | 用于合并两个SELECT 语句的结果集,自动去除重复行。 | SELECT column FROM table1 UNION SELECT column FROM table2; |
UNION ALL | 用于合并两个SELECT 语句的结果集,包含重复行。 | SELECT column FROM table1 UNION ALL SELECT column FROM table2; |
EXISTS | 检查子查询是否返回至少一行数据。 | SELECT * FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE condition); |
ANY | 用于比较子查询返回的任意值。 | SELECT * FROM table1 WHERE column > ANY (SELECT column FROM table2); |
ALL | 用于比较子查询返回的所有值。 | SELECT * FROM table1 WHERE column > ALL (SELECT column FROM table2); |
GRANT | 授予用户权限。 | GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'host'; |
REVOKE | 撤销用户权限。 | REVOKE SELECT, INSERT ON database_name.table_name FROM 'username'@'host'; |
CREATE USER | 创建新用户。 | CREATE USER 'username'@'host' IDENTIFIED BY 'password'; |
DROP USER | 删除用户。 | DROP USER 'username'@'host'; |
ALTER USER | 修改用户属性(如密码)。 | ALTER USER 'username'@'host' IDENTIFIED BY 'new_password'; |
COMMIT | 提交事务,使事务中的更改永久生效。 | COMMIT; |
ROLLBACK | 回滚事务,撤销事务中的更改。 | ROLLBACK; |
START TRANSACTION | 开始一个事务。 | START TRANSACTION; |
SET | 设置变量或系统参数。 | SET @variable = value; |
DECLARE | 在存储过程中声明变量。 | DECLARE variable_name datatype; |
IF | 用于条件判断。 | IF condition THEN statement; |
WHILE | 循环语句,当条件为真时重复执行。 | WHILE condition DO statement; |
LOOP | 无限循环,需要在循环体内退出。 | LOOP statement; |
REPEAT | 循环语句,直到条件为真时停止。 | REPEAT statement UNTIL condition; |
LEAVE | 退出循环。 | LEAVE loop_label; |
ITERATE | 跳过当前循环迭代,继续下一次迭代。 | ITERATE loop_label; |
六、SQL 语句的通用语法结构
-
SELECT 语句:
SELECT column1, column2 FROM tablename WHERE condition ORDER BY column1 ASC|DESC LIMIT offset, count;
-
INSERT 语句:
INSERT INTO tablename (column1, column2) VALUES (value1, value2);
-
UPDATE 语句:
UPDATE tablename SET column1 = value1, column2 = value2 WHERE condition;
-
DELETE 语句:
DELETE FROM tablename WHERE condition;
-
CREATE TABLE 语句:
CREATE TABLE tablename (column1 datatype constraints,column2 datatype constraints,... );