1. 数据库操作
-
创建数据库
-
语法:
CREATE DATABASE 数据库名 [CHARACTER SET 字符集] [COLLATE 排序规则];
-
示例:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
这里创建了一个名为mydb
的数据库,字符集是utf8mb4
,排序规则是utf8mb4_general_ci
。
-
-
查看数据库
-
语法:
SHOW DATABASES;
用于列出所有数据库。
-
-
使用数据库
-
语法:
USE 数据库名;
例如:USE mydb;
表示切换到mydb
数据库,后续操作默认在这个数据库中进行。
-
-
删除数据库
-
语法:
DROP DATABASE 数据库名;
例如:DROP DATABASE mydb;
会删除mydb
数据库,注意这个操作会丢失数据库中的所有数据,要谨慎使用。
-
2. 数据表操作
-
创建数据表
-
语法:
-
CREATE TABLE 表名 (
-
列名1 数据类型 [约束],
-
列名2 数据类型 [约束],
-
...
-
[表级约束]
-
);
-
-
示例:
-
CREATE TABLE students (
-
id INT AUTO_INCREMENT PRIMARY KEY,
-
name VARCHAR(50) NOT NULL,
-
age INT CHECK (age > 0 AND age < 150),
-
gender ENUM('M', 'F') NOT NULL
-
);
-
这里创建了一个名为
students
的表,其中id
是整型,自动递增,作为主键;name
是长度最多 50 个字符的字符串,不能为空;age
是整型,通过检查约束限制年龄范围;gender
是枚举类型,只能取'M'
或'F'
,且不能为空。
-
-
-
查看数据表结构
-
语法:
DESCRIBE 表名;
或SHOW COLUMNS FROM 表名;
例如:DESCRIBE students;
可以查看students
表的列名、数据类型、是否为空等信息。
-
-
修改数据表
-
添加列
-
语法:
ALTER TABLE 表名 ADD 列名 数据类型 [约束];
例如:ALTER TABLE students ADD email VARCHAR(100);
给students
表添加了一个名为email
的列,数据类型是长度最多 100 个字符的字符串。
-
-
修改列
-
语法:
ALTER TABLE 表名 MODIFY 列名 数据类型 [约束];
例如:ALTER TABLE students MODIFY name VARCHAR(100);
将students
表中name
列的数据类型从原来的VARCHAR(50)
修改为VARCHAR(100)
。
-
-
删除列
-
语法:
ALTER TABLE 表名 DROP 列名;
例如:ALTER TABLE students DROP email;
删除students
表中的email
列。
-
-
重命名表
-
语法:
RENAME TABLE 原表名 TO 新表名;
例如:RENAME TABLE students TO pupils;
将students
表重命名为pupils
。
-
-
-
删除数据表
-
语法:
DROP TABLE 表名;
例如:DROP TABLE students;
会删除students
表,表中的数据也会丢失,要谨慎操作。
-
3. 数据操作
-
插入数据
-
插入完整数据行
-
语法:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);
-
示例:
INSERT INTO students (name, age, gender) VALUES ('Alice', 20, 'F');
向students
表中插入一行数据,name
是'Alice'
,age
是20
,gender
是'F'
。
-
-
插入多行数据
-
语法:
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), ...;
-
示例:
INSERT INTO students (name, age, gender) VALUES ('Bob', 22, 'M'), ('Charlie', 21, 'M');
一次性插入两行数据。
-
-
插入部分数据(省略列名)
-
语法:
INSERT INTO 表名 VALUES (值1, 值2, ...);
但是要求值的顺序和表中列的顺序一致,且不能遗漏非空列。 -
示例:
INSERT INTO students VALUES (1, 'David', 18, 'M');
假设students
表的列顺序是id
、name
、age
、gender
,这里插入一行数据,id
是1
,name
是'David'
,age
是18
,gender
是'M'
。
-
-
-
查询数据
-
基本查询
-
语法:
SELECT 列名1, 列名2, ... FROM 表名;
例如:SELECT name, age FROM students;
查询students
表中name
和age
列的所有数据。
-
-
查询所有列
-
语法:
SELECT * FROM 表名;
例如:SELECT * FROM students;
查询students
表中所有列的所有数据。
-
-
带条件查询
-
语法:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件;
例如:SELECT name, age FROM students WHERE age > 18;
查询students
表中age
大于18
的name
和age
列的数据。
-
-
排序查询
-
语法:
SELECT 列名1, 列名2, ... FROM 表名 ORDER BY 列名 [ASC|DESC];
例如:SELECT name, age FROM students ORDER BY age DESC;
查询students
表中name
和age
列的数据,并按照age
列降序排列。
-
-
分组查询
-
语法:
SELECT 列名1, 列名2, ... FROM 表名 GROUP BY 列名 [HAVING 条件];
例如:SELECT gender, COUNT(*) FROM students GROUP BY gender;
查询students
表中按gender
分组的每组人数。
-
-
分页查询
-
语法:
SELECT 列名1, 列名2, ... FROM 表名 LIMIT 偏移量, 行数;
例如:SELECT * FROM students LIMIT 0, 10;
查询students
表中从第 0 行开始的 10 行数据,常用于分页显示。
-
-
-
更新数据
-
语法:
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... WHERE 条件;
例如:UPDATE students SET age = 21 WHERE name = 'Alice';
将students
表中name
为'Alice'
的记录的age
更新为21
。注意使用WHERE
条件限定更新的记录范围,否则可能会更新表中所有记录。
-
-
删除数据
-
语法:
DELETE FROM 表名 WHERE 条件;
例如:DELETE FROM students WHERE age > 30;
删除students
表中age
大于30
的记录。同样,使用WHERE
条件限定删除的记录范围,否则可能会删除表中所有记录。
-
4. 数据类型
-
数值类型
-
TINYINT
:范围是 -128 到 127(有符号)或 0 到 255(无符号)。 -
SMALLINT
:范围是 -32768 到 32767(有符号)或 0 到 65535(无符号)。 -
MEDIUMINT
:范围是 -8388608 到 8388607(有符号)或 0 到 16777215(无符号)。 -
`INT
或
INTEGER:范围是 -2147483648 到 2147483647(有符号)或 0 到 4294967295(无符号)。
-
BIGINT:范围是 -9223372036854775808 到 9223372036854775807(有符号)或 0 到 18446744073709551615(无符号)。
FLOAT:单精度浮点数,用于表示小数。
DOUBLE:双精度浮点数,精度比
FLOAT高
DECIMAL`:定点数,用于表示精确的小数,适合存储货币等需要精确计算的数值。
-
字符串类型
-
CHAR
:固定长度的字符串,最大长度是 255 个字符,如果存储的字符串长度小于定义长度,会用空格填充。 -
VARCHAR
:可变长度的字符串,最大长度是 65535 个字符(受 MySQL 最大行大小限制),存储时只占用实际长度加上一个长度前缀的存储空间。 -
TEXT
:用于存储较大的文本数据,有多种类型,如TINYTEXT
(最大长度 255 字节)、TEXT
(最大长度 65535 字节)、MEDIUMTEXT
(最大长度 16777215 字节)、LONGTEXT
(最大长度 4294967295 字节)。 -
BLOB
:用于存储二进制数据,也有多种类型,如TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
,与TEXT
类型类似,但用于存储二进制数据。
-
-
日期和时间类型
-
DATE
:格式为YYYY-MM-DD
,用于存储日期。 -
TIME
:格式为HH:MM:SS
,用于存储时间。 -
DATETIME
:格式为YYYY-MM-DD HH:MM:SS
,用于存储日期和时间。 -
TIMESTAMP
:范围是'1970-01-01 00:00:01'
到'2038-01-19 03:14:07'
,用于存储时间戳,自动转换为 UTC 时间。 -
YEAR
:用于存储年份,可以是两位或四位数字。
-
5. 约束
-
主键约束(PRIMARY KEY)
-
用于唯一标识表中的每一行记录,一个表中只能有一个主键,主键列的值不能重复且不能为
NULL
。例如在创建表时:id INT PRIMARY KEY
,或者在表创建后:ALTER TABLE 表名 ADD PRIMARY KEY (列名);
。
-
-
外键约束(FOREIGN KEY)
-
用于建立两个表之间的关联关系,一个表的外键列的值必须是另一个表的主键列的值或
NULL
。语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 被引用表名 (被引用列名);
例如:ALTER TABLE orders ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customers (id);
假设orders
表的customer_id
列是外键,引用customers
表的id
列。
-
-
唯一约束(UNIQUE)
-
用于保证列中的值不重复,但可以有
NULL
值。语法:ALTER TABLE 表名 ADD CONSTRAINT 唯一约束名 UNIQUE (列名);
例如:ALTER TABLE students ADD CONSTRAINT unique_email UNIQUE (email);
保证students
表的email
列的值是唯一的。
-
-
非空约束(NOT NULL)
-
用于限制列的值不能为
NULL
。在创建表时可以直接指定:name VARCHAR(50) NOT NULL
,或者在表创建后:ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;
。
-
-
默认约束(DEFAULT)
-
用于为列指定默认值,当插入数据时没有指定该列的值时,会自动填充默认值。语法:
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
例如:ALTER TABLE students ALTER age SET DEFAULT 18;
。
-
-
检查约束(CHECK)
-
用于限制列的值必须满足某个条件。语法:
ALTER TABLE 表名 ADD CONSTRAINT 检查约束名 CHECK (条件);
例如:ALTER TABLE students ADD CONSTRAINT chk_age CHECK (age > 0 AND age < 150);
限制students
表的age
列的值必须大于0
且小于150
。
-
6. 事务
-
开启事务
-
语法:
START TRANSACTION;
或BEGIN;
。
-
-
提交事务
-
语法:
COMMIT;
提交事务,使事务中的所有操作永久生效。
-
-
回滚事务
-
语法:
ROLLBACK;
回滚事务,撤销事务中的所有操作。
-
-
设置事务隔离级别
-
语法:
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
MySQL 支持的隔离级别有READ UNCOMMITTED
、READ COMMITTED
、REPEATABLE READ
(默认级别)、SERIALIZABLE
。
-
7. 索引
-
创建索引
-
语法:
CREATE INDEX 索引名 ON 表名 (列名);
例如:CREATE INDEX idx_name ON students (name);
在students
表的name
列上创建一个名为idx_name
的索引,可以加快按name
列查询数据的速度。
-
-
查看索引
-
语法:
SHOW INDEX FROM 表名;
例如:SHOW INDEX FROM students;
可以查看students
表的所有索引信息。
-
-
删除索引
-
语法:
DROP INDEX 索引名 ON 表名;
例如:DROP INDEX idx_name ON students;
删除students
表上的idx_name
索引。
-