数据库(Database)是存储在计算机系统中的有组织的、通常是结构化的数据集合。数据库系统允许用户通过特定的方式(如查询语言)来插入、更新、删除和检索数据。
在数据库管理系统(DBMS)中,数据、表和数据库是三个层次不同的概念,它们之间有着明确的层次结构和关系
定义:表是数据库中存储数据的结构化集合。表由行(记录)和列(字段)组成,每一行代表一个数据记录(数据项),每一列代表一个特定的属性或字段。
组成:
数据与表的关系:表格中的每个单元格存储的是具体的数据,即表格的行和列交叉处的值。
举例:例如,员工表 (Employees) 可以包括以下列和行:
ID | 姓名 | 年龄 | 职位 | 工资 |
---|---|---|---|---|
1 | Alice | 30 | 经理 | 5000 |
2 | Bob | 25 | 开发员 | 4000 |
3 | Charlie | 28 | 设计师 | 4500 |
在这个例子中:
定义:数据库是一个存储多个表及其相关数据的容器,是更高一级的数据组织形式。数据库不仅包含表,还包括视图、索引、存储过程、触发器等数据库对象,以及管理这些对象的元数据(如表结构定义)。
表与数据库的关系:数据库包含了多个表,每个表存储特定类型的数据。一个数据库可以看作是数据表的集合,而每个表又是数据记录的集合。
组织结构:数据库中的表之间可能存在关系,例如通过外键实现的表间关联,反映了数据的逻辑关系。
举例:例如,一个公司数据库 (CompanyDB) 可以包含多个表:
Employees
表(存储员工信息)Departments
表(存储部门信息)Salaries
表(存储工资信息)在这个例子中,CompanyDB
是数据库,里面包含了 Employees
、Departments
和 Salaries
等多个表,每个表中又包含具体的数据信息。
总结
数据库管理系统(DatabaseManagementSystem,DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作
DBMS 的核心功能
DBMS的工作模式如下:
数据库的发展可以分为几个阶段,通常被称为第一代、第二代和第三代数据库。每一代数据库技术都在前一代的基础上进行了改进,以适应不断变化的需求和技术进步。
时间:20世纪60年代至70年代
时间:20世纪70年代末至今
时间:20世纪90年代至今
总结
数据模型 | 表格形式,行和列 | 多样化:键值对、文档、列族、图 |
查询语言 | 标准化的 SQL | 多种查询语言,非标准化 |
事务管理 | 支持 ACID 事务 | 通常不支持或部分支持 ACID,强调 CAP 理论 |
扩展性 | 垂直扩展(通过增加单个服务器的能力) | 水平扩展(通过增加服务器数量) |
数据一致性 | 强一致性 | 最终一致性(在一些场景下) |
适用场景 | 复杂查询、事务处理、结构化数据 | 大规模数据、高并发、非结构化数据 |
代表系统 | MySQL、PostgreSQL、Oracle | MongoDB、Cassandra、Redis |
简要对比
在MySQL中,可以使用以下命令来查看当前服务器上存在的所有数据库:
SHOW DATABASES;
这个命令会列出所有可用的数据库。要切换到一个特定的数据库,可以使用USE
命令:
USE database_name;
切换到目标数据库后,可以查看该数据库中的所有表:
SHOW TABLES;
或者,指定数据库名称来查看该数据库中的表:
SHOW TABLES IN database_name;
在管理数据库时,了解表的结构(即字段信息)是至关重要的。可以使用DESCRIBE
命令来查看表的结构:
DESCRIBE table_name;
这将显示以下信息:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
在定义表结构时,选择合适的数据类型非常重要。以下是MySQL中常用的一些数据类型:
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
salary DECIMAL(10, 2),
description TEXT
);
在数据库设计中,主键用于唯一标识表中的每一行记录。主键可以由一个或多个字段组成,后者被称为复合主键。例如:
CREATE TABLE orders (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
MySQL的数据文件存储在服务器的文件系统中,不同的存储引擎会使用不同的文件格式。默认情况下,MySQL的数据文件存放在/usr/local/mysql/data
目录下。
MyISAM存储引擎:
InnoDB存储引擎:
ibdata
文件中。MySQL提供了多种存储引擎,其中最常用的是MyISAM和InnoDB。
MyISAM表的数据文件和索引文件分别存储在.MYD
和.MYI
文件中。而InnoDB的存储则更为复杂,可以选择独立表空间模式(每个表一个.ibd
文件),或者共享表空间模式(使用ibdata
文件)。
SQL语言主要分为以下几类:
DDL语句用于定义和管理数据库结构。常用的DDL语句包括CREATE
、DROP
和ALTER
。
创建新的数据库
CREATE DATABASE 数据库名;
CREATE DATABASE kgc_school;
选择数据库
USE 数据库名;
创建新的表
CREATE TABLE 表名 (
字段1 数据类型,
字段2 数据类型,
...,
PRIMARY KEY (主键名)
);
示例
CREATE TABLE KY13 (
id INT NOT NULL,
name CHAR(10) NOT NULL,
score DECIMAL(5,2),
passwd CHAR(48) DEFAULT '',
PRIMARY KEY (id)
);
显示表结构
DESC 表名;
删除指定的数据表
DROP TABLE 表名;
如果没有选择数据库,则需要指定数据库名:
DROP TABLE 数据库名.表名;
删除指定的数据库
DROP DATABASE 数据库名;
DML语句用于对表中的数据进行管理,包括插入、更新和删除记录。
插入数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
INSERT INTO KY13 (id, name, score, passwd) VALUES (1, 'zhangsan', 70.5, PASSWORD('123456'));
更新数据
UPDATE 表名 SET 字段名1 = 字段值1[, 字段名2 = 字段值2] [WHERE 条件];
UPDATE KY13 SET passwd = PASSWORD('newpassword') WHERE name = 'zhangsan';
UPDATE KY13 SET name = 'wangxiaoer', passwd = '' WHERE id = 3;
删除数据
DELETE FROM 表名 [WHERE 条件];
DELETE FROM KY13 WHERE id = 4;
DQL语句用于从数据表中查询符合条件的数据记录。
查询数据
SELECT 字段名1, 字段名2, ... FROM 表名 [WHERE 条件];
SELECT * FROM KY13;
SELECT id, name, score FROM KY13 WHERE id = 2;
限制查询结果数量
SELECT * FROM 表名 LIMIT 开始位置, 行数;
SELECT * FROM KY13 LIMIT 2; -- 显示前2行
SELECT * FROM KY13 LIMIT 2, 3; -- 从第3行开始显示3行
以列表方式显示
SELECT * FROM 表名 \G;
SELECT * FROM KY13 \G;
DCL语句用于设置和管理数据库的访问权限和安全级别。
GRANT
: 授予用户权限。REVOKE
: 撤销用户权限。COMMIT
: 提交当前事务。ROLLBACK
: 回滚当前事务。这些命令通常用于数据库的安全管理,确保数据的保护和用户权限的控制。
清空表是指删除表中的所有数据而保留表结构。常用的方法有两种:DELETE
和TRUNCATE
。
方法一:使用 DELETE
DELETE FROM 表名;
DELETE
操作不会重置自增长字段的值,新插入的记录会从原来的最大ID继续递增。DELETE
操作是可回滚的,意味着在事务中可以恢复数据。方法二:使用 TRUNCATE
TRUNCATE TABLE 表名;
TRUNCATE
实际上重新创建表,因此速度通常比DELETE
快。TRUNCATE
会重置自增长字段,新的记录ID从1开始。TRUNCATE
操作是不可回滚的。临时表在数据库会话中有效,连接关闭后会自动删除。临时表不能拥有外键约束。
创建临时表:
CREATE TEMPORARY TABLE 表名 (
字段1 数据类型,
字段2 数据类型,
...
[, PRIMARY KEY (主键名)]
);
示例:
CREATE TEMPORARY TABLE temp_table (
id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL,
cardid INT(18) NOT NULL UNIQUE KEY,
hobby VARCHAR(50)
);
操作:
SHOW TABLES
的结果中。注意:
克隆表包括克隆表结构和数据,可以用于备份或迁移数据。
克隆表结构:
CREATE TABLE 新表名 LIKE 原表名;
克隆表数据:
INSERT INTO 新表名 SELECT * FROM 原表名;
示例:
CREATE TABLE backup_table LIKE original_table;
INSERT INTO backup_table SELECT * FROM original_table;
获取表结构:
SHOW CREATE TABLE 新表名\G;
重命名表:
ALTER TABLE 旧表名 RENAME 新表名;
扩展表结构(增加字段):
ALTER TABLE 表名 ADD 字段名 数据类型 [DEFAULT 默认值];
修改字段(列)名和数据类型:
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
修改字段数据类型:
ALTER TABLE 表名 MODIFY COLUMN 字段名 新数据类型;
删除字段:
ALTER TABLE 表名 DROP 字段名;
示例:
ALTER TABLE users ADD address VARCHAR(50) DEFAULT 'Unknown';
ALTER TABLE users CHANGE name username VARCHAR(20) UNIQUE;
ALTER TABLE users MODIFY COLUMN age INT(3);
ALTER TABLE users DROP address;
扩展说明:
IF NOT EXISTS
:在创建表时,如果表已存在则不会报错。AUTO_INCREMENT
:自增长字段,默认从1开始递增。UNIQUE KEY
:确保字段值唯一,但允许空值。NOT NULL
:字段不能为空。