数据库概述:数据库是按照一定的数据结构将数据存储在存储器的集合
常见数据库软件
软件名 | 开源 | 跨平台 | 厂 商 |
---|---|---|---|
Oracle | 否 | 是 | 甲骨文 |
MySQL | 是 | 是 | 甲骨文 |
SQL Server | 否 | 否 | 微软 |
DB2 | 否 | 是 | IBM |
openGauss | 是 | 是 | 华为 |
Redis | 是 | 是 | 开源软件 |
Memcached | 是 | 是 | 开源软件 |
openGauss | 是 | 是 | 华为 |
DB (DataBase)
DBMS (DataBase Management System)
数据库管理系统
用来操纵和管理数据库的服务软件
DBS (DataBase System)
主机名 | 内网IP地址 |
---|---|
mysql | 192.168.8.100(VMnet8网络模式) |
配置基础环境
[root@localhost ~]# hostnamectl set-hostname mysql
[root@mysql ~]# nmcli connection modify ens33 ipv4.method auto connection.autoconnect yes
[root@mysql ~]# nmcli connection up ens33
配置yum,使用阿里云的镜像站点
[root@localhost ~]# rm -rf /etc/yum.repos.d/*.repo #删除自带的repo文件
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo \ https://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里镜像源
将学习环境中的:C-4软件运维\05_医疗项目\HIS医疗项目\mysql8-centos7上传到虚拟机mysql的/root/
mysql主机操作
[root@mysql ~]# cd /root/mysql8-centos7
[root@mysql ~]# yum -y localinstall *.rpm #安装mysql
[root@mysql ~]# systemctl start mysqld #启动服务
[root@mysql ~]# systemctl enable mysqld #开机运行
[root@mysql ~]# ss -utnlp | grep :3306 #查看服务信息
软件相关的目录与文件等
文件 | 说明 |
---|---|
主配置文件 | /etc/my.cnf.d/mysql-server.cnf |
数据库目录 | /var/lib/mysql |
端口号 | 3306 |
进程名 | mysqld |
传输协议 | TCP |
进程所有者 | mysql |
进程所属组 | mysql |
错误日志文件 | /var/log/mysql/mysqld.log |
数据库管理员名为 root
连接命令: mysql -h数据库地址 -u用户 -p密码
首次启动之后数据库管理root的密码存放再/var/log/mysqld.log中
连接时不指定密码,默认为无密码
[root@mysql mysql8-centos7]# grep -i password /var/log/mysqld.log #过滤root初始密码
2023-08-08T14:22:39.197619Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 3Izdh9OY6&Ef
连接mysql(每个人过滤到的mysql管理员root的初始密码都是随机的,不要照抄,建议加上’')
[root@mysql ~]# mysql -uroot -p'3Izdh9OY6&Ef'
mysql> ALTER USER root@"localhost" IDENTIFIED BY "tedu123...A"; #修改登陆密码
[root@mysql ~]# mysql -hlocalhost -uroot -p'tedu123...A' #使用新密码登陆
管理数据库使用SQL(结构化查询语言)
DDL 数据定义语言 如:CREATE、ALTER、DROP
DML 数据操作语言 如:INSERT、UPDATE、DELETE
DCL 数据控制语言 如:GRANT、REVOKE
DTL 数据事务语言 如:COMMIT、ROLLBACK、SAVEPOINT
SQL命令不区分字母大小写(密码、变量值除外)
每条SQL命令以;结束
默认命令不支持Tab键自动补齐
\c 终止sql命令
SHOW DATABASES;
#显示已有的库SELECT USER();
#显示连接用户USE 库名;
#切换库SELECT DATABASE();
#显示当前所在的库CREATE DATABASE 库名;
#创建新库SHOW TABLES;
#显示已有的表DROP DATABASE 库名;
#删除库mysql> CREATE DATABASE DB1; #创建库DB1
Query OK, 1 row affected (0.06 sec)
mysql> CREATE DATABASE db1; #创建库db1
Query OK, 1 row affected (0.03 sec)
mysql> CREATE DATABASE haha; #创建库haha
Query OK, 1 row affected (0.03 sec)
mysql> USE DB1; #切换至DB1库
mysql> SHOW TABLES; #查看DB1库里有哪些表
mysql> DROP DATABASE haha; #删除库haha
mysql> SELECT USER(); #查看当前登录数据库的用户
SELECT DATABASE(); #查看当前所在库
mysql> CREATE TABLE 库名.表名(
字段名1 类型(宽度),
字段名2 类型(宽度),
……
)DEFAULT CHARSET=utf8;
创建db1.stuinfo表,包含name字段、homeaddr字段,指定字符集为utf8
mysql> CREATE TABLE db1.stuinfo(
-> name CHAR(15),
-> homeaddr CHAR(20)
-> ) DEFAULT CHARSET=utf8;
mysql> DESC db1.stuinfo;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| name | char(15) | YES | | NULL | |
| homeaddr | char(20) | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
查询
SELECT * FROM 库名.表名;
插入
INSERT INTO 库名.表名 VALUES(值列表);
修改
UPDATE 库名.表名 SET 字段=值;
删除
DELETE FROM 表名;
向db1.stuinfo表里插入一行记录
mysql> INSERT INTO db1.stuinfo VALUES("sam","Beijing");
查询db1.stuinfo表格里的所有数据
mysql> SELECT * FROM db1.stuinfo;
修改db1.stuinfo表格里边的homeaddr字段内容为"Shanghai"
mysql> UPDATE db1.stuinfo SET homeaddr="Shanghai";
删除db1.stuinfo表里边的所有数据
mysql> DELETE FROM db1.stuinfo;
mysql> SELECT * FROM db1.stuinfo; #查看验证
CHAR
(字符个数)
mysql> CREATE TABLE db1.t1(name char(5) , homedir CHAR(50) ); #创建表格
mysql> INSERT INTO db1.t1 VALUES("bob","USA"); #写入数据
变长:VARCHAR
(字符个数)
按数据实际大小分配存储空间(0-65535)
字符个数超出时,无法写入数据。
大文本类型:text/blob
字符数大于65535存储时使用
创建db1.t2表,包含name CHAR(5)、email VARCHAR(30)
mysql> CREATE TABLE db1.t2(name CHAR(5),
-> email VARCHAR(30)
-> );
mysql> INSERT INTO db1.t2 VALUES("lucy","[email protected]");
类 型 | 名称 | 有符号范围 | 无符号范围 |
---|---|---|---|
TINYINT | 微小整数 | -128~127 | 0 ~ 255 |
SMALLINT | 小整数 | -32768~32767 | 0 ~ 65535 |
MEDIUMINT | 中整型 | -223 ~ 223-1 | 0 ~ 224-1 |
INT | 大整型 | -231 ~ 231-1 | 0 ~ 232-1 |
BIGINT | 极大整型 | -263 ~ 263-1 | 0 ~ 264-1 |
UNSIGNED | 使用无符号存储范围 |
类 型 | 名称 | 有符号范围 | 无符号范围 |
---|---|---|---|
FLOAT | 单精度 | -3.402823466E+38 到 -1.175494351E-38 | 1.175494351E-38 到 3.402823466E+38 |
DOUBLE | 双精度 | -1.7976931348623157E+308到 -2.2250738585072014E-308 | 2.2250738585072014E-308 到 1.7976931348623157E+308 |
mysql> CREATE TABLE db1.t3(pay FLOAT , id DOUBLE);
mysql> CREATE TABLE db1.t4(pay FLOAT(5,2) , id DOUBLE(4,2) );
DATE
YEAR
TIME
DATETIME
TIMESTAMP
类 型 | 用 途 |
---|---|
CURTIME( ) | 获取当前的系统时间"时:分:秒"部分 |
CURDATE( ) | 获取当前的系统时间"年-月-日"部分 |
NOW( ) | 获取当前系统时间"年-月-日 时:分:秒" |
YEAR(NOW()) | 获取年 |
MONTH(NOW( )) | 获取月 |
DAY(NOW()) | 获取日 |
DATE(NOW()) | 获取日期"年-月-日" |
TIME(NOW()) | 获取时间"时:分:秒" |
[root@mysql ~] mysql -uroot -p'密码' #连接数据库
mysql> SELECT CURTIME(); #查看"时:分:秒"
mysql> SELECT CURDATE(); #查看"年-月-日"
mysql> SELECT NOW(); #查看"年-月-日 时:分:秒"
mysql> SELECT YEAR(NOW()); #查看"年-月-日 时:分:秒"
[root@mysql ~]# mysql –uroot –p密码 #连接数据库
mysql> CREATE DATABASE bbsdb; #创建库bbsdb
创建bbsdb.t5表
mysql> CREATE TABLE bbsdb.t5(name CHAR(15),s_year YEAR,
-> school_time TIME, birthday DATE,
-> party DATETIME);
向bbsdb.t5表插入数据
mysql> INSERT INTO bbsdb.t5 VALUES("sam",1980,"19:00:00",
-> "1980-10-06","2029-06-18 12:05:16");
查询bbsdb.t5表数据
mysql> SELECT * FROM bbsdb.t5;
+------+--------+-------------+------------+---------------------+
| name | s_year | school_time | birthday | party |
+------+--------+-------------+------------+---------------------+
| sam | 1980 | 19:00:00 | 1980-10-06 | 2029-06-18 12:05:16 |
+------+--------+-------------+------------+---------------------+
1 row in set (0.00 sec)
创建db1.t5表,包含name字段 CHAR类型15个宽度,sex字段单选枚举类型(“boy”,“girl”,“other”)
mysql> CREATE TABLE db1.t5(
-> name CHAR(15),
-> sex ENUM("boy","girl","other")
-> );
向db1.t5表插入数据
mysql> INSERT INTO db1.t5 VALUES("sam","boy");
创建db1.t6表,包含name字段CHAR类型5个宽度,likes字段多选枚举类型(“eat”, “game” , “music”, “money”)
mysql> CREATE TABLE db1.t6(
-> name CHAR(5),
-> likes SET("eat", "game" , "music", "money" )
-> );
向db1.t6表插入数据
mysql> INSERT INTO db1.t6 VALUES("lisi","eat,game,music");
NULL
允许为空(默认设置)NOT NULL
不允许为空KEY
键值类型DEFAULT
设置默认值,缺省为NULLEXTRA
额外设置mysql> CREATE TABLE db1.t7(
-> name CHAR(10) NOT NULL,
-> age TINYINT UNSIGNED DEFAULT 19,
-> class CHAR(7) NOT NULL DEFAULT "nsd",
-> pay FLOAT(7,2) DEFAULT 28000
-> );
插入数据,不使用默认值
mysql> INSERT INTO db1.t7 VALUES ('Alice', 22, 'nsd', 35000.50);
插入数据,使用默认值
mysql> INSERT INTO db1.t7(name) VALUES("Bob");
查询db1.t7表中的数据
mysql> SELECT * FROM db1.t7;
+-------+------+-------+----------+
| name | age | class | pay |
+-------+------+-------+----------+
| Alice | 22 | nsd | 35000.50 |
| Bob | 19 | nsd | 28000.00 |
+-------+------+-------+----------+
2 rows in set (0.00 sec)
mysql> ALTER TABLE 库名.表名 执行动作;
ADD
添加字段MODIFY
修改字段类型CHANGE
修改字段名DROP
删除字段RENAME
修改表名修改db1.t6表,在likes字段后,添加home字段VARCHAR类型20个宽度
mysql> ALTER TABLE db1.t6 ADD home VARCHAR(20) AFTER likes;
修改db1.t6表结构,将home字段修改为CHAR类型,30个宽度
mysql> ALTER TABLE db1.t6 MODIFY home CHAR(30) ;
删除db1.t6表中的home字段
mysql> ALTER TABLE db1.t6 DROP home ;
修改db1.t6表中name字段为user,VARCHAR类型30个宽度
mysql> ALTER TABLE db1.t6 CHANGE name user VARCHAR(30);
修改db1.t6表名为db1.userinfo
mysql> ALTER TABLE db1.t6 rename db1.userinfo;
mysql> CREATE TABLE db1.t9( id CHAR(6) NOT NULL,
-> name VARCHAR(4) NOT NULL, age INT NOT NULL,
-> gender ENUM("male","female"), INDEX(id),INDEX(name));
CREATE INDEX 索引名 ON 表名(字段名);
DROP INDEX 索引名 ON 表名;
在db1.t9表中将age字段设置为索引字段,索引名为age_index
mysql> CREATE INDEX age_index ON db1.t9 (age);
删除db1.t9表中的age_index字段
mysql> DROP INDEX age_index ON db1.t9;
SHOW INDEX FROM 库名.表名 \G;
查看db1.t9表索引
mysql> SHOW INDEX FROM db1.t9 \G
单列主键测试
mysql> CREATE DATABASE execdb; #创建execdb
mysql> USE execdb; #使用execdb库
mysql> CREATE TABLE t4 (name CHAR(5) PRIMARY KEY); #设置主键约束语法1
mysql> DESC t4;
mysql> CREATE TABLE t5 (name CHAR(5),PRIMARY KEY(name)); #设置主键约束语法2
mysql> DESC t5;
mysql> INSERT INTO t5 VALUES ('zhsan'); #写入成功
mysql> INSERT INTO t5 VALUES ('zhsan'); #值重复,写入失败
ERROR 1062 (23000): Duplicate entry 'zhsan' for key 'PRIMARY'
mysql> INSERT INTO t5 VALUES (NULL); #值为空,写入失败
ERROR 1048 (23000): Column 'name' cannot be null
mysql> ALTER TABLE t5 DROP PRIMARY KEY; #删除已有主键
mysql> DESC t5;
mysql> ALTER TABLE t5 ADD PRIMARY KEY(name); #添加主键约束
mysql> DESC t5;
复合主键测试(多字段组合结果不重复即可)
mysql> CREATE TABLE execdb.t6 (
-> user CHAR(10),
-> host CHAR(15),
-> status ENUM('allow','deny') NOT NULL DEFAULT "deny",
-> PRIMARY KEY(user,host)
-> ); #创建execdb.t6表测试复合主键
mysql> DESC t6;
mysql> INSERT INTO t6 VALUES
-> ('abc','1.1.1.1','allow'),
-> ('abc','1.1.1.2','deny'),
-> ('haha','1.1.1.1','deny'); #写入成功
mysql> INSERT INTO t6 VALUES
-> ('haha','1.1.1.1','allow'); #组合结果与已有数据冲突,写入失败
ERROR 1062 (23000): Duplicate entry 'haha-1.1.1.1' for key 'PRIMARY'
mysql> ALTER TABLE t6 DROP PRIMARY KEY; #删除已有复合主键
mysql> DESC t6;
mysql> ALTER TABLE t6 ADD PRIMARY KEY(user,host); #向已有表添加复合主键
mysql> DESC t6;
自增长测试
mysql> CREATE TABLE t7 (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name CHAR(10)
-> ); #PRIMARY KEY与AUTO_iNCREMENT联用
mysql> DESC t7;
mysql> CREATE TABLE t8(
-> id INT AUTO_INCREMENT,
-> name CHAR(10),
-> PRIMARY KEY(id)
-> ); #PRIMARY KEY与AUTO_INCREMENT分开用
mysql> DESC t8;
mysql> INSERT INTO t8(name) VALUES ('bob'); #id从1开始
mysql> INSERT INTO t8(name) VALUES ('tom'); #id为2
mysql> SELECT * FROM t8;
mysql> INSERT INTO t8 VALUES (10,'jim'); #可以指定id赋值
mysql> INSERT INTO t8(name) VALUES ('john'); #识别id字段最大值
mysql> SELECT * FROM t8;
mysql> DELETE FROM t8; #清空表记录,验证自增长是否重置
mysql> INSERT INTO t8(name) VALUES ('haha'); #测试写入
mysql> SELECT * FROM t8; #自增长未重置
mysql> TRUNCATE TABLE t8; #TRUNCATE语句快速清表
mysql> INSERT INTO t8(name) VALUES ('haha'); #测试写入记录
mysql> SELECT * FROM t8; #id自增长重置
mysql> DELETE FROM t8;
#主键不一定自增,但被标记自增的一定是主键
mysql> SHOW VARIABLES LIKE "default_storage_engine";
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
在execdb中,创建员工表emp(包含ID字段,INT类型,主键,自增长;name字段CHAR类型20个宽度)
在execdb中,创建工资表salary(包含id字段 ,INT类型,wage字段,FLOAT类型)
将execdb.salary表的id字段设置为外键,依赖于execdb.emp表的id字段
mysql> USE execdb; #切换到练习库
mysql> CREATE TABLE emp (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name CHAR(20)
-> ); #创建练习emp表,用于存储员工信息
Query OK, 0 rows affected (0.00 sec)
mysql> DESC emp; #查看emp表结构
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> CREATE TABLE salary(
-> id INT,
-> wage FLOAT,
-> FOREIGN KEY(id) REFERENCES emp(id)
-> ON UPDATE CASCADE
-> ON DELETE CASCADE
-> ); #创建练习salary表,用于存储员工某个月工资
Query OK, 0 rows affected (0.00 sec)
mysql> DESC salary; #查看salary表结构
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| wage | float | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
##测试外键约束
mysql> INSERT INTO salary VALUES (1,5000); #写入失败,emp表中id字段无值
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`execdb`.`salary`, CONSTRAINT `salary_ibfk_1` FOREIGN KEY (`id`) REFERENCES `emp` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
mysql> INSERT INTO emp(name) VALUES ('zhangsan'),('lisi'); #添加员工记录(一次插入2行)
mysql> SELECT * FROM emp; #查看已有员工记录
mysql> INSERT INTO salary VALUES (1,5000); #给id是1的员工发5000,成功
mysql> INSERT INTO salary VALUES (2,4000); #给id是2的员工发4000,成功
##验证级联更新(ON UPDATE CASCADE)
mysql> SELECT * FROM emp; #查询emp表记录
mysql> SELECT * FROM salary; #查询salary表记录
mysql> UPDATE emp SET id=5 WHERE name='lisi'; #更新emp表中lisi用户id为5
mysql> SELECT * FROM emp; #确认emp表中lisi的id已更新为5
mysql> SELECT * FROM salary; #此过程中并未操作salary表,但数据已发生变化
##验证级联删除(ON DELETE CASCADE)
mysql> SELECT * FROM emp; #查询emp表记录
mysql> SELECT * FROM salary; #查询salary表记录
mysql> DELETE FROM emp WHERE id=5; #删除emp表中id为5的表记录
mysql> SELECT * FROM emp; #确认id为5的记录被删除
mysql> SELECT * FROM salary; #此过程中并未操作salary表,但数据已发生变化
##外键操作语法
mysql> SHOW CREATE TABLE salary; #查看完整建表语句
mysql> ALTER TABLE salary DROP FOREIGN KEY `salary_ibfk_1`; #删除指定外键
mysql> SHOW CREATE TABLE salary; #查看完整建表语句
mysql> ALTER TABLE salary
-> ADD FOREIGN KEY(id) REFERENCES emp(id)
-> ON UPDATE CASCADE ON DELETE CASCADE; #向已有表添加外键
mysql> SHOW CREATE TABLE salary; #查看完整建表语句
##注意事项
mysql> DROP TABLE emp; #被关联表不允许删除
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
mysql>
mysql> SELECT * FROM salary; #查看salary表记录
mysql> INSERT INTO salary VALUES (1,2000); #给员工重复发工资
mysql> SELECT * FROM salary; #重复工资下发成功,该现象不合理
mysql> DESC salary; #查看salary表结构,id字段不能重复(PRIMARY KEY)
mysql> ALTER TABLE salary ADD PRIMARY KEY(id); #给salary表id字段添加主键,失败,数据重复
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> DELETE FROM salary WHERE wage=2000; #清理重复数据
mysql> ALTER TABLE salary ADD PRIMARY KEY(id); #给salary表id字段添加主键,成功
mysql> DESC salary; #查看salary表结构,id字段标签
mysql> INSERT INTO salary VALUES (1,2000); #再次测试重复工资,下发失败
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> SHOW CREATE TABLE salary; #查看salary建表语句
#PRIMARY KEY和FOREIGN KEY可以共存