MySQL基础(第一弹)

目录

MySQL的安装

1.更新系统的软件包列表

2.安装MySQL服务器

3.检查MySQL服务是否启动,若没有启动则手动启动

4.登录MySQL(默认安装之后不需要密码就可以登录)

5.停止MySQL服务

数据库基础

1.1什么是数据库

1.2主流的数据库

1.3基本使用

1.3.1连接服务器

服务器的管理

1.3.2服务器,数据库,表关系

1.3.3使用案例

1.创建数据库

2.使用数据库

3.创建数据库表

4.表中插入数据

5.查询表中的数据

1.3.4数据逻辑存储

1.4MySQL架构

[1.5 SQL分类](#1.5 SQL分类)

1.6存储引擎

[1.6.1 存储引擎](#1.6.1 存储引擎)

1.6.2查看存储引擎

库的操作

1.1创建数据库

[1.2 常见数据库案例](#1.2 常见数据库案例)

1.2.1创建名为db1的数据库

[1.2.2 创建一个使用utf8字符集的db2 数据库](#1.2.2 创建一个使用utf8字符集的db2 数据库)

[1.2.3 创建一个使用utf字符集,并带校验规则的db3 数据库](#1.2.3 创建一个使用utf字符集,并带校验规则的db3 数据库)

[1.3 字符集和校验规则](#1.3 字符集和校验规则)

[1.3.1 查看系统默认字符集以及校验规则](#1.3.1 查看系统默认字符集以及校验规则)

[1.3.2 查看数据库支持的字符集](#1.3.2 查看数据库支持的字符集)

1.3.3查看数据库支持的字符集校验规则

1.3.4校验规则对数据库的影响

1.不区分大小写的情况

2.区分大小写的情况

3.不区分大小写的查询以及结果

4.区分大小写的查询以及结果

5.不区分大小写排序以及结果

6.区分大小写排序以及结果

1.4操纵数据库

[1.4.1 查看数据库](#1.4.1 查看数据库)

[1.4.2 显示创建语句](#1.4.2 显示创建语句)

[1.4.3 修改数据库](#1.4.3 修改数据库)

[1.4.4 数据库删除](#1.4.4 数据库删除)

[1.4.5 备份和恢复](#1.4.5 备份和恢复)

1.备份

2.还原

3.注意事项

[1.4.6 查看连接情况](#1.4.6 查看连接情况)

表的操作

[1.1 创建表](#1.1 创建表)

[1.2 创建表案例](#1.2 创建表案例)

[1.3 查看表结构](#1.3 查看表结构)

[1.4 修改表](#1.4 修改表)

在users表添加两条记录:

在users表中添加一个字段,用于保存图片路径:

修改name,将其长度改为60.

删除password列

修改表名为employee

[将name 列修改为xingming](#将name 列修改为xingming)

[1.5 删除表](#1.5 删除表)

数据类型

1.数据类型分类

2.常用数值类型:

[2.1 tinyint类型](#2.1 tinyint类型)

[2.2 bit类型](#2.2 bit类型)

[2.3 小数类型](#2.3 小数类型)

[2.3.1 float](#2.3.1 float)

[2.3.2 decimal](#2.3.2 decimal)

3.字符串类型

[3.1 char](#3.1 char)

[3.2 varchar](#3.2 varchar)

[3.3 char和varchar的比较](#3.3 char和varchar的比较)

4.日期和时间类型

4.1常用的日期有如下三个:

[4.2 enum和set](#4.2 enum和set)

1.enum:枚举,"单选"类型

2.set:集合,"多选"类型


MySQL的安装

注:本文章采用的是在云服务器下安装MySQL。使用的是Ubuntu操作系统。

1.更新系统的软件包列表

sudo apt-get update

2.安装MySQL服务器

sudo apt install -y mysql-server

3.检查MySQL服务是否启动,若没有启动则手动启动

如没有启动则手动启动:

sudo service mysql start

4.登录MySQL(默认安装之后不需要密码就可以登录)

5.停止MySQL服务

sudo service mysql stop

数据库基础

1.1什么是数据库

存储数据用文件就可以了,为什么还要弄个数据库?

文件保存数据有以下几个缺点:

1.文件的安全性问题。

2.文件的不利于数据查询和管理。

3.文件不利于存储海量数据。

4.文件在程序中控制不方便。

数据库存储介质:

1.磁盘

2.内存

为了解决上述问题,专家们设计出更加利于管理数据的东西----数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。

1.2主流的数据库

1.SQL Server:微软的产品,.Net程序员的最爱,中大型项目。

2.Oracle:甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。

3.MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商、SNS、论坛。对简单的SQL处理效果好。

4.PostgreSQL:加州大学伯克利分校计算机开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。

5.SQLite:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百k的内存就够了。

6.H2:是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。

1.3基本使用

1.3.1连接服务器

登录:

mysql -h 127.0.0.1 -P 3306 -u root -p

输出:

注意:

1.如果没有写127.0.0.1 默认是连接本地。

2.如果没有写-P 3306 默认是连接3306端口号。

服务器的管理

1.通过win+r 输入services.msc打开服务管理器。(win下也可以安装MySQL)

2.通过下图左侧停止,暂停,启动按钮进行服务管理。

1.3.2服务器,数据库,表关系

1.所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
2.为保存应用中实体的数据,一般会在数据库中创建多个表,已保存程序中实体的数据。
3.数据库服务器,数据库和表的关系如下:

1.3.3使用案例

1.创建数据库

create database helloworld;

2.使用数据库

use helloworld;

3.创建数据库表

create table student(

id int,

name varchar(32),

gender varchar(2)

);

4.表中插入数据

insert into student (id,name,gender)value(1,'张三','男');

insert into student (id,name,gender)value(2,'李四','男');

insert into student (id,name,gender)value(3,'王五','男');

5.查询表中的数据

select * from student;

1.3.4数据逻辑存储

1.4MySQL架构

MySQL是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Unix/Linux,windows,Mac和Solaris。各种系统在底层实现方面各有不同,但是MySQL基本上能保证在各个平台上的物理体系结构的一致性。

1.5 SQL分类

1.DDL【data definition language】数据定义语言,用来维护存储数据的结构。

代表指令:create、drop、alter

2.DML【data manipulation language】数据操纵语言,用来对数据进行操作。

代表指令:insert、delete、update

DML中又单独分了一个DQL,数据查询语言,代表指令:select。

3.DCL【data control language】数据控制语言,主要负责权限管理和事务。

代表指令:grant、revoke、commit

1.6存储引擎

1.6.1 存储引擎

存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎。

1.6.2查看存储引擎

show engines;

库的操作

1.1创建数据库

语法:

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [create_specification] ... ]

create_specification:

[DEFAULT] CHARACTER SET charset_name

[DEFAULT] COLLATE collation_name

说明:

1.大写的表示关键字。

2.[] 里面是可选项。

3.CHARACTER SET:指定数据库采用的字符集。

4.COLLATE:指定数据库字符集的校验规则。

1.2 常见数据库案例

1.2.1创建名为db1的数据库

create database db1;
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_general_ci

1.2.2 创建一个使用utf8字符集的db2 数据库

create database db2 charset=utf8;

1.2.3 创建一个使用utf字符集,并带校验规则的db3 数据库

create database db3 charset=utf8 collate utf8_general_ci;

1.3 字符集和校验规则

1.3.1 查看系统默认字符集以及校验规则

show variables like 'character_set_database';

show variables like 'collation_database';

1.3.2 查看数据库支持的字符集

show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。

1.3.3查看数据库支持的字符集校验规则

show collation;

1.3.4校验规则对数据库的影响

1.不区分大小写的情况

创建一个数据库,校验规则使用utf8_general_ci [不区分大小写]

create database test1 collate utf8_general_ci;
use test1;
create table person(

name varchar(20));
insert into person values('a');

insert into person values('A');

insert into person values('b');

insert into person values('B');

2.区分大小写的情况

创建一个数据库,校验规则使用utf8_bin【区分大小写】

create database test2 collate utf8_bin;
use test2;
create table person (

name varchar(20));
insert into person values('a');

insert into person values('A');

insert into person values('b');

insert into person values('B');

进行查询

3.不区分大小写的查询以及结果
4.区分大小写的查询以及结果

结果排序

5.不区分大小写排序以及结果
6.区分大小写排序以及结果

1.4操纵数据库

1.4.1 查看数据库

show databases;
select database();------>使用database()函数,查看当前在哪个数据库下面

1.4.2 显示创建语句

show create database 数据库名;----->查看创建细节

说明:

1.MySQL建议我们关键字使用大写,但是不是必须的。

2.数据库名字的反引号 '' ,是为了防止使用的数据库名刚好是关键字。

3./* 80016 DEFAULT... */ 这个不是注释,表示当前MySQL版本大于8.00版本,就执行这句话。

1.4.3 修改数据库

语法:

ALTER DATABASE db_name

[alter_spacification [,alter_spacification].... ]

alter_spacification;

[DEFAULT] CHARACTER SET charset_name

[DEFAULT] COLLATE collation_name

说明:

对数据库的修改主要是指修改数据库的字符集,校验规则。

例子:将mytest数据库字符集改成gbk

1.4.4 数据库删除

DROP DATABASE [IF NOT EXISTS] db_name;

执行删除之后的结果:

1.数据库内部看不到对应的数据库。

2.对应的数据库文件夹被删除,级联删除,里面的数据表全部被删除。
注意:不要随便删除数据库!

不要轻易修改数据库的名字!!

1.4.5 备份和恢复

1.备份

语法:

mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径

演示:将mytest库备份到文件(退出连接)

mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql

这时,可以打开看看mytest.sql文件里的内容,其实把我们整个创建数据库,建表,导入数据的雨具都装载到这个文件中。

2.还原

mysql > source D:/mysql-5.7.22/mytest.sql ;

3.注意事项

如果备份的不是整个数据库,而是其中的一张表,该怎么做?

mysqldump -u root -p 密码 -B 数据库名 表名1 表名2 > D:/mytest.sql

同时备份多个数据库

mysqldump -u root -p 密码 -B 数据库名1 数据库名2 ... > 数据库存放路径

如果同时备份一个数据库时,没有带上-B参数,在恢复数据库时,需要先创建空数据库,然后使用数据库,在使用source来还原!

1.4.6 查看连接情况

语法:

show processlist

可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登录的,很有可能你的数据库被人入侵了。以后大家发现自己的数据库比较慢的时候,可以用这个指令来查看数据库的连接情况。

表的操作

1.1 创建表

语法:

CREATE TABLE table_name(

filed1 datatype,

filed2 datatype,

filed3 datatype

)character set 字符集 collate 校验规则 engine 存储引擎;

说明:

1.filed 表示列名。

2.datatype 表示列的类型。

3.character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准。

4.collate 校验规则,如果没有指定的校验规则,则以所在数据库的校验规则为准。

1.2 创建表案例

create table users(

id int,

name varchar(20)comment '用户名',

password char(32)comment '密码',

birthday date comment '生日'

)character set utf8 engine MyISAM;
用character set utf8 collate utf8_general_ci

或者charset=utf8 collate=tuf8_general_ci 两种方式都可以。

说明:

1.不同的存储引擎,创建表的文件不一样。

users表存储引擎是MyISAM,在数据目中有三个不同的文件,分别是:

users.frm:表结构。

users.MYD:表数据。

users.MYI:表索引。

备注:创建一个engine是innodb的数据库,观察存储目录。

1.3 查看表结构

desc 表名;

1.4 修改表

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这是我们就需要修改表。

ALTER TABLE tablename ADD (column datatype [DEFAULT expr] [,column datatype]...... );

ALTER TABLE tablename MODIFY (column datatype [DEFAULT expr] [,column datatype]...... );

ALTER TABLE tablename DROP (column );

案例:

在users表添加两条记录:

insert into users values(1,'a','b','2001-01-01'),(2,'b','c','2002-02-02');

在users表中添加一个字段,用于保存图片路径:

alter table users add assets varchar(100)comment '图片路径' after birthday;

插入新字段后,对原来表中的数据没有影响:

修改name,将其长度改为60.

alter table users modify name varchar(60);

删除表的password列

注意:删除字段一定要小心,删除字段以及对应的列的数据都没了。
alter table users drop password;

修改表名为employee

alter table users rename to employee ;

注意:这里的rename后面的to可以省略。

修改表中的列名称

alter table employee change name xingming varchar(60);---新字段需要完善定义

注意:修改列的名字的时候,一定要把属性也得带上!

1.5 删除表

语法:

DROP [TEMPORARY] TABLE [IF EXISTS] tb_name [, tb_name]......

例子:

drop table t1;

数据类型

MySQL的一种约束。

1.数据类型分类

分类:1.数值类型。2.文本、二进制类型。3.时间日期。4.string类型。

1.数值类型:

|----------------------------------|-------------------------------------|
| 数据类型 | 说明 |
| BIT (M) | 位类型。M指定位数,默认值1,范围1~64 |
| TINYINT [UNSIGNED] | 带符号的范围-128~127 。无符号范围0~255.默认有符号。 |
| BOOL | 使用0和1表示真和假 |
| SMALLINT [UNSIGNED] | 带符号是-2^15次方 到 2^15-1 无符号是2^16-1 |
| INT [UNSIGNED] | 带符号是-2^31次方 到 2^31-1 无符号是2^32-1 |
| BIGINT [UNSIGNED] | 带符号是-2^63次方 到 2^63-1 无符号是2^64-1 |
| FLOAT [(M,D)] [UNSIGNED] | M指定显示长度,d指定小数位数,占用4字节 |
| DOUBLE [(M,D)] [UNSIGNED] | 表示比float精度更大的小数,占用空间8字节 |
| DECIMAL (M,D)[UNSIGNED] | 定点数M指定长度,D表示小数点的位数 |

2.文本、二进制类型

|-------------------|--------------------|
| 数据类型 | 说明 |
| CHAR(size) | 固定长度字符串,最大255 |
| VARCHAR(SIZE) | 可变长度字符串,最大长度65535 |
| BLOB | 二进制数据 |
| TEXT | 大文本,不支持全文索引,不支持默认值 |

3.时间日期

|--------------------------------|--------------------------------------------------|
| 数据类型 | 说明 |
| DATE / DATETIME /TIMESTAMP | 日期类型(yyy-mm-dd)(yyy-mm-dd 嘿hh:mm:ss)timestamp时间戳 |

4.string类型

|------------|-------------------------------------------------------------------------------------------|
| 数据类型 | 说明 |
| ENUM类型 | ENUM是一个字符串对象,其值来自表创建时在列规定中显示枚举的一列值 |
| SET类型 | SET是一个字符串对象,可以有多个零或者多个值,其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时,各成员之间用逗号隔开。这样set成员值本身不能包含逗号。 |

2.常用数值类型:

|-----------|----|----------------------|----------------------|
| 类型 | 字节 | 最小值(带符号的) | 最大值(带符号的) |
| | | 最小值(无符号的) | 最大值(无符号的) |
| TINYINT | 1 | -128 | 127 |
| | | 0 | 255 |
| SMALLINT | 2 | -32768 | 32767 |
| | | 0 | 65535 |
| MEDIUMINT | 3 | -8388608 | 8388607 |
| | | 0 | 16777215 |
| INT | 4 | -2147483648 | 2147483647 |
| | | 0 | 4294967295 |
| BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
| | | 0 | 18446744073709551615 |

2.1 tinyint类型

数值越界测试:

说明:

1.在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。

2.可以通过UNSIGNED来说明某个字段是无符号的。

3.无符号案例

4.其他类型自己推导

注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned 同样可能存放不下,与其如此,还不如设计时,将int 类型提升为bigint类型。

2.2 bit类型

基本语法:

bit【(M)】:位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1.

举例:

bit字段在显示时,是按照ASCII码对应的值显示。

如果我们有这样的值,只存放0或者1,这时可以定义bit(1)。这样可以节省空间。

2.3 小数类型

2.3.1 float

语法:

flaot[(m,d)] [unsigned] :M指定显示长度,d指定小数位数,占用空间4个字节。
注意:数过大或者小数点位数过多,会有精度丢失!

案例:

小数:float(4,2)表示的范围是-99.99~99.99 。MySQL在保存值时会进行四舍五入。

案例:如果定义的是float(4,2)unsigned 这时,因为把它指定为无符号的数,范围是0~99.99.

2.3.2 decimal

语法:

decimal(m,d)[unsigned] :定点数m指定长度,d表示小数点的位数。
1.decimal(5,2)表示的范围是:-999.99~999.99 。

2.decimal(5,2)unsigned 表示的范围是0~999.99 。

3.decimal和float很像,但是有区别:float和decimal表示的精度不一样。

说明:

1.float表示的精度大约是7位。

2.decima整数的最大位数m是65 。支持小数的最大位数d是30 。如果d被省略,默认为0,如果m被省略,默认是10 。

建议:如果希望小数的精度高,推荐使用decimal。

3.字符串类型

3.1 char

语法:

char(L):固定长度的字符串,L是可以存储的长度,单位为字符,最大长度值可以为255.

案例(char):

说明:

char(2)表示可以存放两个字符,可以是字母或汉字,但是不能超过2个,最多只能是255.

注:

gbk编码下,汉字占2个字节。

utf8编码下,汉字占3个字节。

3.2 varchar

语法:

varchar(L):可变长度字符串,L表示字符长度,最大长度是65535个字节。

案例:

说明:

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

1.varchar长度可以指定为0到65535之间的值,但是有1-3个字节用于记录数据大小,所以说有效字节数是65532 。

2.当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占3个字节),如果编码是gbk,varchar(n)的参数n最大值是65532/2=32766(因为gbk中,一个字符占用2个字节)。

3.3 char和varchar的比较

|-------|---------|------------|----------|-------------|
| 实际存储 | char(4) | varchar(4) | char占用字节 | varchar占用字节 |
| abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
| A | A | A | 4*3=12 | 1*3+1=4 |
| Abcde | × | × | 数据超过长度 | 数据超过长度 |

那么如何选择定长或者变长字符串呢?

1.如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5.

2.如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存进去。

3.定长的磁盘空间比较浪费,但是效率高。

4.变长的磁盘空间比较节省,但是效率低。

5.定长的意义是,直接开辟好对应的空间。

6.变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

4.日期和时间类型

4.1常用的日期有如下三个:

1.date:日期'yyyy-mm-dd',占用三字节。
2.datetime:时间日期格式'yyyy-mm-dd hh:ii:ss',表示范围从1000到9999,占用8字节。
3.timestamp:时间戳,从1970年开始的yyyy-mm-dd hh:ii:ss格式和datetime完全一致,占用四字节。

案例:

4.2 enum和set

语法:

1.enum:枚举,"单选"类型

enum('选项1','选项2','选项3',......)
该设定这是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值。而且处于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,3,......最多65535个,当我们添加枚举值时,也可以添加对应的数字编号。

2.set:集合,"多选"类型

set('选项值1','选项值2','选项值3',......);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储其中任意多个值。而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,......最多64个。

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

案例:有一个调查表votes,需要调查人的爱好,比如(登山,游泳,篮球,武术)中去选择【可以多选】。(男,女)【单选】

例如:

插入:insert into votes values('张三',1,1);//第一个1代表位图对应hobby的位图。第二个1是对应enum的下标位置。
插入数据:

有如下数据,想查找出所有喜欢登山的人:

使用如下查询语句:

但是不能查询出所有,爱好有登山的人。

集合查询使用find_in_set函数:

find_in_set(sub,str_list):如果sub在str_list中,则返回下标。如果不在,返回0 。str_list是内容之间用逗号分隔的字符串。

查询爱好包含登山的人:

注意:find_in_set()函数不能一次查询多个!

相关推荐
惜分飞2 小时前
rose双机引起文件系统损坏使得数据库异常故障处理---惜分飞
数据库·oracle
小小工匠2 小时前
大模型开发 - SpringAI之MySQL存储ChatMemory
mysql·spring ai
Mr YiRan2 小时前
C++浅拷贝与深拷贝的原理
c++
fchampion2 小时前
MYSQL分析案例
数据库·mysql
plus4s2 小时前
2月21日(91-93题)
c++·算法
宇擎智脑科技2 小时前
RAG系统数据库架构选型对比:SurrealDB单体方案 vs 多数据库组合方案深度分析
数据库·人工智能·数据库架构
饮长安千年月2 小时前
Linux下的敏感目录
linux·网络·数据库·web安全
闻缺陷则喜何志丹3 小时前
【数论 等差数列】P9183 [USACO23OPEN] FEB B|普及+
c++·数学·数论·等差数列
拳里剑气3 小时前
C++ 11
开发语言·c++·学习方法