当前位置:网站首页>MySQL数据库---数据库基础

MySQL数据库---数据库基础

2022-06-21 19:33:00 [email protected]

1 数据库的基本概念

1.1 数据库的组成

数据:描述事物的符号记录
包括数字,文字、图形、图像、声音、档案记录等
以“记录”形式按统一格式进行存储

表:将不同的记录组织在一起,用来存储具体数据

数据库: 表的集合,是存储数据的仓库
以一定的组织方式存储的相互有关的数据集合

1.2 数据库的管理系统(DBMS)

是实现对数据库资源有效组织、管理和存取的系统软件
功能:数据库的建立和维护功能、数据定义功能、数据操控功能、数据库的运行管理功能、通信功能

1.3 数据库系统(DBS)

是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成
用户可以通过DBMS或应用程序操作数据库

2 当今主流数据库

SQL Server (微软公司产品)
面向Windows操作系统
简单、易用

Oracle (甲骨文公司产品)
面向所有主流平台
安全、完善、操作复杂

DB2 (IBM公司产品)
面向所有主流平台
大型、安全、完善

MySQL (甲骨文公司收购)
免费、开源、体积小

3 关系型数据库介绍

1、关系数据库系统是基于关系模型的数据库系统

2、关系模型的数据结构使用简单易懂的二维数据表
每一行称为一条记录,用来描述一个对象的信息
每一行称为一个字段,用来描述对象的一个属性

3、关系模型可用简单的"实体-关系-属性"来表示
实体
也称为实例,对应现实世界中可区别与其他对象的“事件”或“事物”
如银行客户、银行账户等

关系
实体集之间的对应关系称为联系,也称为关系
如银行客户和银行账户之间存在“储蓄”的关系

属性
实体所具有的某一特性,一个实体可以有多个属性
如“银行客户”实体集中的每个实体均具有姓名、住址、电话等属性

4 非关系型数据库介绍

非关系数据库也称为NoSQL (Not Only SQL)
存储数据不以关系模型为依据,不需要固定的表格式

非关系型数据库的优点
数据库可高并发读写
对海量数据高效率存储与访问
数据库具有高扩展性与高可用性

5 MySQL 数据库介绍

一款深受欢迎的开源关系型数据库
Oracle旗下的产品
遵守GPL协议,可以免费使用与修改
特点

性能卓越、服务稳定
开源、无版权限制、成本低
多线程、多用户
基于C/S(客户端/服务器)架构
安全可靠

6 MySQL 数据库管理

数据库—>数据表–>行(记录):用来描述一个对象的信息
列(字段):用来描述对象的一个属性

6.1 常用的数据类型

int整型
float单精度浮点,4字节32位
double双精度浮点,8字节64位
char固定长度的字符类型
varchar可变长度的字符类型
text文本
image图片
decimal(5,2)5个有效长度数字,小数点后面有2位

对char来说,最多能存放字符个数255个,char如果存入数据的实际长度比指定长度要小 会补空格至指定长度 如果存入的数据的实际长度大于指定长度 低版本会被截取 高版本会报错

char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了

varchar存储规则
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

6.2 查看数据库结构

1、查看当前服务器中的数据库

SHOW DATABASES;			#大小写不区分,分号“;”表示结束

2.查看数据库中包含的表

USE 数据库名;       #切换库 
SHOW TABLES;

show tables from mysql;

3.查看表的结构(字段)

USE 数据库名;
DESCRIBE [数据库名.]表名;
可缩写成:DESC 表名;

6.3 SQL 语句

SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。

SQL语言分类

DDL数据定义语言,用于创建数据库对象,如库、表、索引等
DML数据操纵语言,用于对表中的数据进行管理
DQL数据查询语言,用于从数据表中查找符合条件的数据记录
DCL数据控制语言,用于设置或者更改数据库用户或角色权限

6.4 创建及删除数据库和表

1、创建新的数据库

CREATE DATABASE 数据库名;

2.创建新的表

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。

例:create database kgc;
use kgc;
create table ky18 (id int not null,name char(10) not null,sex char(1),primary key (id));

3、删除指定数据表

DROP TABLE [数据库名.]表名;				#如不用USE进入库中,则需加上数据库名

4.删除指定的数据库

DROP DATABASE 数据库名;

例:show databases;
drop table kgc.ky18;
use kgc;
show tables;

drop database kgc;
show databases;

6.5 管理表中的数据记录

1、向数据表中插入新的数据记录

INSERT INTO 表名(字段1,字段2[,...]) VALUES(字段1的值,字段2的值,...);

例:create database kgc;
use kgc;

create table ky18 (id int not null,name char(20) not null,sex char(1) not null,primary key (id));

insert into ky18 (id,name,sex) values(1,'zhangsan','男');

2、查询数据记录

SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];

例:select * from ky18;
select name,sex from ky18 where id=1;

3、修改、更新数据表中的数据记录

UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];

例:insert into ky18 (id,name,sex) values(2,'lisi','女');
insert into ky18 (id,name,sex) values(3,'wangwu','男');
select * from ky18;

update ky18 set id=4 where name='zhangsan';
select * from ky18;

update ky18 set name='sicong',sex='男' where id=2;
select * from ky18;

4、在数据表中删除指定的数据记录

DELETE FROM 表名 [WHERE 条件表达式];

例:delete from ky18 where id=4;
select * from ky18;

6.6 修改表名和表结构

1、修改表名

ALTER TABLE 旧表名 RENAME 新表名;

例:alter table ky18 rename CLASS3;
show tables;
select * from CLASS3;

在这里插入图片描述
2、扩展表结构(增加字段)

ALTER TABLE 表名 ADD address varchar(50) default '地址不详';

#default ‘地址不详’:表示此字段设置默认值 地址不详;可与 NOT NULL 配合使用

例:alter table kgc add address varchar(50) default '地址不详';

3、修改字段(列)名,添加唯一键

ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];

例:alter table CLASS3 change name student_name varchar(20) unique key;
select * from CLASS3;

insert into CLASS3 (id,student_name,sex) values (1,'zhangsan','男');
select * from CLASS3;
insert into CLASS3 (id,student_name,sex) values (4,'zhangsan','男');

4、删除字段

ALTER TABLE 表名 DROP 字段名;

例:alter table kgc drop address;

在这里插入图片描述

7 数据表高级操作

1.克隆表,将数据表的数据记录生成到新的表中

create table test01 like KY18;#通过LIKE方法,复制KY18表结构生成test01表
insert into test01 select*from KY18;
方法二:
CREATE TABLE test02(SELECT*from KY08);
show create table test02\G#获取数据表的表结构、索引等信息SELECT*from test02;

2.清空表,删除表内的所有数据
方法一:
delete from test01;
#DELETE清空表后,返回的结果内有删除的记录条目;DELETE工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。

方法二:
truncate table test01;
#TRUNCATE 清空表后,没有返回被删除的条目;TRUNCATE工作时是将表结构按原样重新建立,因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE清空表内数据后,ID会从1开始重新记录。

3.创建临时表
临时表创建成功之后,使用SHOW TABLES命令是看不到创建的临时表的,临时表会在连接退出后被销毁。如果在退出连接之前,也可以可执行增删改查等操作,比如使用DROP TABLE语句手动直接删除临时表。

CREATE TEMPORARY TABLE 表名(字段1数据类型,字段2数据类型[...J[,PRIMARYKEY(主键名)]);

四、创建外键约束,保证数据的完整性和一致性
外键的定义:如果同一个属性字段x在表一中是主键,而在表二中不是主键,则字段x称为表二的外键。

主键表和外键表的理解:
1、以公共关键字作为主键的表为主键表(父表、主表)
2、以公共关键字作为外键的表为外键表(从表、外表)

注意:与外键关联的主表的字段必须设置为主键,要求从表不能是临时表,主从表的字段具有相同的数据类型、字符长度和约束

#创建主表 profession 
create table profession(pid int(4),proname varchar(50));

#创建从表 student 
create table student(id int(4)primary key auto_increment,name varchar(10),age int(3),proid int(4));

#为主表 profession添加一个主键约束。主键名建议以"PK_"开头。
alter table profession add constraint PK_pid primary key(pid);

#为从表student表添加外键,并将student表的proid字段和profession表的pid字段建立外键关联。外键名建议以"FK_"开头。
alter table student add constraint FK_pro foreign key(proid)references profession(pid);
desc student;

#插入新的数据记录时,要先主表再从表
insert into profession values(1,'云计算); insert into profession values(2,'大数据’);
insert into student values(1,'zhangsan',18,1);
insert into student values(2,'lisi',19,1);
insert into student values(3,'wangwu',20,2);

#删除数据记录时,要先从表再主表,也就是说删除主键表的记录时必须先删除其他与之关联的表中的记录。
delete from student where proid=1;
delete from profession where pid=1#查看和删除外键约束
show create table student;
desc student;
alter table student drop foreign key FK_pro;
alter table student drop key FK_pro;

7.1 MySQL b中6种常见的约束

主键约束(prilmary key)
外键约束(foreign key)
非空约束(not null)
唯一性约束(unique [key l index])
默认值约束(default)
自增约束(auto_increment)

8 数据表高级操作

8.1 克隆表

法一: 通过like复制
create table 新表名 like 旧表名;           
 
insert into 新表名 select * from 旧表名;     #将旧表数据导入新表
 
法二:创建表的同时导入数据
 
create table 新表名 (select * from 旧表名);

8.2 查看表结构

获取数据表的表结构、索引等信息

show create table表名\G;
desc 表名\G;

8.3 清表——删除表内的所有数据

delete
DELETE清空表后,返回的结果内有删除的记录条目;
DELETE工作时是一行一行的删除记录数据的;
如果表中有自增长字段,使用DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录。

delete from 表名;

truncate删除
TRUNCATE 清空表后,没有返回被删除的条目;
TRUNCATE 工作时是将表结构按原样重新建立,因此在速度上 TRUNCATE 会比 DELETE 清空表快;
使用 TRUNCATE TABLE 清空表内数据后,ID 会从 1 开始重新记录

truncate table 表名;

9 创建临时表

临时表创建成功之后,使用SHOW TABLES命令是看不到创建的临时表的,临时表会在连接退出后被销毁。 如果在退出连接之前,也可以可执行增删改查等操作,比如使用 DROP TABLE 语句手动直接删除临时表。

CREATE TEMPORARY TABLE 表名(字段1 数据类型, 字段2 数据类型(,...] [,PRIMARY KEY(主键名)]);

添加临时表test

create temporary table test (
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;  #查看不到临时表 

在临时表中添加数据

insert into test values(0001,'zhangsan',123456789,'play'); 
#查看当前表中所有数据 
select * from test;
#退出数据库
quit           

重新登录后进行查看

mysql -u root -p
#查看之前临时表中所有数据,发现已经被自动销毁
select * from test;

10 创建外键约束,保证数据的完整性和一致性

外键的定义:如果同一个属性字段x在表一中是主键,而在表二中不是主键,则字段x称为表二的外键。
主键表和外键表的理解:
(1)以公共关键字作主键的表为主键表(父表、主表)
(2)以公共关键字作外键的表为外键表(从表、外表)
注意:与外键关联的主表的字段必须设置为主键。要求从表不能是临时表,主从表的字段具备相同的数据类型、字符长度和约束。

#创建主表 class
create table class (cid int, cname char(10));

#创建从表 student
create table student (id int, name char(10), age int, classid int);
 
#为主表class添加一个主键约束。主键名建议以“PK"开头。
alter table class add constraint PK_CID primary key(cid);
 
#为从表student表添加外键,并将student表的cid字段和student表的classid字段建立外键关联。外键名建议以“FK"开头。
alter table student add constraint FK_CLASSID foreign key(classid) references class(cid);
 
#插入新的数据记录时要先插入主表的在插入从表的
  #在主表插入数据
insert into class values(1,'下棋');
insert into class values(2,'跳舞');
insert into class values(3,'游泳');
  #在从表插入数据
insert into student values(1,'张三',22,3);
insert into student values(2,'李四',34,2);
insert into student values(3,'王五',45,1);
 
#删除数据记录时要先删除从表再删主表,也就是说删除主键表必须先删除其他关联的表中记录
delete from student where name='张三';
delete from class where cid=3;
select * from xy;
select * from kc;

11 数据库用户管理

CREATE USER '用户名'@'来源地址' [IDENTIFIED BY [PASSWORD] '密码'];
‘用户名’:指定将创建的用户名

‘来源地址’:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符%

‘密码’:

若使用明文密码,直接输入’密码’,插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD(‘密码’); 获取密文,再在语句中添加 PASSWORD ‘密文’;
若省略“IDENTIFIED BY”部分,则用户的密码将为空(不建议使用)
使用明文创建用户

#创建用户zhangsan只允许从本机登录密码为123123
create user '张三'@'localhost' identified by '123123';

使用密文创建用户

#获取密文
select password('123123');      
 
#创建用户
create user 'my'@'localhost'identified by password'*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1';

查看用户信息
创建后的用户保存在 mysql 数据库的 user 表里

use mysql;          #切换库
 
SELECT User,authentication_string,Host from user;  #查看user表中的用户信息
    #指定字段用户,登录认证字符串,登录主机,查看数据记录

重命名用户

rename user '原用户名'@'登录主机' to '新用户名'@'登录主机';

删除用户

DROP USER '用户名'@'登录主机'

修改当前登录用户密码

SET PASSWORD = PASSWORD('123123');

修改其他用户密码

SET PASSWORD FOR '用户'@'登录主机'=password('新的密码'

忘记 root 密码的解决办法

1#修改配置文件/etc/my.cnf,不使用密码直接登录到mysql。
vim /etc/my.cnf
[mysqld]
skip-grant-tables          #添加此行,使登录mysql不使用授权表
​systemctl restart mysqld    #重启服务
mysql    #直接登录
 ​​
2#使用update命令修改root密码,刷新数据库。
UPDATE mysql.user SET AUTHENTICATION_STRING = PASSWORD('123123') where user='root';
flush privileges;   #刷新数据库
quit                #退出
mysql -uroot -p123123     #免交互登录"-p密码"不能有空格3#删除配置文件中的配置,之后重启服务。
注意:最后再把/etc/my.conf 配置文件里的skip-grant-tables 删除,并重启mysql服务。
vim /etc/my.cnf
systemctl restart mysqld    #重启服务
修改配置文件

12 数据库用户授权

授予权限
GRANT语句:专门用来设置数据库用户的访问权限。

当指定的用户名不存在时,GRANT语句将会创建新的用户;
当指定的用户名存在时,GRANT 语句用于修改用户信息。

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];

权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。
数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符“”。例如,使用“kgc.”表示授权操作的对象为 kgc数据库中的所有表。
‘用户名@来源地址’:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.my.com”、“192.168.52.%”等。
IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分, 则用户的密码将为空。
例:

允许用户my在本地查询 qyd数据库中 所有表的数据记录,但禁止查询其他数据库中的表的记录

 mysql -u root- p123123 #使用root用户登录
库中没有用户my  
grant select on qyd.*to 'my'@'localhost' identified by '123123';
#授权*表示库下的所有表
quit        #退出数据库
mysql -u my -p123123   #用户my登录验证
show databases;#查看所有库
use qyd;切换库
show tables;查看所有表
select *from class;#查看表所有字段数据记录
未授权前用户my看不到库

允许用户qy在所有终端远程连接mysql,并拥有所有权限

#使用root用户登录
mysql -u root -p123123        
#用户qy授权允许查看所有库所有表所有主机登录并给与密码123123
grant all on *.* to 'qy'@'%' identified by '123123';
#退出 
quit
#在另一台主机上使用qy用户登陆 
mysql -u 用户 -p123123 -h目标ip/主机-P端口号
#查看当前所有库 
show databases;
#切换库
use qyd;
#查看所有表
show tables;
#查看表内所有段数据记录
select * from class;

注:如果此时用户表内有同样的用户但是登录主机为本机的话你在本机登录则使用只允许本机登录的用户密码

查看权限

SHOW GRANTS FOR 用户名@来源地址;

撤销权限

REVOKE ALL ON *.* FROM '用户'@'来源地址'; #撤销所有权限

总结

show databases;
use 库名;
show tables;

create database 库名;

create table 表名(字段1数据类型[属性],字段2……);

insert into 表名 values(所有字段的值);每个字段用逗号相隔

insert into 表名(指定字段名称)values(字段的值);注意字段的属性 not null

delete from 表名 [where …]

update 表名 set 字段=值[,字段2=…][where …];

select 字段[,字段2…] from 表名 [where …];

唯一键 unique key
主键 primary key

共同点:字段的值都是唯一性,不允许有重复的值
不同点:一个表中只能有1个主键,但是可以有多个唯一键
主键字段中不允许有null值,唯一键是允许有null

修改表结构
alter table 表名 RENAME/ADD/CHANGE/DROP 字段名 数据类型 属性;
alter table 表名 ADD键名(字段);给指定字段添加键约束

创建表指定主键字段有两种方式
create table 表名(字段1xxx,字段2xxx,…,primary key(字段));
create table 表名(字段1xx primary key,…);alter table 表名 ADD primary key(字段);

克隆表
方法一
create table new_table like old_table;
insert into new_table selectfrom old_table;
方法2
create table new_table(select
from old_table);

查看表结构
desc表名
show create table 表名\G 以创建表的命令形式显示表的结构

做了外键约束后,
要插入新的数据记录时,需要先在主键表中插入相关数据,才能在外键表插入相关数据插入数据时,是先主后从
要删除数据记录时,要先删除外键表的相关数据,才能在主键表删除相关数据记录
删除数据时,要先从再主

SQL语句 DDL DML DQL DCL
库 表 结构的增 删 改 查
表数据的 增 删 改 查
用户的 增 删 改 查
用户权限的 增 删 改 查
create user ‘username’@‘address’ identified by ‘password’;
rename user old_user to new user;
drop user
select user,host,authentication_string from mysql.user;
set password=password(‘XXXX’);
set password for
修改mysql配置文件,在mysqld配置项下加入 skip-grant-tables
mysql update mysql.user set authentication_string=password(‘XXX’)where user=‘root’;

grant 权限列表/ALL ON 库名.表名 to ‘username’@‘address’ [identified by ‘XXXXX’];
*表示所有
show grants for ‘username’@‘address’;

revoke 权限列表/ALL on 库名.表名 from ‘username’@‘address’;

mysql -u 用户名 -p[密码] -h 目标IP/主机名 -P 端口号

原网站

版权声明
本文为[[email protected]]所创,转载请带上原文链接,感谢
https://blog.csdn.net/FYR1018/article/details/124876479