一、MySQL概述
1、数据库定义
数据库是一个存储数据的仓库2、数据库应用领域
金融机构、游戏网站、购物网站、论坛网站 ...3、提供数据库服务的软件
a、软件分类
MySQL、Mariadb、SQL_Server、Oracle、DB2、MongoDB ...b、生产环境中,如何选择使用哪个数据库
1)是否开源开源软件:MySQL、Mariadb、MongoDB
商业软件:Oracle、DB2、SQL_Server
2)是否跨平台
跨平台:MySQL、Oracle、Mariadb、DB2、MingoDB
不跨平台:SQL_Server(Windows)
3)公司的类型
商业软件:政府部门、金融机构
开源软件:游戏网站、购物网站、论坛网站 ...
4、MySQL特点
a、关系型数据库
1)关系型数据库的特点数据是以行和列的形式去存储的
这一系列的行和列称为表
表中每一行叫一条记录
表中的每一列叫一个字段
表和表之间的逻辑关联叫关系
2)示例
I、关系型数据库存储
姓名 | 年龄 | 班级 |
---|---|---|
小白 | 10 | 六二班 |
小明 | 11 | 六一班 |
班级 | 班主任 |
---|---|
六二班 | 孔子 |
六一班 | 老子 |
II、非关系型数据库存储
以键值对形式存储
{"姓名":"小白","年龄":10,"班级":"六二班","班主任":"孔子"}
{"姓名":"小明","年龄":11,"班级":"六一班","班主任":"老子"}
b、跨平台
可以在Unix、Linux、Windows上运行数据库服务c、支持多种编程语言
Python、Java、php ...5、数据库软件、数据库、数据仓库
a、数据库软件
是一种软件,可以看得见,可操作,来实现数据库逻辑功能b、数据库
是一种逻辑概念,用来存放数据的仓库,通过数据库软件来实现,侧重存储c、数据仓库
数据仓库主要用于数据挖掘和数据分析 eg:网购
数据库: user --> 用户名和密码
数据仓库:哪个时间段用户登录量最多,哪个用户一年购物最多...
二、MySQL安装
1、Ubuntu安装MySQL服务
a、安装服务端
sudo apt-get install mysql-serverb、安装客户端
sudo apt-get install mysql-client依赖关系:
sudo apt-get update
sudo apt-get -f install # 修复依赖关系
sudo apt-get install 软件包
2、Windows安装MySQL服务
a、下载MySQL安装包(windows)
mysql-installer***5.7.***.msib、双击、按照教程安装
3、启动和连接MySQL服务
a、服务端启动
sudo /etc/init.d/mysql start # 启动sudo /etc/init.d/mysql stop # 停止
sudo /etc/init.d/mysql restart # 重启
sudo /etc/init.d/mysql status #查看当前状态
sudo /etc/init.d/mysql reload #重新加载配置文件
b、客户端连接
1)、命令格式mysql -h主机地址 -u用户名 -p密码
mysql -hlocalhost -uroot -p123456
2)、本地连接可省略 -h 选项
mysql -uroot -p123456
三、配置:更改库、表的默认字符集
1、方法
通过更改MySQL服务的配置文件来实现
2、步骤
a、获取root权限
sudo -i
b、切换到配置文件所在路径
cd /etc/mysql/mysql.conf.d
c、备份
cp mysqld.cnf mysqld.cnf.bak
d、用vi打开mysqld.cnf,在[musqld]下修改如下,并保存退出
[musqld]
character_set_server = utf8
e、重启mysql服务
/etc/init.d/mysql restart
f、退出超级用户
exit
g、登录到mysql验证
mysql -uroot -p123456create datavase 库名;
show create database 库名;
四、术语
1、DB(database)
DB就是数据库,存储数据的仓库2、DBMS(database management system)
数据库管理系统管理数据库的软件:MySQL、Oracle、MongoDB ... ...
3、DBS(database system)
数据库系统DBS = DB(存储) + DBMS(数据库软件) + 数据库应用(财务管理系统、认识管理系统) + 用户
五、数据类型
1、数值类型
a、整型(有符号signed 和 无符号unsigned)
1)int 大整型(4个字节)
字段名 int
字段名 int unsigned
取值范围:0~2**32 -1(42亿多)
2)tinyint 微小整型(1个字节)
I、有符号(signed默认):-128 ~ 127
II、无符号(unsigned) : 0~255
3)bigint 极大整型(8个字节)
取值范围:0 ~ 2**64 - 1
4)smallint 小整型(2个字节)
取值范围(0 ~ 65535)
b、浮点型
1)float(4个字节,最多显示7个有效位)
I、用法
字段名 float(m,n) m:总位数 n:小数位位数
float(5,2) 取值范围 -999.99 ~ 999.99
II、注意
浮点型插入整数时会自动补全小数位位数
小数位如果多余指定的位数,会对指定位的下一位进行四舍五入
2)double(8个字节,最多显示15个有效位)
字段名 double(m,n) m:表示总位数 n:小说位位数
3)decimal(最多显示28个有效位)
I、用法
字段名 decimal(m,n)
II、存储空间(整数部分和小数部分分开存储)
规则:将9的倍数包装成4个字节
余数 字节
1-2 1
3-4 2
5-6 3
7-8 4
decimal(19,9)
整数部分:10/9=商1余1 4字节+1字节=5字节
小数部分:9/9=商1余0 4字节+0字节=4字节
decimal(43,11)
整数部分:32/9=商3余5 4字节+3字节=7字节
小数部分:11/9=商1余3 4字节+2字节=6字节
2、字符类型
a、char(定长)
1)取值范围:1 ~ 255
2)不给定宽度,默认为1
b、varchar(变长)
1)取值范围:1 ~ 65535
2)注意:varchar没有默认宽度,必须给定一个宽度值
c、char和varchar的特点
1)char : 浪费存储空间,性能高
2)varchar :节省存储空间,性能低
d、text / longtext(4G)(存储大文本)
3、数值类型的宽度和字符类型的宽度区别
a、数值类型宽度为显示宽度,只用于select查询显示,和占用存储空间大小无关,用 zerofill 来显示效果
id int(3) zerofill
b、字符类型的宽度超过则无法存储
4、枚举类型
a、定义
字段值只能在列举的范围内选择
b、enum(... ) 单选(最多有65535个不同的值)
字段名 enum(值1,值2,... ,值N)
create table info(sex enum("man","woman","secret"));
insert into info values("man");
select * from info;
c、set(... )多选(最多有64个不同的值)
字段名 set(值1,值2,... ,值N)
插入记录时:“Python,boy,Mysql”
create table hobby(sex set("play","eat","python"));
insert into hobby values("play,python");
select * from hobby;
5、日期时间类型
a、year:年 YYYYb、date:日期 YYYY-MM-DD
c、time:时间 HH:MM:SS
d、datetime: 日期时间 YYYY-MM-DD HH:MM:SS
e、timestamp:日期时间 YYYY-MM-DD HH:MM:SS
f、注意:
插入记录时datetime字段不给值,默认返回NULL
插入记录时timestamp字段不给值,默认返回系统当前时间
g、示例
create table infos(
id int, name varchar(15) ,
age tinyint unsigned,
birth_year year,
birthday date,
class time,
meetting datetime
);
insert into infos values (1,"大宝",40,1979,19790520,090000,20180609120933);
insert into infos values (2,"小爱",23,"1979","1979-05-20","09:00:00","2018-06-09 12:09:33");
select * from infos;
六、日期时间函数
NOW() 返回服务器当前时间CURDATE() 返回当前日期
CURTIME() 返回当前时间
insert into infos values(2,"小宝",25,"2001",CURDATE(),CURTIME(),NOW());
select * from infos;
1、日期时间运算
a、语法格式select ... from 表名
where 字段名 运算符 (时间 - interval 时间间隔单位);
时间间隔单位:
1 day | 2 hour | 1 minute | 1 year | 3 month
where meeting > (now() - interval 1 day);
现在时间 - 1天的时间 = 1天前的时间点
b、示例
1、查询1天以内的记录
select * from infos where meeting>(now()-interval 1 day);
2、查询1年以前的记录
select * from infos
where meeting<(now()-interval 1 year);
3、查询1天以前,3天以内的记录
select * from infos where
meeting<(now()-interval 1 day) and
meeting>(now()-interval 3 day);
七、运算符操作(查询、修改、删除)
1、数值比较&字符比较&逻辑比较
数值:= 、!= 、> 、>= 、< 、<=字符:= 、!=
逻辑:and 、or
2、范围内比较
between 值1 and 值2in(值1,值2,...)
not in(值1,值2,...)
3、匹配空、非空
a、空 :is nullb、非空 :is not null
注意:
1)NULL :空值,必须用 is 或者 is not 去匹配
2)"" :空字符串,只能用 = 或者 != 去匹配
4、模糊比较
a、where 字段名 like 表达式
b、表达式
1)_ :匹配单个字符2)% :匹配0到多个字符
c、示例
1、名字中至少有2个字符的记录
select * from sanguo where name like "_%_";
2、匹配名字为非空NULL的记录
select * from sanguo where name like "%";
3、匹配名字中只有三个字符的记录
select * from sanguo where name like "___";
4、匹配姓赵的记录
select * from sanguo where name like "赵%";
5、正则匹配查询regexp
where 字段名 regexp “正则表达式”;a、正则表达式符号
^ :以 ... 开头$ :以 ... 结尾
. :匹配任意一个字符
[] :包含 ... 内容
[0-9]:匹配带数字的
[a-z]:匹配带小写字母的
[A-Z]:匹配带大写字母的
* :星号前面的字符出现0个或多次
.: :任意一个字符出现0次或多次
“^赵.*”:赵姓
b、示例
1)select name from sanguo where name regexp "[0-9]";
# 匹配名字中带数字的的记录
2)select name from sanguo where name regexp "^[0-9]";
# 匹配名字中以数字开头的记录
3)select name from sanguo where name regexp "[0-9]$";
# 匹配名字中以数字结尾的记录
4)select name from sanguo where name regexp "^司.*懿$";
# 匹配名字中以司开头,以懿结尾的记录
5)select name from sanguo where name regexp " ...";
c、说明
mysql 5.7.21版本中,正则表达式中 . 匹配的是字节mysql 8.0... 版本中,正则表达式中 . 匹配的是字符
5.7 版本: ^...$ "aaa" "貂" "666" #一个汉字 3个字节
8.0 版本: ^...$ "司马懿" "aaa"
八、附录1:数据库数据创建
为了方便,建立直接复制、黏贴一下代码,快速创建数据库和表。
create database MOSHOU;
use MOSHOU;
create table hero(
id int,
name char(15),
sex enum("男","女"),
country char(10)
)default charset=utf8;
insert into hero values
(1,"曹操","男","魏国"),
(2,"小乔","女","吴国"),
(3,"诸葛亮","男","蜀国"),
(4,"貂蝉","女","东汉"),
(5,"赵子龙","男","蜀国"),
(6,"魏延","男","蜀国");
use MOSHOU;
create table sanguo(
id int,
name char(20),
gongji int,
fangyu tinyint unsigned,
sex enum("男","女"),
country varchar(20)
)default charset=utf8;
insert into sanguo values
(1,'诸葛亮',120,20,'男','蜀国'),
(2,'司马懿',119,25,'男','魏国'),
(3,'关6羽',188,60,'男','蜀国'),
(4,'赵云666',200,66,'男','魏国'),
(5,'8孙权',110,20,'男','吴国'),
(6,'貂蝉',666,10,'女','魏国'),
(7,null,1000,99,'男','蜀国'),
(8,'',1005,88,'女','蜀国');