数据库是按照数据结构来组织、存储和管理数据的仓库。随着信息技术的不断发展,数据库已经成为现代信息系统不可或缺的核心组成部分。MySQL作为最流行的开源关系型数据库管理系统之一,因其体积小、速度快、总体拥有成本低而广受开发者和企业的青睐。MySQL支持多种操作系统,提供了丰富的存储引擎选项,能够满足不同业务场景的需求。Navicat是一款功能强大的图形化数据库管理工具,可以帮助用户更直观地进行数据库操作,支持数据库的创建、表的设计、数据的增删改查等功能,大大提高了开发效率。
MySQL的安装过程相对简单,用户可以从官方网站(http://mysql.com/cn/)下载适合自己操作系统的安装包。在安装过程中,需要注意选择合适的安装类型和配置选项。对于初学者来说,使用默认配置通常就能满足日常学习需求。安装完成后,可以通过命令行工具或图形化工具(如Navicat)来连接和管理MySQL服务器。Navicat提供了付费订阅版本和学生认证免费版本,学生可以通过教育邮箱申请免费使用,这对于在校学生来说是一个非常好的学习工具。连接MySQL服务器时,需要注意正确填写主机地址、端口号(默认3306)、用户名和密码等信息,确保能够成功建立连接。
创建数据库是使用MySQL的第一步。在MySQL中,可以使用CREATE DATABASE语句来创建一个新的数据库。基本语法格式如下:
CREATE DATABASE 数据库名;
例如,要创建一个名为"book"的数据库,可以使用以下语句:
CREATE DATABASE book;
在创建数据库时,建议选择有意义的名称,以便于后续的管理和维护。数据库名称应该遵循一定的命名规范,通常使用小写字母和下划线组成,避免使用特殊字符和中文命名。创建数据库时,MySQL会在磁盘上创建一个与数据库名称相同的文件夹,用于存储该数据库的所有数据文件。如果在创建数据库时出现错误,可能是由于数据库名称已存在或者用户权限不足导致的。
查看数据库是了解当前MySQL服务器上有哪些数据库的重要操作。使用SHOW DATABASES语句可以查看所有数据库:
SHOW DATABASES;
执行该语句后,MySQL会返回一个包含所有数据库的列表,其中包括系统自带的数据库(如information_schema、mysql、performance_schema等)和用户创建的数据库。通过查看数据库列表,可以确认数据库是否创建成功,或者了解当前MySQL服务器的管理范围。在使用SHOW DATABASES语句时,需要注意权限问题,普通用户可能只能看到被授权访问的数据库。
在创建或查看数据库之后,需要打开(选择)要使用的数据库,才能对该数据库中的数据表进行操作。使用USE语句可以打开指定的数据库:
USE 数据库名;
例如,要打开名为"book"的数据库:
USE book;
打开数据库后,后续的所有操作都将在该数据库上下文中执行,直到再次使用USE语句切换到其他数据库。在编写MySQL脚本时,通常会在脚本开头先使用USE语句指定要操作的数据库,这样可以避免在每个表名前面都加上数据库名的前缀。值得注意的是,USE语句不需要分号结束,但为了保持与其他SQL语句的一致性,很多开发者仍然习惯在末尾加上分号。
删除数据库是一个需要谨慎操作的行为,因为一旦删除,数据库中的所有数据和表结构都将无法恢复。在MySQL中,使用DROP DATABASE语句可以删除指定的数据库:
DROP DATABASE 数据库名;
例如,要删除名为"book"的数据库:
DROP DATABASE book;
在执行删除操作之前,务必确认数据库中的数据已经备份或者不再需要。删除数据库时,MySQL会物理删除该数据库对应的文件夹及其中的所有文件,因此这个操作是不可逆的。为了防止误删除,可以在DROP DATABASE语句中添加IF EXISTS关键字,这样即使数据库不存在也不会报错:
DROP DATABASE IF EXISTS book;
数据表是数据库中最基本的数据存储单位,由行和列组成。创建数据表需要定义表名、字段名、字段类型等信息。基本语法格式如下:
CREATE TABLE 表名 (
字段1 字段类型1,
字段2 字段类型2,
...
);
例如,创建一个学生信息表:
CREATE TABLE 学生情况 (
学号 VARCHAR(8) PRIMARY KEY,
姓名 VARCHAR(20),
性别 VARCHAR(2),
出生日期 DATE,
所在分院 VARCHAR(20)
);
在创建表时,需要根据数据的特性选择合适的字段类型。常用的字段类型包括:INT(整数)、VARCHAR(可变长度字符串)、DATE(日期)、DATETIME(日期时间)、TEXT(文本)等。字段类型的正确选择对于数据的存储效率和查询性能都有重要影响。此外,还可以在创建表时定义各种约束条件,如主键、唯一键、非空等,以保证数据的完整性和一致性。
创建数据表之后,可以使用多种方式查看表的信息。使用DESCRIBE或DESC语句可以查看表的结构信息:
DESCRIBE 数据表名;
-- 或者
DESC 数据表名;
执行该语句后,会返回表的字段列表,包括字段名、字段类型、是否为空、默认值、键信息等内容。通过查看表结构,可以确认表是否按照预期创建成功,以及各个字段的定义是否正确。
使用SHOW CREATE TABLE语句可以查看表的创建语句,包括详细的表定义信息:
SHOW CREATE TABLE 表名;
这个语句对于了解表的完整定义和复制表结构非常有用。此外,还可以使用SHOW TABLE STATUS命令查看表的行号信息、存储引擎、数据大小等统计信息:
SHOW TABLE STATUS;
修改数据表包括添加列、修改列、删除列、重命名表等操作。使用ALTER TABLE语句可以完成这些修改任务:
在表中添加列:
ALTER TABLE 表名 ADD COLUMN 列名 列类型;
例如,要在学生情况表中添加一个备注字段:
ALTER TABLE 学生情况 ADD COLUMN 备注 VARCHAR(100);
在表中修改列:
修改列名和类型使用CHANGE COLUMN关键字:
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 新列类型;
只修改列类型使用MODIFY COLUMN关键字:
ALTER TABLE 表名 MODIFY COLUMN 列名 新列类型;
在表中修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
删除数据表同样是一个需要谨慎操作的行为。使用DROP TABLE语句可以删除一个或多个数据表:
DROP TABLE [IF EXISTS] 表名1 [, 表名2, 表名3];
例如,删除学生情况表:
DROP TABLE 学生情况;
使用IF EXISTS关键字可以防止报错:
DROP TABLE IF EXISTS 学生情况;
删除数据表时,表中的所有数据都会被永久删除,因此在执行删除操作之前一定要确认数据已经备份或者不再需要。如果要删除有关联关系的数据表,需要先解除外键约束,或者按照正确的顺序删除(先删除子表,再删除父表)。
主键是数据表中每一个数据的唯一标识,用于确保表中每条记录的唯一性。主键可以是单个字段(单字段主键),也可以是多个字段的组合(多字段主键)。主键列的值不能为空,也不能重复。一个表只能有一个主键,但主键可以由多个字段组成。
方法一:在创建数据表时指定主键
CREATE TABLE 图书分类 (
类别编码 VARCHAR(10) PRIMARY KEY,
类别名 VARCHAR(20)
);
方法二:在修改表时添加主键
ALTER TABLE 图书情况 ADD PRIMARY KEY (图书编号);
多字段主键的设置:
CREATE TABLE 借还记录 (
学号 VARCHAR(8),
图书编号 VARCHAR(10),
借阅日期 DATE,
归还日期 DATE,
备注 VARCHAR(100),
PRIMARY KEY (学号, 图书编号, 借阅日期)
);
自增主键是MySQL中的一个特殊功能,可以为每条新记录自动生成唯一的数字值。这对于没有明显业务含义的主键(如ID)非常有用。
基本语法:
字段名 数据类型 AUTO_INCREMENT
示例:
CREATE TABLE 借还记录 (
流水号 INT(4) PRIMARY KEY AUTO_INCREMENT,
学号 VARCHAR(8),
图书编号 VARCHAR(10)
);
设置初始值:
默认情况下,自增字段从1开始自动增长。如果需要设置初始值,可以使用AUTO_INCREMENT属性:
CREATE TABLE 借还记录 (
流水号 INT(4) PRIMARY KEY AUTO_INCREMENT,
学号 VARCHAR(8),
图书编号 VARCHAR(10)
) AUTO_INCREMENT = 100;
重要说明:
非空约束用于指定某个字段的值不能为空。当字段设置了非空约束后,如果用户在添加数据时没有为该字段指定值,数据库系统会报错。
方法一:在创建表时设置非空约束
CREATE TABLE 图书分类 (
图书编号 INT(10) PRIMARY KEY,
图书名 VARCHAR(20) NOT NULL
);
方法二:在修改表时添加非空约束
ALTER TABLE 借还记录
CHANGE COLUMN 借阅日期 借阅日期 DATE NOT NULL;
唯一约束用于确保字段的值不能重复出现,但允许为空值(只能有一个空值)。与主键约束不同,一个表可以有多个唯一约束。
方法一:在创建表时设置唯一约束
CREATE TABLE 图书情况 (
图书编号 VARCHAR(10) PRIMARY KEY,
图书名 VARCHAR(50),
ISBN号 VARCHAR(13) UNIQUE
);
方法二:在修改表时设置唯一约束
ALTER TABLE 图书分类
ADD CONSTRAINT unique_name UNIQUE(图书名);
默认约束用于为字段设置默认值。当添加数据时如果没有为该字段指定值,数据库会自动使用默认值。
方法一:在建表时设置默认值
CREATE TABLE 学生情况 (
学号 VARCHAR(8) PRIMARY KEY,
姓名 VARCHAR(20),
性别 VARCHAR(2) DEFAULT '男',
出生日期 DATE,
所在分院 VARCHAR(20) DEFAULT '信息'
);
方法二:在修改表时设置默认值
ALTER TABLE 学生情况
CHANGE COLUMN 所在分院 所在分院 VARCHAR(20) DEFAULT '信息';
外键约束用于关联两个表之间的关系,确保引用完整性。外键表中的某个字段(外键)引用另一个表的主键字段,从而建立表与表之间的关联关系。
方法一:在创建表时设置外键约束
CREATE TABLE 图书情况 (
图书编号 VARCHAR(10) PRIMARY KEY,
类别编码 VARCHAR(10),
图书名 VARCHAR(50),
FOREIGN KEY (类别编码) REFERENCES 图书分类(类别编码)
);
方法二:在修改表时添加外键
ALTER TABLE 借还记录
ADD CONSTRAINT fk_tsbh
FOREIGN KEY (图书编号)
REFERENCES 图书情况(图书编号);
ALTER TABLE 借还记录
ADD CONSTRAINT fk_xh
FOREIGN KEY (学号)
REFERENCES 学生情况(学号);
向表中添加数据使用INSERT语句。MySQL支持多种添加数据的方式。
向表中全部字段添加记录:
INSERT INTO 学生情况
VALUES ('21080104', '李一蒙', '女', '2003-4-4', '商贸');
向表中部分字段添加记录:
INSERT INTO 学生情况 (学号, 姓名, 性别, 出生日期)
VALUES ('21080105', '吉莉', '女', '2002-4-3');
同时添加多条记录:
INSERT INTO 学生情况 (学号, 姓名, 性别, 出生日期, 所在分院)
VALUES
('21080106', '张三', '男', '2003-1-1', '信息'),
('21080107', '李四', '女', '2002-5-5', '商贸');
使用SET方式添加数据:
INSERT INTO 学生情况
SET 学号 = '21080108', 姓名 = '王五';
修改表中数据使用UPDATE语句。基本语法格式如下:
UPDATE 表名 SET 字段1 = 值1 [, 字段2 = 值2, ...] [WHERE 条件] [ORDER BY 字段] [LIMIT 行数];
修改表中的全部数据:
UPDATE 学生情况 SET 所在分院 = '信息';
这条语句会将表中所有记录的“所在分院”字段更新为“信息”。
按条件修改表中记录:
UPDATE 学生情况
SET 出生日期 = '2002-3-3'
WHERE 学号 = '21080108';
WHERE子句用于指定修改条件,只有满足条件的记录才会被更新。如果不加WHERE条件,将更新表中所有的记录,这在实际操作中需要特别小心。
删除表中数据使用DELETE语句。基本语法格式如下:
DELETE FROM 表名 [WHERE 条件] [ORDER BY 字段] [LIMIT 行数];
按条件删除记录:
DELETE FROM 学生情况 WHERE 学号 = '21080108';
删除表中全部记录:
DELETE FROM 学生情况;
删除表中全部记录会保留表结构,但删除所有数据。与DELETE相比,TRUNCATE语句可以更快速地清空表中的所有记录:
TRUNCATE TABLE 学生情况;
TRUNCATE语句会删除表中所有记录并重新设置自增字段的起始值,执行效率比DELETE高,但对于有外键约束的表可能无法执行。
数据查询是数据库操作中最常用也是最重要的功能。使用SELECT语句可以从表中检索数据。
查询表中全部数据:
SELECT * FROM 图书情况;
星号(*)表示查询所有字段。
查询表中部分字段:
SELECT 图书编号, 图书名 FROM 图书情况;
查询结果字段重命名:
SELECT 图书编号, 图书名 AS '图书名称' FROM 图书情况;
使用AS关键字可以为查询结果中的字段设置别名,使结果更易读。
使用WHERE子句可以设置查询条件,筛选满足条件的记录。
SELECT 图书编号, 图书名, 出版社
FROM 图书情况
WHERE 出版社 = '清华大学出版社';
这条语句查询清华大学出版社出版的所有书籍。
使用DISTINCT关键字可以去掉查询结果中的重复记录。
SELECT DISTINCT 出版社 FROM 图书情况;
使用ORDER BY子句可以对查询结果进行排序。ASC表示升序(默认),DESC表示降序。
SELECT 图书编号, 图书名, 定价
FROM 图书情况
ORDER BY 定价 DESC;
这条语句按定价从高到低排序查询结果。
比较运算符:
| 运算符 | 说明 |
|---|---|
| = | 等于 |
| <> 或 != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
示例:查询定价大于等于30元的图书
SELECT 图书编号, 图书名, 定价
FROM 图书情况
WHERE 定价 >= 30
ORDER BY 定价;
BETWEEN AND:
用于判断一个值是否在两个值之间。
SELECT 图书编号, 图书名, 定价
FROM 图书情况
WHERE 定价 BETWEEN 20 AND 30;
IS NULL / IS NOT NULL:
判断字段是否为空。
SELECT * FROM 学生情况 WHERE 所在分院 IS NULL;
IN:
判断字段是否在指定的集合中。
SELECT * FROM 学生情况 WHERE 所在分院 IN ('信息', '商贸');
使用LIKE关键字可以进行模糊查询,常配合通配符使用。
| 通配符 | 说明 |
|---|---|
| % | 匹配任意多个字符 |
| _ | 匹配单个字符 |
SELECT * FROM 学生情况 WHERE 姓名 LIKE '张%';
这条语句查询所有姓“张”的学生。
SELECT * FROM 学生情况 WHERE 姓名 LIKE '_三';
这条语句查询姓名第二个字是“三”的学生(如“张三”、“李三”等)。
| 运算符 | 说明 |
|---|---|
| AND | 逻辑与 |
| OR | 逻辑或 |
| NOT | 逻辑非 |
SELECT * FROM 学生情况 WHERE 所在分院 = '信息' AND 性别 = '男';
SELECT * FROM 学生情况 WHERE 所在分院 = '信息' OR 所在分院 = '商贸';
连接查询是将两个或多个表根据一定的条件组合在一起的查询方式。常见的连接类型包括内连接、外连接等。
内连接(INNER JOIN):
内连接只返回两个表中匹配到的记录。
SELECT 图书情况.图书编号, 图书情况.图书名, 图书分类.类别名
FROM 图书情况
INNER JOIN 图书分类 ON 图书情况.类别编码 = 图书分类.类别编码;
左外连接(LEFT JOIN):
左外连接返回左表中的所有记录以及右表中匹配的记录。
SELECT 图书情况.图书编号, 图书情况.图书名, 图书分类.类别名
FROM 图书情况
LEFT JOIN 图书分类 ON 图书情况.类别编码 = 图书分类.类别编码;
右外连接(RIGHT JOIN):
右外连接返回右表中的所有记录以及左表中匹配的记录。
SELECT 图书情况.图书编号, 图书情况.图书名, 图书分类.类别名
FROM 图书情况
RIGHT JOIN 图书分类 ON 图书情况.类别编码 = 图书分类.类别编码;
在使用连接查询时,如果两个表中的关联字段名称相同,可以使用USING关键字简化查询语句。
SELECT *
FROM A
JOIN B USING (id);
这条语句等价于:
SELECT *
FROM A
INNER JOIN B ON A.id = B.id;
使用UNION关键字可以将多个查询的结果合并在一起。
(SELECT * FROM 表1 WHERE 条件 ORDER BY 字段)
UNION
(SELECT * FROM 表2 WHERE 条件 ORDER BY 字段);
需要注意的是,每个SELECT语句必须返回相同数量的字段,且对应字段的类型应该兼容。UNION会自动去掉重复的记录,如果要保留重复记录,可以使用UNION ALL。
子查询是指在一个查询语句中嵌套另一个完整的查询语句。子查询可以返回单个值、一行数据、一列数据或一个表。
标量子查询:
返回单个值的子查询。
SELECT * FROM 图书情况
WHERE 定价 > (SELECT AVG(定价) FROM 图书情况);
行子查询:
返回一行多列的结果。
SELECT * FROM 员工表
WHERE (部门编号, 薪资) IN
(SELECT 部门编号, MAX(薪资) FROM 员工表 GROUP BY 部门编号);
表子查询:
返回多行多列的结果,可以作为临时表使用。
SELECT e.姓名, e.薪资, d.平均薪资
FROM 员工表 e
JOIN (
SELECT 部门编号, AVG(薪资) AS 平均薪资
FROM 员工表
GROUP BY 部门编号
) d ON e.部门编号 = d.部门编号
WHERE e.薪资 > d.平均薪资;
** EXISTS子查询:**
用于检查子查询是否返回任何行。
SELECT 姓名 FROM 员工 e
WHERE EXISTS (
SELECT 1 FROM 部门 d WHERE d.经理编号 = e.员工编号
);
| 函数 | 说明 |
|---|---|
| COUNT() | 统计记录数 |
| SUM() | 求和 |
| AVG() | 求平均值 |
| MAX() | 求最大值 |
| MIN() | 求最小值 |
| 函数 | 说明 |
|---|---|
| CONCAT() | 拼接字符串 |
| LENGTH() | 获取字符串长度 |
| UPPER() | 转换为大写 |
| LOWER() | 转换为小写 |
| SUBSTRING() | 截取字符串 |
| 函数 | 说明 |
|---|---|
| NOW() | 获取当前日期时间 |
| CURDATE() | 获取当前日期 |
| CURTIME() | 获取当前时间 |
| YEAR() | 提取年份 |
| MONTH() | 提取月份 |
| DAY() | 提取日期 |
| DATE_FORMAT() | 格式化日期 |