MySQL数据库基础

MySQL数据库基础

一、数据库的基本概念

1. 数据(Data)

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

2. 表(Table)

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

3. 数据库(DataBase)

img
表的集合,是存储数据的仓库
以一定的组织方式存储的相互有关的数据集合
是按照数据结构来组织、存储和管理数据的仓库

4. 数据库管理系统(DBMS)

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

5. 数据库系统

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

二、数据库的发展

1. 第一代数据库

自20世纪60年代起,第一代数据库系统问世
是层次模型与网状模型的数据库系统
为统一管理和共享数据提供了有力的支撑

2. 第二代数据库

20世纪70年代初,第二代数据库——关系数据库开始出现
20世纪80年代初,IBM公司的关系数据库系统DB2问世,开始逐步取代层次与网状模型的数据库,称为行业主流
到目前为止,关系数据库系统仍占领数据库应用的主流地位

3. 第三代数据库

自20世纪80年代开始,适应不同领域的新型数据库系统不断涌现
面向对象的数据库系统,实用性强、适用面广
20世纪90年代后期,形成了多种数据库系统共同支撑应用的局面
一些新的元素被添加进主流数据库系统中,例如Oracle支持的“关系-对象”数据库模型

三、主流的数据库介绍

1. SQL Server(微软公司产品)

img
面向Windows操作系统
简单、易用

2. Oracle(甲骨文公司产品)

img
面向所有主流平台
安全、完善,操作复杂

3. DB2(IBM公司产品)

img
面向所有主流平台
大型、安全、完善

4. MySQL(甲骨文公司收购)

img
免费、开源、体积小

5. PostgreSQL(PostgreSQL Global Development Group维护)

img
面向所有主流平台
免费、开源,功能强大

6. GaussDB(华为公司产品)

img
涵盖关系型、非关系型数据库服务
可靠性、扩展性、备份恢复

7. OceanBase(蚂蚁集团产品)

img
金融级分布式关系数据库
数据强一致、高可用、高性能、在线扩展、高度兼容SQL标准和主流关系数据库、低成本

四、数据库类型

1. 关系数据库

关系数据库系统是基于关系模型的数据库系统
关系模型的数据结构使用简单易懂的二维数据表
关系模型可用简单的“实体-关系”(E-R)图来表示
E-R图中包含了实体(数据对象)、关系和属性三个要素
img

(1)实体

也称为实例,对应现实世界中可区别于其他对象的“事件”或“事务”
如上图的银行客户、银行账户

(2)属性

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

(3)联系

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

(4)关系数据库的构成

所有实体及实体之间联系的集合构成了一个关系数据库
img
img
img

(5)二维数据表

关系数据库的存储结构是二维表格
在每个二维表中
● 每一行称为一条记录,用来描述一个对象的信息
● 每一列称为一个字段,用来描述对象的一个属性
img

(6)关系数据库的应用

关系型数据库 应用举例
Oracle、MySQL 12306用户信息系统
SQL Server、Sybase 淘宝账号系统
Informix、access 联通手机号信息系统
DB2、FoxPRO 银行用户账号系统
PostgreSQL 网站用户信息系统

2. 非关系数据库

(1)非关系数据库简介

非关系数据库也被称为NoSQL(Not Only SQL)
存储数据不以关系模型为依据,不需要固定的表格式
常用的非关系数据库有:Redis、mongoDB等

(2)非关系数据库的优点

● 数据库可高并发读写
● 对海量数据高效率存储与访问
● 数据库具有高扩展性与高可用性

(3)对比关系型数据库

优势:
● 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
● 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
● 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
● 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。

缺点:
● 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
● 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
● 不提供关系型数据库对事物的处理。

(4)非关系数据库的主要特点

  1. 数据存储结构
    首先关系型数据库一般都有固定的表结构,并且需要通过DDL语句来修改表结构,不是很容易进行扩展,而非关系型数据库的存储机制就有很多了,比如基于文档的,K-V键值对的,还有基于图的等,对于数据的格式十分灵活没有固定的表结构,方便扩展,因此如果业务的数据结构并不是固定的或者经常变动比较大的,那么非关系型数据库是个好的选择
  2. 可扩展性
    传统的关系型数据库给人一种横向扩展难,不好对数据进行分片等,而一些非关系型数据库则原生就支持数据的水平扩展(比如mongodb的sharding机制),并且这可能也是很多NoSQL的一大卖点,其实像Mysql这种关系型数据库的水平扩展也并不是难,即使NoSQL水平扩展容易但对于向跨分片进行joins这种场景都没有什么太好的解决办法,不管是关系型还是非关系型数据库,解决水平扩展或者跨分片Joins这种场景,在应用层和数据库层中间加一层中间件来做数据处理也许是个好的办法
  3. 数据一致性 非关系型数据库一般强调的是数据最终一致性,而不没有像ACID一样强调数据的强一致性,从非关系型数据库中读到的有可能还是处于一个中间态的数据,因此如果你的业务对于数据的一致性要求很高,那么非关系型数据库并不一个很好的选择,非关系型数据库可能更多的偏向于OLAP场景,而关系型数据库更多偏向于OLTP场景

五、MySQL数据库

1. MySQL简介

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

2. MySQL的特点

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

3. MySQL商业版与社区版

MySQL商业版是由MySQL AB公司负责开发与维护,需要付费才能使用
MySQL社区版是由分散在世界各地的MySQL开发者、爱好者一起开发与维护,可以免费使用
两者区别在于
● 商业版组织管理与测试环节更加严格,会比社区版更稳定
● 商业版不遵守GPL,社区版遵从GPL可以免费使用
● 商业版可获得7*24小时的服务,社区版则没有

4. MySQL产品阵营

第一阵营:5.0-5.1阵营,可说是早期产品的延续
第二阵营:5.4-5.7阵营,整合了MySQL AB公司、社区和第三方公司开发的存储引擎,从而提高性能
第三阵营:6.0-7.1阵营,就是MySQL Cluster版本,为适应新时代对数据库的集群需求而开发
第四阵营:8.0阵营,最新版本,由于新版本未知BUG多、兼容性差等特点,暂时使用的不多
下载网址:http://www.dev.mysql.com/downloads

5. MySQL数据库结构

数据库数据表记录字段

行(记录):用来描述一个对象的信息
列(字段):用来描述对象的一个属性

6. 常用的数据类型

MySQL主要包括以下五大类
● 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
● 浮点数类型:FLOAT、DOUBLE、DECIMAL
● 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
● 日期类型:Date、DateTime、TimeStamp、Time、Year
● 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

(1)整型

MySQL数据类型 含义
tinyint(m) 1个字节,范围(-128~127)
smallint(m) 2个字节,范围(-32768~32767)
mediumint(m) 3个字节,范围(-8388608~8388607)
int(m) 4个字节,范围(-2147483648~2147483647)
bigint(m) 8个字节,范围(+-9.22*10的18次方)
int(m)中的m不是限制字段取值范围的,int的取值范围是固定的(0至4294967295)或(-2147483648至2147483647),如果加了unsigned参数那么取值范围就为(0至4294967295),m这个值是为了zerofill在字段中的值不够时补零的

(2)浮点型

MySQL数据类型 含义
float(m,d) 单精度浮点型,8位精度(4字节),m总个数,d小数位
double(m,d) 双精度浮点型,16位精度(8字节),m总个数,d小数位
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.456,但总个数还以实际为准,即6位。整数部分最大是3位,如果插入数12.123456,存储的是12.1234,如果插入12.12,存储的是12.1200。

(3)定点型

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

(4)字符串

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
  1. char和varchar区别
    img
    ● char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
    ● char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
    ● char类型的字符串检索速度要比varchar类型的快。
  2. varchar和text区别
    ● varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
    ● text类型不能有默认值。
    ● varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

(5)二进制数据

  1. blob和text存储方式不同,text以文本方式存储,英文存储区分大小写,而blob是以二进制方式存储,不分大小写。
  2. blob存储的数据只能整体读出。
  3. text可以指定字符集,blob不用指定字符集。

(6)日期时间类型

MySQL数据类型 含义
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 自动存储记录修改时间
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

(7)数据类型的属性

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
UNIQUE KEY 唯一约束
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name 指定一个字符集
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。
唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

(8)MySQL数据类型的长度和范围

数据类型 字节长度 范围或用法
Bit 1 无符号[0,255],有符号[-128,127],备注:BIT和BOOL布尔型都占用1字节
TinyInt 1 整数[0,255]
SmallInt 2 无符号[0,65535],有符号[-32768,32767]
MediumInt 3 无符号[0,224-1],有符号[-223,2^23-1]]
Int 4 无符号[0,232-1],有符号[-231,2^31-1]
BigInt 8 无符号[0,264-1],有符号[-263 ,2^63 -1]
Float(M,D) 4 单精度浮点数。这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
Double(M,D) 8 双精度浮点。
Decimal(M,D) M+1或M+2 未打包的浮点数,用法类似于FLOAT和DOUBLE,如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。
Date 3 以YYYY-MM-DD的格式显示,比如:2009-07-19
Date Time 8 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
TimeStamp 4 以YYYY-MM-DD的格式显示,比如:2009-07-19
Time 3 以HH:MM:SS的格式显示。比如:11:22:30
Year 1 以YYYY的格式显示。比如:2009
Char(M) M 定长字符串。
VarChar(M) M 变长字符串,要求M<=255
Binary(M) M 类似Char的二进制存储,特点是插入定长不足补0
VarBinary(M) M 类似VarChar的变长二进制存储,特点是定长不补0
Tiny Text Max:255 大小写不敏感
Text Max:64K 大小写不敏感
Medium Text Max:16M 大小写不敏感
Long Text Max:4G 大小写不敏感
TinyBlob Max:255 大小写敏感
Blob Max:64K 大小写敏感
MediumBlob Max:16M 大小写敏感
LongBlob Max:4G 大小写敏感
Enum 1或2 最大可达65535个不同的枚举值
Set 可达8 最大可达64个不同的值
Geometry
Point
LineString
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection

5.1、编译安装MySQL数据库

(1)安装mysql环境依赖包

确认安装 gcc 、 gcc-c++ 、make、cmake
ncurses-devel、(字符终端屏幕控制基本库)
bison、(语法分析器)
libaio-devel (支持同步I/O)的软件包

yum -y install gcc gcc-c++ make ncurses ncurses-devel bison cmake libaio-devel

(2)创建运行用户

useradd -s /sbin/nologin mysql

(3)编译安装

cd /opt
tar zxvf mysql-boost-5.7.20.tar.gz
cd /opt/mysql-5.7.20/

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1

make -j 4 && make install

(4)修改mysql配置文件

vim /etc/my.cnf
#删除全部内容后编辑
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
 
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

(5)更改mysql安装目录和配置文件的属主数组

chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf

(6)设置路径环境变量

echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile

source /etc/profile

(7)初始化数据库

cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

(8)添加mysqld系统服务

cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/

systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld

(9)修改mysql的登录密码

mysqladmin -u root -p password "abc123"

(10)授权远程登录

mysql -u root -p
回车
······ 
mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
mysql> quit

5.2、MySQL数据库自动补全命令的三种方式

1、方式一:临时使用自动补全功能

mysql -u root -p --auto-rehash

2、方式二:永久使用自动补全功能

vi /etc/my.cnf
 
[mysql]
auto-rehash

3、方法三:使用软件mycli实现自动补全功能

3.1 安装相关依赖软件(需要配置yum官方或者阿里源进行安装)

yum -y install epel-release
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc

3.2 下载python安装包(自己下载过可以忽略此步骤)

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

3.3 创建目录,并添加配置

mkdir ~/.pip/
 
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
 
[install]
trusted-host=mirrors.aliyun.com
EOF

3.4 安装相关依赖软件,解压python软件包并进行编译安装

yum -y install libffi-devel zlib* python-devel openssl-devel
tar -zxvf Python-3.9.0.tgz
cd Python-3.9.0/
./configure --prefix=/usr/local/python --with-ssl
make -j4 && make install

3.5 优化路径,安装pip3

ln -s /usr/local/python/bin/python3 /usr/bin/

echo 'export PATH=/usr/local/python/bin:$PATH' >> /etc/profile 
source /etc/profile

pip3 install mycli
mycli

3.6 登录测试

mycli -u root -p <密码>

六、MySQL的简单操作

1. SQL语句

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

2. SQL语言分类

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

3. MySQL查看指令

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

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

(2)查看数据库中包含的表

use 数据库名;
show tables;

image

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

use 数据库名;
describe [数据库名.]表名;
可缩写成:desc 表名;

image

image

4. 创建及删除数据库和表

(1)创建新的数据库

create database 数据库名;

image

(2)创建新的表

create table 表名 (字段1 数据类型,字段2 数据类型[,...][,parmary key (主键名)]);
主键一般选择能代表唯一性的字段,不允许取空值(NULL),一个表只能有一个主键。
例如:

create database test;
use test;

CREATE TABLE test1 (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT '',PRIMARY KEY (id));

desc test1;

image

(3)删除指定的数据表

drop table [数据库名.]表名;
如不用use进入库中,则需加上数据库名

image

(4)删除指定的数据库

drop database 数据库名;

image

5. 管理表中的数据记录

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

方法1:

基础格式:insert into 表名(字段1,字段2[,...]) values(1,'zhangsan',70.5,PASSWORD('123456'));
#PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示,若不使用PASSWORD(),查询时以明文显示

insert into test1(id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456'));

select * from test1;

image

方法2:

基础格式:insert into 表名 values(2,'lisi',90,654321);

insert into test1 values(2,'lisi',90,654321);
 
select * from test1;

(2)查询数据记录

基础格式:select 字段名1,字段名2[,...] from 表名 [where 条件表达式];
例如:
select * from test1;
#查看完整表

image

select id,name,score from test1 where id=2;
select id,score,name from test1 where id=2;
#按照指定顺序显示id等于2的行

image

mysql> select name from test1\G
#以列表方式纵向显示

image

select * from test1 limit 2;
#只显示前2行

image

select * from test1 limit 2,3;
#显示第2行后的前3行

image

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

基础格式:update 表名 set 字段1=字段值1[,字段2=字段值2,...] [where 条件表达式];
例如:
update test1 set passwd=PASSWORD('') where name='zhangsan';
#修改zhangsan密码为空

image

update test1 set name='wangwu',passwd=' ' where id=2;
#修改2号,名字为wangwu,密码为空

image

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

基础格式:delete from 表名 [where 条件表达式];
例如:
delete from test1 where id=2;
#删除test1表中id为2的行

image

6. 修改表名和表结构

(1)修改表名

基础格式:alter table 旧表名 rename 新表名;
例如:
alter table test1 rename test_table1;

image

(2)扩展表结构(增加字段)

基础格式:alter table 表名 ADD address varchar(50) default '地址不详';
#deafult '地址不详':表示此字段设置默认值“地址不详”,可与NOT NULL配合使用
例如:
alter table test_table1 ADD address varchar(50) default '地址不详';

image

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

基础格式:alter table 表名 change 旧列名 新列名 数据类型 [unique key];
#change可修改字段名、数据类型、约束等所有项
例如:
alter table test_table1 change name user_name varchar(10) unique key;

image

(4)删除字段

基础格式:alter table 表名 drop 字段名;
例如:
alter table test_table1 drop passwd;

image

(5)案例扩展

#使用 if 判断 创建表并测试自增和填充
use test;
create table if not exists info (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));

分析:
if on exists:表示检测要创建的表是否已存在,如果不存在就继续创建
int(4) zerofill:表示若数制不满4位数,则前面用“0”填充,例如0001
auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
unique key:表示此字段唯一键约束,此字段数据不可以重复,一张表中只能有一个主键,但是可以多多个唯一键
not null:表示此字段不允许为null

image

image

insert into info(id,name,cardid,hobby) values(1,'lili',123,' ');
insert into info(id,name,cardid,hobby) values(2,'lulu',1234,' ');
select *from info;

insert into info(name,cardid,hobby) values('juju',12345,' ');
select *from info;

insert into info(name,cardid,hobby) values('juju',12345,' ');
insert into info(name,cardid,hobby) values('gigi',123456,' ');
select *from info;

insert into info(id,name,cardid,hobby) values(4,'lulu',123404,'美食');
select *from info;

image

image

image

image

七、数据表高级操作

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

方法一:

show tables;
create table test1 like test_table1;
#通过like方法,复制test_table1表结构生成test1表
desc test1;
select *from test1;
insert into test1 select * from test_table1;
#将test_table1表中的数据复制到test1表中
select *from test1;

image

image

方法二:

create table test2 (select * from test1);
show create table test2\G
获取数据表的表结构、索引等信息
select * from test2;

image

2. 清空表,删除表内的所有数据

方法一:

delete from test_table1;
#delete清空表后,返回的结果内有删除的记录条目,delete工作时是一行一行的删除记录数据的,如果表中有自增长字段,使用delete from删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录
alter table test2 change id id int(11) primary key auto_increment;
select * from test2;
delete from test2;
select * from test2;
desc test2;
insert into test2(user_name,score) values('lili',18);
select * from test2;

image

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

select * from test2;
truncate table test2;
select *from test2;
insert into test2(user_name,score) values('popo',22);
select *from test2;

image

3. 创建临时表

create temporary table 表名 (字段1 数据类型,字段2 数据类型[,...] [,primary key (主键名)]);
临时表创建成功之后,使用show tables命令是看不到创建的临时表的,临时表会在连接退出后被销毁。如果在退出连接之前,也可以执行增删改查等操作,比如使用drop table语句手动直接删除临时表。
create temporary table test3 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid bigint(18) not null unique key,
hobby varchar(50));
 
insert into test3 values(1,'zhangsan',112233445566778899,'running');

select * from test3;

show tables;

quit
 
mysql -u root -pabc123

select * from test.test3;

image

image

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

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

  1. 1. 创建主表
       create table 主表名 (主键字段 数据类型,字段2 数据类型);
    2. 创建从表
       create table 从表名 (字段1 数据类型,字段2 数据类型,字段3 数据类型,外键字段 数据类型);
    create table profession (pid int(4),proname varchar(50));#创建主键表profession,定义各字段属性
    desc profession;#查看主键表结构
    
    create table student (id int(4) primary key auto_increment,name varchar(10),age int(3),proid int(4));#创建从表student,定义各字段属性
    desc student;#查看从表结构
    

image

  1. 为主表添加一个主键约束,主键名建议以“PK_”开头
    alter table 主键表名 add [constraint PK_主键名] primary key (主键字段);
alter table profession add constraint PK_pid primary key (pid);

desc profession;

image

  1. 为从表添加外键,并将从表的外键字段和主表的主键字段建立外键关联。外键名建议以“FK_”开头
    alter table 外键表名 add [constraint FK_主键名] foreign key (外键字段) references 主键表名 (主键字段);
mysql> alter table student add constraint FK_pro foreign key (proid) references profession (pid);
 
desc student;

image

  1. 插入新的数据记录时,要先主表再从表
    主表赋值
insert into profession values(1,'数学');

insert into profession values(2,'英语');

select * from profession;

image

从表赋值

insert into student values(1,'zhangsan',18,1);
 
insert into student values(2,'lisi',19,1);

insert into student values(3,'wangwu',20,2);

insert into student values(4,'zhaoliu',20,4);

select * from student;

image

  1. 删除数据记录时,要先从表再主表,也就是说删除主键表的记录时必须先删除其他与之关联的表中的记录。
delete from student where proid=1;

delete from profession where pid=1;

delete from profession where pid=2;

select * from student;

select * from profession;

image

  1. 查看和删除外键约束
show create table student\G;

desc student;

alter table student drop foreign key FK_pro;

alter table student drop key FK_pro;

show create table student\G;

image

5. MySQL中6种常见的约束

常见约束 说明
主键约束(primary key) 用于保证该字段的值具有唯一性并且非空
外键约束(foreign key) 用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值
非空约束(not null) 用于保证该字段的值不能为空
唯一性约束(unique [key index])
默认值约束(default) 用于保证该字段有默认值
自增约束(auto_increment) 用于保证该字段的值是上一条的+1值,也可以自定义值,下一条将在该值基础上+1。可以约束任何一个字段,该字段不一定是主键字段,但主键字段一定是自增字段,即primary_key要与auto_increment一起作用于同一个字段

八、 数据库用户管理

1. 新建用户

create user '用户名'@'来源地址' [identified by [password] '密码'];
'用户名':指定将创建的用户名
'来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符%
'密码':若使用明文密码,直接输入'密码',插入到数据库时由MySQL自动加密;若使用加密密码,需要先使用select password('密码')获取该密码的密文,再在语句中添加password '密文';若省略'identified by'部分,则用户的密码将为空(不建议使用)

mysql> create user 'user1'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
 
mysql> select password('123456');
+-------------------------------------------+
| password('123456')                        |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
 
mysql> create user 'user2'@'%' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
Query OK, 0 rows affected, 1 warning (0.00 sec)

2. 查看用户信息

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

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| user1         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | localhost |
| user2         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
+---------------+-------------------------------------------+-----------+
7 rows in set (0.00 sec)

3. 重命名用户

rename user '旧用户名'@'旧来源地址' to '新用户名'@'新来源地址';
注:'新用户名'@'新来源地址'不可与已有账户冲突

mysql> rename user 'user1'@'localhost' to 'zhangsan'@'%';
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| zhangsan      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
| user2         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
+---------------+-------------------------------------------+-----------+
7 rows in set (0.00 sec)
 
mysql> rename user 'zhangsan'@'%' to 'user2'@'%';
ERROR 1396 (HY000): Operation RENAME USER failed for 'zhangsan'@'%'

4. 删除用户

drop user '用户名'@'来源地址';

mysql> drop user 'zhangsan'@'%'
    -> ;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| user2         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
+---------------+-------------------------------------------+-----------+
6 rows in set (0.00 sec)

5. 修改密码

(1)修改其他用户密码

set password for '用户名'@'来源地址' = password('新密码');

mysql> set password for 'user2'@'%' = password('654321');
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| user2         | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 | %         |
+---------------+-------------------------------------------+-----------+
6 rows in set (0.00 sec)

(2)修改当前用户密码

set password = '新密码'

mysql> set password = '';
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          |                                           | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| user2         | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 | %         |
+---------------+-------------------------------------------+-----------+
6 rows in set (0.00 sec)

6. 忘记密码登录改密

[root@localhost ~]# vim /etc/my.cnf
 
#在mysqld参数下插入以下内容,表示登录时跳过授权表。当忘记账号密码时可以使用该参数修改密码,但是要随用随关,重启mysql,不然服务器上会有很大的风险。
skip-grant-tables
 
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20 Source distribution
 
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> update user set authentication_string=password('123456') where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 2  Changed: 1  Warnings: 1
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,authentication_string,host from user;
+---------------+-------------------------------------------+-----------+
| user          | authentication_string                     | host      |
+---------------+-------------------------------------------+-----------+
| root          | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | localhost |
| root          | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | %         |
| bbsuser       | *01A6717B58FF5C7EAFFF6CB7C96F7428EA65FE4C | %         |
| user2         | *2A032F7C5BA932872F0F045E0CF6B53CF702F2C5 | %         |
+---------------+-------------------------------------------+-----------+
6 rows in set (0.00 sec)
posted @ 2022-09-14 08:56  玖拾一  阅读(123)  评论(0编辑  收藏  举报