🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 什么是数据库 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。 RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1.数据以表格的形式出现 2.每行为各种记录名称 3.每列为记录名称所对应的数据域 4.许多的行和列组成一张表单 5.若干的表单组成database ## RDBMS常见术语 * **数据库:** 数据库是一些关联表的集合。. * **数据表:** 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 * **列:** 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。 * **行:**一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。 * **冗余**:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept\_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept\_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept\_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。) * **主键**:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。 * **外键:**外键用于关联两个表。 * **复合键**:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 * **索引:**使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。 * **参照完整性:** 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。 ## 初识MySQL Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 * Mysql是开源的,所以你不需要支付额外的费用。 * Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 * MySQL使用标准的SQL数据语言形式。 * Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。 * Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。 * MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。 * Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。 ## MySQL安装 ### Linux安装MySQL 参考博客:https://www.cnblogs.com/phpxiebin/p/4988156.html ### Windows安装MySQL 方式一:官网下载直接安装,网址`http:``/``/``dev.mysql.com``/``downloads``/``mysql``/` 方式二:压缩包安装,参考博客:https://www.cnblogs.com/wusir66/p/9726933.html ## 数据库基础操作 ### 用户操作 ~~~ 创建用户: create user '用户名'@'主机名(%表示任意)' identified by '密码'; 例: create user 'wusir'@'192.168.1.1' identified by '123123'; create user 'wusir'@'192.168.1.%' identified by '123123'; create user 'wusir'@'%' identified by '123123'; 删除用户 drop user '用户名'@'IP地址'; 修改用户: rename user '用户名'@'IP地址' to '新用户名'@'新IP地址'; 修改密码: set password for '用户名'@'IP地址' = Password('新密码'); PS:用户相关的信息保存在mysql库中的user表里 ~~~ ### 授权 ~~~ 格式: grant 具体操作的权限 on 数据库.表 to '用户名'@'主机名'; 例: grant select,insert,update on db1.t1 to 'wusir'@'%'; grant all privileges on db1.t1 to 'wusir'@'%'; ~~~ ### 数据中常见的数据类型 ~~~ 数字: 整数: ~~~ ~~~ tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 ~ 127. 无符号: 0 ~ 255 ~~~ ~~~     int[(m)][unsigned][zerofill] 整数,数据类型用于保存一些范围的整数数值范围: 有符号: -2147483648 ~ 2147483647 无符号: 0 ~ 4294967295 ~~~ ~~~     bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围: 有符号: -9223372036854775808 ~ 9223372036854775807 无符号: 0 ~ 18446744073709551615 ~~~ ~~~ 小数: ~~~ ~~~ decimal[(m[,d])] [unsigned] [zerofill] 准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。 特别的:对于精确数值计算时需要用此类型 decaimal能够存储精确值的原因在于其内部按照字符串存储。 ~~~ ~~~ FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。 无符号: -3.402823466E+38 to -1.175494351E-38, 0 1.175494351E-38 to 3.402823466E+38 有符号: 0 1.175494351E-38 to 3.402823466E+38 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。 无符号: -1.7976931348623157E+308 to -2.2250738585072014E-308 0 2.2250738585072014E-308 to 1.7976931348623157E+308 有符号: 0 2.2250738585072014E-308 to 1.7976931348623157E+308 字符串 ~~~ ~~~    char (m) char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。 PS: 即使数据小于m长度,也会占用m长度 varchar(m) varchar数据类型用于变长的字符串,MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据。其中m代表该数据 类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。 注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。 因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡 text text数据类型用于保存变长的大字符串,可以组多到65535(2**16 − 1)bytes mediumtext A TEXT column with a maximum length of 16777215 (2**24 − 1)bytes longtext A TEXT column with a maximum length of 4294967295 or 4GB (2**32 − 1)bytes ~~~ ~~~ enum 枚举类型, An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) 示例: CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small'); set 集合类型 A SET column can have a maximum of 64 distinct members. 示例: CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); ~~~ ~~~ TIME ~~~ ~~~ DATE YYYY-MM-DD(1000-01-01/9999-12-31) TIME HH:MM:SS('-838:59:59'/'838:59:59') YEAR YYYY(1901/2155) DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时) ~~~ ### 数据库基本操作 ~~~ show databases; #显示有哪些数据库 use 数据库名称; #切换到选择的数据库 show tables; #展示当前数据库下有哪些表 create database db2 default charset utf8; 完整的创建一个数据库 drop database db2; 删除一个数据库 create table t1(id int primary key auto_increment,name char(10))engine=innodb default charset=utf8; 创建一个包含主键id和name字段的表 delete from t1; 清空表(id计数仍从清空前计数) truncate table t1; 清空表(id计数从1计数) drop table t1; 删除表 desc 表名; 查看表的字段 show create table 表名; show create table 表名\G; 查看表的创建语句 show variables like '%datadir%'; 查看mysql数据存储路径信息 show variables like "%char%"; 查看mysql编码 ~~~ ``` 主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。 create table tb1( nid int not null auto_increment primary key, num int null ) 或 create table tb1( nid int not null, num int not null, primary key(nid,num) ) 主键 ``` ``` 外键,一个特殊的索引,只能是指定内容 creat table color( nid int not null primary key, name char(16) not null ) create table fruit( nid int not null primary key, smt char(32) null , color_id int not null, constraint fk_cc foreign key (color_id) references color(nid) ) 外键 ``` 表的基本操作 1、增 ~~~ insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) ~~~ 2、删 ~~~ delete from 表 delete from 表 where id=1 ~~~ 3、改 ~~~ update 表 set name = 'wusir' where id>1 ~~~ 4、查 ~~~ select * from 表 select * from 表 where id > 1 select nid,name,gender from 表 where id > 1 ~~~