MySQL数据库,DDL,DML,查询,权限,主从复制

一、什么是数据库?

数据库:顾名思义,这就是一个存放数据的仓库,但由于数据存在多种形态,所以我们也需要对应不同类型的数据库。那么数据库到底是什么样的呢?

数据库里面到底可以保存什么类型的数据?文本型数据、二进制数据、多媒体数据。上述这些数据类型都可以存在于数据库中,但是,通常情况下,数据库里面更多的存储文本型数据,而非文本型数据,则通常建议保存在硬盘或存储服务器上,然后数据库里面存路径。

数据库(DataBase),顾名思义,是存储数据的仓库中。只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的。数据库管理数据有诸多优点,如降低存储数据的冗余度,存储的数据可以共享,便于维护数据完整性,能够实现数据的安全性等。数据库的发展经历了萌芽、初级、中级、和高级阶段。

1.第一个阶段使用磁盘文件来存储数据;初级阶段的数据库也就是第一代数据库,出现了网状模型、层次模型数据库;当然,用文件来保存数据是再正常不过的事了,虽然是第一代,但是并不代表就无用武之地。比如我们现在使用的ExCel,XML,YAML等,确切来说,也是属于文件型数据。

2.中级阶段的数据库也称之为第二代数据库,这一阶段出现了关系型数据库(RDB)和结构化查询语言(SQL);

3.数据库发展到高级阶段出现了"关系-对象"型数据库。由于历史原因,目前使用最多的数据库还是关系型数据库。以关系模型来创建的数据库称为关系型数据库(Relational Database)。关系模型的理论是1970年由IBM的Codd博士提出的。关系模型把世界看作是由实体(Entity)和联系(Relationship)组成的。所谓实体就是指在现实世界中客观存在并可相互区别的事物。关系型数据库的核心单元是表,它是存储数据的地方。

当然,除些之外,数据库现在已经发展到第四代,就是我们平时听到的"大数据"(BigData)。这是一种非结构化的数据,目前软件系统最核心最重要的数据库:关系型数据库。

二.数据库常用操作

了解了数据和数据库的概念,下一个问题就是如何科学地组织和存储数据,如何高效地获取和维护数据,完成这个任务的是一个系统软件一数据库管理系统(英文缩写为DBMS,即Data Base Management System)。数据库管理系统是位于用户与操作系统之间的一层数据管理软件,其主要目标是使数据作为一种可管理的资源来处理,主要功能如下:

  1. 数据定义功能:DBMS提供数据定义语言(Data Definition Language,简称DDL),用户通过它可以方便地对数据库中的数据对象进行定义。
  2. 数据操纵功能:DBMS也提供数据操作语言(Data Manipulation Language,简称DML),供用户实现对数据的基本操作,如插入、删除、修改。
  3. 数据查询功能:DBMS还提供数据查询语言(Data Query Language,简称DQL),供用户实现对数据的查询操作。
  4. 数据控制功能:DBMS还提供数据控制语言(Data Control Language,简称DCL),主要用于对数据库的用户、角色和权限进行管理和控制。

对数据的操作都支持"增删改查"

三、数据库管理系统

ACCESS

DB2

MySQL

特别注意的是,由于Oracle公司收购MySQL后,进行了商业化授权。所以MySQL的原作者将MySQL的源代码进行了调整,并开源出来了另外一个MySQL的分支版本:MariaDB

复制代码
[root@localhost bin]# find / -name mysql -type f 2>/dev/null
/run/lock/subsys/mysql
/opt/lampp/bin/mysql
[root@localhost bin]# /opt/lampp/bin/mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.4.32-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Oracle

PostgreSQL

四、数据定义语言DDL

1、对数据库的操作

1.创建数据库

在大多数RDBMS中,我们都可以使用如下简单的SQL语句,创建整个数据库:

sql 复制代码
CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER set'utf8mb4'];

其中:数据库名在服务器中必须是唯一的,并且符合标识符规则。所谓标识符规则指:

  • 第一个字符必须是下列字符之一:
    • Unicode标准3.0所定义的字母(Unicode中定义的字母包括拉丁字母a-z和A-Z,以及来自其它语言的字母字符)。
    • 下划线(_)、at符号(@)或者数字符号(#)
  • 后续字符可以是:
    • Unicode标准3.0所定义的字母。

    • 来自基本拉丁字母或其它国家/地区脚本的十进制数字。

    • at符号(@)、美元符号($)、数字符号或下划线。

    • 标识符不能是所用RDBMS的保留字,如create,drop,insert, delete, update, alter, select, return,use, grant, revoke等。

    • 不允许嵌入空格或其它特殊字符。

      登录MySQL,使用默认密码
      [root@localhost bin]# /opt/lampp/bin/mysql -u root
      显示当前用户
      MariaDB [(none)]> show grants;

shell 复制代码
# 查找mysql命令的位置
find / -name mysql -type f 2>/dev/null

[root@localhost bin]# find / -name mysql -type f 2>/dev/null
/run/lock/subsys/mysql
/opt/lampp/bin/mysql
sql 复制代码
创建数据库名为school,
MariaDB [(none)]> create database school character set 'utf8mb4';
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> create database if not exists school character set 'utf8mb4';
Query OK, 0 rows affected, 1 warning (0.001 sec)


MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phpmyadmin         |
| school             |
| test               |
+--------------------+
6 rows in set (0.002 sec)

在navicat premium中查看创建数据库名的信息

注:需要自己安装百度安装navicat premium,以及远程连接的方式,deepseek是个好工具。

1.修改数据库字符集

语法结构:

sql 复制代码
语法:ALTERDATABASE db_name CHARACTER SET = charset_name
例:ALTER DATABASE test CHARACTER SET =UTF8MB4;
sql 复制代码
MariaDB [(none)]> alter database school character set 'gbk';
Query OK, 1 row affected (0.001 sec)

2.删除数据库

sql 复制代码
DROP DATABASE 数据库名;

这是一条危险的命令,使用前,请务必确认数据库的确可以被删除。

2、对表的操作

复制代码
show databases;  查看目前系统中存在的数据库。
use world;  切换到world数据库。
show tables; 显示当前数据库下面的所有可用的表。
use mysql;  切换到mysql核心数据库。
desc user; 显示mysql数据库中的user表的结构。
select host,user,password from user;  查询mysql数据库中的user表的三列数据。
exit;  退出MySQL命令行操作。

运行以下命令,修改root用户的密码
update user set authentication_string=password('654321') where user='root';
flush privileges;

(1).创建表

sql 复制代码
CREATE TABLE 表名(
	列名 数据类型 约束,
	列名 数据类型 约束
) [ENGINE = engine_name 丨 [DEFAULT] CHARACTER SET [=] charset_name];
sql 复制代码
MariaDB [(none)]> use school;
Database changed

MariaDB [school]> create table student ( id int, sid varchar(15), sname varchar(10), sphone char(11), ssex char(1), sage tinyint, createtime datetime );
Query OK, 0 rows affected (0.007 sec)

MariaDB [school]> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student          |
+------------------+
1 row in set (0.001 sec)

MariaDB [school]> desc student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| sid        | varchar(15) | YES  |     | NULL    |       |
| sname      | varchar(10) | YES  |     | NULL    |       |
| sphone     | char(11)    | YES  |     | NULL    |       |
| ssex       | char(1)     | YES  |     | NULL    |       |
| sage       | tinyint(4)  | YES  |     | NULL    |       |
| createtime | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
7 rows in set (0.004 sec)

新增加列名
MariaDB [school]> alter table student add column updatetime datetime;
Query OK, 0 rows affected (0.003 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [school]> desc student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| sid        | varchar(15) | YES  |     | NULL    |       |
| sname      | varchar(10) | YES  |     | NULL    |       |
| sphone     | char(11)    | YES  |     | NULL    |       |
| ssex       | char(1)     | YES  |     | NULL    |       |
| sage       | tinyint(4)  | YES  |     | NULL    |       |
| createtime | datetime    | YES  |     | NULL    |       |
| updatetime | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
8 rows in set (0.002 sec)


修改列名
MariaDB [school]> alter table student change column updatetime saddress varchar(30);
Query OK, 0 rows affected (0.013 sec)              
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [school]> desc student;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | YES  |     | NULL    |       |
| sid        | varchar(15) | YES  |     | NULL    |       |
| sname      | varchar(10) | YES  |     | NULL    |       |
| sphone     | char(11)    | YES  |     | NULL    |       |
| ssex       | char(1)     | YES  |     | NULL    |       |
| sage       | tinyint(4)  | YES  |     | NULL    |       |
| createtime | datetime    | YES  |     | NULL    |       |
| saddress   | varchar(30) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
8 rows in set (0.002 sec)

数值数据类型:

字符类型:

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET

日期和时间类型:

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR

五、表的DML操作

sql 复制代码
# 针对列名或表名,可以添加``来进行区分
# 在SQL语句中,用单引号''来区分字符串,对于数值型可以不用加单引号
INSERT INTO student(sid, sname, sphone, ssex, sage, degree, college, createtime)
VALUES (20251021, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021');

# 如果在插入数据时,每一列都需要插入数据,则可以省略列名
# 如果只是部分列插入数据,则必须明确指定列名
INSERT INTO student
VALUES (2025102102, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021');

# 如果批量插入数据,一次性插入多行数据
INSERT INTO student
VALUES (2025102103, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021'),
(2025102104, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021'),
(2025102105, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021'),
(2025102106, '张三', '19299998888', '男', 24, '本科', '北京大学', '20251021');


# 删除数据
TRUNCATE TABLE student; # 清空表数据
DELETE FROM student; #删除表数据,可以带where条件决定删除哪些行

DELETE FROM student WHERE sid='2025102103';

DELETE FROM student WHERE sid in ('2025102103','2025102104');

DELETE FROM student WHERE sid not in ('2025102103');

# 更新数据
UPDATE student set sname='王老五';
UPDATE student set sname='李狗剩',sphone='18828889111' WHERE sid='2025102104';

六、约束和范式

自增长可以不用插入值。针对int类型。

sql 复制代码
# 插入grade表数据
INSERT INTO grade(sid,cid,score,createtime) VALUES('2025102105','C01',98,NOW());
INSERT INTO grade(sid,cid,score,createtime) VALUES('2025102105','C01',98,NOW());
INSERT INTO grade(sid,cid,score,createtime) VALUES('2025102105','C01',98,NOW());
INSERT INTO grade(sid,cid,score,createtime) VALUES('2025102105','C01',98,NOW());
INSERT INTO grade(sid,cid,score,createtime) VALUES('2025102105','C01',98,NOW());

所谓约束:就是指我们在创建表的过程中,给表的字段添加一些条件!在这些条件的配合下,可以保证数据的唯一性,完整性。有的约束针对整行有效,有的约束只针对某一列有效。

1、关于完整性约束

1.域完整性:限制数据类型、外键约束、默认值、非空约束。

2.实体完整性:唯一约束、主键约束、自增列。

3.参照完整性:主外键关联。

4.自定义完整性:规则、存储过程、触发器。

2、主键约束

sql 复制代码
# 创建一张表,并指定一个主键
CREATE TABLE temp(id int PRIMARY KEY);

3、外键约束

什么是外键:简单地说,就是"子表"中对应于"主表"的列,在子表中称为外键或者引用键。

它的值要求与主表的主键或者唯一键相对应,外键用来强制引用完整性。例如在成绩表中,学号为外键。一个表可以有多个外键。

4.唯一约束

唯一约束,同样也是保证数据行完整性的一种。

唯一约束的目的:保证某一列数据的唯一性,例如:身份证,电话号码...,如果重复添加,将抛出异常!

5.非空约束

非空约束,主要保证某一列的值,一定要有值,不能为Null。

6.检查约束

检查约束:检查某一个列的值,是否是自己规定的值,如果不是将抛出异常!

7、默认值约束

默认值约束:主要为某一列进行默认值设置,当用户未录入数据时,就填充默认值!

8.范式三约定

第一范式:确保每列保持原子性。不可再分。

第二范式:确保每行的唯一性。

第三范式:确保每列都和主键列直接相关,而不是间接相关。

七、查询语句

1.分组查询

sql 复制代码
# 如果要对GROUP BY以后的聚合函数运算出来的数据进行过滤,使用HAVING
SELECT course_id,(final_grade) AS avgGrade FROM enrollments GROUP BY course_id HAVING avgGrade>=85;

2.单表查询

sql 复制代码
# 单表查询

# 聚合函数
SELECT MAX(credit) FROM courses; #课程中学时最多为5
SELECT credit FROM courses WHERE credit = 5.0;
# 将上述两条语句整合成一条
SELECT credit FROM courses WHERE credit = (SELECT MAX(credit) FROM courses);
SELECT credit FROM courses WHERE credit = (SELECT MIN(credit) FROM courses);

#LIKE关键字进行模糊查询,用%表示任意字符,用_代替一个字符
# 查询姓张的学生
SELECT * FROM students WHERE student_name LIKE '张%';

# 查询班级是CS101的平均成绩
SELECT AVG(final_grade) FROM enrollments WHERE course_id='CS101';
# 对查出的结果重命名
SELECT AVG(final_grade) AS '平均得分' FROM enrollments WHERE course_id='CS101';
# 统计行数
SELECT COUNT(*) FROM enrollments WHERE course_id='CS101';
# 统计成绩总和
SELECT SUM(final_grade) FROM enrollments WHERE course_id='CS101';

# 查询考试成绩排名前五的成绩
# LIMIT 开始行数,查询行数
# LIMIT 0,10
SELECT * FROM enrollments ORDER BY final_grade DESC LIMIT 5;
SELECT * FROM enrollments ORDER BY final_grade ASC LIMIT 5;

八、外连接

复制代码
外连接:左连接和右连接
LEFT JOIN ... ON
RIGHT JOIN ... ON

内连接图示:

外连接图示:

九、视图

复制代码
创建为视图:将某些sQL语句的查询结果永久保存在一张类似于表的结构中,
可以非常方便地把一些复杂的sQL语句和业务逻辑封装起来,其本质类似于子查询中的临时表;
如果某一天表结构发生变化,如果是写在视图中,则只需要修改视图一个地方就行;
针对视图也可以做删除,修改或插入的操作,会对应物理表的列进行相应操作,但是,不建议这样做。
CREATE VIEW customer money AS [复杂的SQL语句]

十、索引

复制代码
索引的作用:Index,目绿,帮助数据库提升查询性能,避免全表扫描导致速度极慢,数据量越大越需要索引。
在数据库中,如何利用索引实现快速查询。

使用LIKE或聚合函数时,无法使用索引

创建索引时,需要花费计算资源和存储资源,所以,索引不适用于频繁更新和插入数据的表,或者说:更新的次数多于查询次数时,没有必要使用索引。

哈希索引

MysQL中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是Memory表的默认索引类型,尽管Memory表也可以使用B+Tree索引。

hash索引把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快。当时因为是hash结构,每个键只对应一个值,而且是散列的方式分布。所以他并不支持范围查找和排序等功能。

B+Tree索引

B+tree从MySQL5.5之后,就是使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引|擎模式的索引类型。相对Hash索引l,B+树在查找单条记录的速度比不上Hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎。毕竟不可能只对数据库进行单条记录的操作。

常见索引类型:

复制代码
PRIMARY KEY(主键索引) ALTER TABLE table_name ADD PRIMARY KEY(col)
UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE(col)
INDEX(普通索引I) ALTER TABLE table_name ADD INDEX index_name(col)
FULLTEXT(全文索引) ALTER TABLE table_name ADD FULLTEXT(col)
组合索引 ALTER TABLE table_name ADD INDEX index_name(col1,co12,col3)

十一、其他网络安全用法

复制代码
利用SQL语句写文件:
select "xxxxxx" into outfile /tmp/xxx.txt

-- 写文件
SELECT "你好,数据库" INTO OUTFILE '/tmp/hello.txt';
复制代码
创建临时表:是保存在内存中的表,执行速度很快,断开本次连接,表就会消失,并且无法使用showtables查看到该表
create temporary table表名(列名,列类型)

利用select语句创建一张表
create table demo SELECT customerid, name, phone, degree, province FROM customer WHERE customerid <= 20;

利用INSERTINTO... SELECT的方式插入数据
INSERT INTO demO SELECT customerid,name,phone,degree,province FROM customer WHERE
customerid between 20 and 30;

十二、备份数据库

复制代码
#进入到MySQL安装的位置登录,输入账号密码,指定备份表myweb和路径d:/backupfile.sql
mysqldump -h127.0.0.1 -uroot -ppass myweb > d:/backupfile.sql
#备份并压缩文件
mysqldump -h127.0.0.1 -uroot -ppass myweb | gzip > d:/backupfile.sql.gz
#同时备份多个数据库
mysqldump -h127.0.0.1 -uroot -ppass --databases myweb myweb2 > multibackupfile.sql

#还原数据库,需要先建立数据库,再导入备份的数据
mysql -h127.0.0.1 -uroot -ppass myweb < backupfile.sql
#针对压缩文件进行还原
gunzip < backupfile.sql.gz | mysql -h127.0.0.1 -uroot -ppass myweb

十三、权限

任何情况下,先授予最小权限,再根据实际需要加,而不是先给所有权限,出问题了再减。

MySQL中的权限是系统内部定的一些专用名词,用户权限的不同意味着所能做的操作不同,MySQL中的主要权限如下图:

复制代码
# %表示所有IP地址都可以远程连接
grant all on *.* to '用户'@'%' identified by '密码';
flush privileges;#刷新权限

grant 权限1,权限2,权限3 ... on 数据库.对象名 to '用户'@'授权ip' identified by '123456';
#如果是新建用户,可以指定密码,identified by '123456',也可以对现有用户进行权限的修改

#收回权限
revoke 权限名1,权限名2,... on 数据库名.对象名 from '用户名'@'允许其登录的地址';

十四、主从复制

主从复制:两台机器进行数据的实时同步。Master,Slave,所有数据以Master为准,Slave进行实时复制同步==》实时备份,读写分离。写数据到Master,读可以直接从Slave读。

1、安装MySQL服务器版本

rpm安装repo,再yum install mysql-server

复制代码
rpm -ivh xxxxx.rpm

vi /etc/yum.repos.d/mysql-community.repo

设置5.6版本节点enabled=1
修改8.o版本节点enabled=0

yum install mysql-server

安装完成后:systemctl start mysqld

whereis mysql 可以查看安装的目录,同时 mysql -u root 登录

2、授权远程连接

复制代码
GRANT ALL PRIVILEGES ON TO'root'@'%'IDENTIFIED BY'123456' WITH GRANT OPTION;
flush privileges;

如果单纯只是为了同步数据,此同步用户的权限可以只分配:REPLICATION SLAVE,不需要其他权限

3、配置主服务器

1、修改mysq配置

找到主数据库的配置文件/etc/my.cnf,在[mysqld]部分插入如下两行:

复制代码
[mysqld]
log_bin=mysql-bin   #开启二进制日志
server-id=1         #设置server-id

vi /etc/my.cnf

2、重启mysql,创建用于同步的用户账号

打开mysql会话shell>mysql -hlocalhost -uname -ppassword

创建用户并授权:用户:rell 密码:slavepass

3、查看master状态,记录二进制文件名(mysql-bin.000001)和位置(120)

复制代码
SHOW MASTER STATUS;

4、配置从服务器

复制代码
重启myslqd服务

进入mysql
mysqk -uroot
复制代码
启动slave同步进程:
mysql>start slave;
复制代码
重启mysql,打开mysql会话,执行同步SQL语句
(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
change master to master_host="192.168.112.177", master_port=3306, master_user="xxx",
master_password="123456",master_log_file="mysql-bin.000004",master_log_pos=120,
master_connect_retry=10;

查看slave状态:
mysql>show slave status\G;

当Slave_lO_Running和Slave_SQLRunning都为YES的时候就表示主从同步设置成功了。接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stopslave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

如果上述无法同步成功,通常是因为在MySQL5.6及以上版本中,存在一个UUID标识重复的问题,修改Slave机器上的UUID

复制代码
vi/var/lib/mysql/auto.cnf


[auto]
server-uuid=0c5ac732-0503-11ec-938a-000c292030a7
#任意修改一位uuid,保持不重复,然后再重启MySQL即可

还可以用到的其他相关参数:

master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysq配置文件的[mysqld]可添加修改如下选项:

复制代码
#不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
#只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game

如之前查看master状态时就可以看到只记录了test库,忽略了manual和mysql库。

相关推荐
运维成长记3 小时前
Mysql的数据备份和高可用
数据库·mysql
IT技术与企业应用结合的爱好者3 小时前
c#using Oracle.ManagedDataAccess.Client 批量保存数据
数据库·oracle
l1t3 小时前
利用DeepSeek改写递归CTE SQL语句为Python程序及优化
数据库·人工智能·python·sql·算法·性能优化·deepseek
江湖一码农5 小时前
[小白]spring boot接入emqx
java·数据库·spring boot
HitpointNetSuite7 小时前
连锁餐饮行业ERP如何选择:为何Oracle NetSuite成为增长新引擎
大数据·运维·数据库·oracle·netsuite
冻咸鱼8 小时前
MySQL基础知识大全
数据库·mysql·oracle
emma羊羊8 小时前
【Redis】
数据库·redis·缓存
程序猿小蒜11 小时前
基于springboot的车辆管理系统设计与实现
java·数据库·spring boot·后端·spring·oracle
数据库知识分享者小北12 小时前
如何构建企业级数据分析助手:Data Agent 开发实践
数据库·阿里云·1024程序员节·dataagent