1、MySQL概述
-
什么是数据库
数据库是存储数据的仓库 -
哪些公司在用数据库
金融机构、游戏网站、购物网站、论坛网站 … … -
提供数据库服务的软件
1、软件分类
MySQL、SQL_Server、Oracle、DB2、MongoDB、Mariadb … …
2、在生产环境中,如何选择使用哪个数据库软件
1、是否开源
开源软件:MySQL、MongoDB、Mariadb
商业软件:Oracle、DB2、SQL_Server
2、是否跨平台
不跨平台:SQL_Server
跨平台:MySQL、MongoDB、Oracle、DB2、Mariadb
3、公司的类型
商业软件:政府部门、金融机构
开源软件:游戏网站、购物网站、论坛网站 …
4、MySQL特点
1、关系型数据库
1、关系型数据库特点
1、数据是以行和列的形式去存储的
这一系列的行和列成为表
2、表中的每一行叫一条记录
3、表中的每一列叫一个字段
4、表和表之间的逻辑关联叫关系
5、关系型数据库的核心内容是 关系 即 二维表
2、示例
1、关系型数据库存储
表1、学生信息表
姓名 年龄 班级
张三丰 25 AID1712
周芷若 26 AID1711
表2、班级信息表
班级 班主任
AID1712 侯大大
AID1711 孙大大
2、非关系型数据库存储
{“姓名”:“张三丰”,“年龄”:25,“班级”:“AID1712”}
{“姓名”:“周芷若”,“年龄”:26,“班级”:“AID1711”,“班主任”:“孙大大”}
2、跨平台
可以在Unix、Linux、Windows上运行数据库服务
3、支持多种编程语言
python、java、php …
5、数据库软件、数据库、数据仓库
1、数据库软件
是一种软件,可以看得见,可操作,用来实现数据库逻辑功能
2、数据库
是一种逻辑概念,用来存储数据的仓库,侧重存储
3、数据仓库
从数据量来说,数据仓库要比数据库庞大的多,主要用于数据挖掘和数据分析数据库:user表 验证 数据仓库:哪个时间段用户登录量最多,哪个用户一年购物最多,......
2、MySQL安装
1、Ubuntu安装MySQL
1、安装服务端
sudo apt-get install mysql-server
2、安装客户端
sudo apt-get install mysql-client
3、Ubuntu安装软件
1、sudo apt-get update
2、sudo apt-get -f install
修复依赖关系
2、Windows安装MySQL服务
1、下载MySQL安装包
mysql-installer***5.7.***.msi
2、双击、按照教程安装即可
3、启动和连接
1、服务端启动
1、查看Mysql服务的状态
sudo /etc/init.d/mysql start
2、启动Mysql服务
sudo /etc/init.d/mysql status
3、停止Mysql服务
sudo /etc/init.d/mysql stop
4、重启Mysql服务
sudo /etc/init.d/mysql restart
2、客户端连接
1、命令格式
mysql -h主机地址 -u用户名 -p密码
mysql -hlocalhost -uroot -p123456
2、本地登录可省略-h选项
mysql -uroot -p123456
3、断开与服务器的连接
exit quit \q
4、基本SQL命令
1、SQL命令的使用规则
1、每条命令必须以 ; 结尾执行命令
2、SQL命令不区分字母大小写
3、使用 \c 终止当前命令的执行
mysql> show databases\c
mysql> show databases;\c 错误,分号已经执行了
2、库的管理
1、库的基本操作
1、查看已有的库
show databases;
2、创建库(指定字符集)
create database 库名 [character set utf8];
或者[default charset=utf8];
3、查看创建库的语句
show create database 库名;
4、查看当前所在库
select database();
5、切换库
use 库名;
6、查看库中已有表
show tables;
7、删除库
drop database 库名;
2、练习
1、创建库testdb,指定字符集为utf8
create database testdb character set utf8;
2、进入到库testdb
use testdb;
3、查看当前所在库
select database();
4、创建库testdb2,指定字符集为latin1
create database testdb2 character set latin1;
5、进入到库testdb2
use testdb2;
6、查看testdb2的默认字符集
show create database testdb2;
7、删除库testdb
drop database testdb;
8、删除库testdb2
drop database testdb2;
3、库名的命名规则
1、可以使用数字、字母、_,但是不能为纯数字
create database 123; 错误
2、库名区分字母大小写
create database Db1;与create database db1;不是一个库
3、库名具有唯一性
4、不能使用特殊字符和mysql关键字
create database db*8; 错误
create database create; 错误
3、表的管理
1、表的基本操作
1、创建表
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
...
)[character set utf8]; 或者[default charset=utf8];
e.g. mysql> create table stuinfo(
-> id int,
-> name char(20),
-> age int
-> )character set utf8;
2、查看创建表的语句(字符集、存储引擎)
show create table 表名;
ENGINE=InnoDB DEFAULT CHARSET=latin1 |
储存引擎 字符集
3、查看表结构
desc 表名;
4、删除表
drop table 表名;
2、练习
1、创建库python1
create database python1;
2、在 python1 库中创建表 pymysql并指定字符集为utf8,
字段有三个:id name age 数据类型自己定义
create table pymysql(
id int,
name char(20),
age int
)character set utf8;
3、查看表pymysql的默认字符集和存储引擎
show create table pymysql;
4、查看表 pymysql 的表结构
desc pymysql;
5、删除表 pymysql
6、删除库 python1
7、创建库 python2
8、在库python2中创建表 t1 指定字符集utf8,
字段有 id name score三个,数据类型自己定义
9、查看t1的表结构
3、注意
1、所有的数据都是以文件的形式存放在数据库目录下
2、数据库目录:/var/lib/mysql
4、表记录的管理
1、在表中插入记录
1、insert into 表名 values(值1),(值2),...;
2、insert into 表名(字段名1,字段名2,...) values(值1),(值2),...;
e.g. mysql> insert into t3 values
-> (1,"MR"),(2,"JS"),(3,"Lucy");
2、查询表记录
1、select * from 表名 [where 条件];
2、select 字段名1,字段名2,... from 表名 [where 条件];
mysql> select * from t3;
mysql> select id,name from t3;
字段名较少时,输入字段名,较多用*
3、练习
1、查看所有库
2、创建一个新库 studb
3、在 studb 中创建一张表 tab1,指定字符集utf8,
表中字段有 id name age score 四个
create table tab1(
id int,
name char(15),
age int,
score int
)character set utf8;
4、查看tab1的表结构
desc tab1;
5、在 tab1 中随意插入2条记录
insert into tab1 values
(1,"Tom",22,100),(2,"Lucy",23,80);
6、在 tab1 的name,age两个字段插入2条记录
insert into tab1(name,age) values
("Bob",30),("Green",33);
7、查看 tab1 中的所有记录
select * from tab1;
8、查看 tab1 中所有人的名字和成绩
select name,score from tab1;
5、如何更改库的默认字符集
1、方法
通过更改MySQL的配置文件实现
2、步骤
1、获取root权限
sudo -i
2、备份mysql的配置文件
vi /etc/mysql/mysql.conf.d/mysqld.conf
注意:vi用法:
e.g. vi hello.txt ---》回车进入
a 表插入新内容
Esc 退出
Shift + :表转到命令行模式
:wq 表保存并推出
3、修改配置文件
在[mysqld]下面添加:
character_set_server = utf8
4、重启MySQL服务/重新加载配置文件(reload)
sudo /etc/init.d/mysql restart | reload
5、创建库验证默认字符集是否为utf8
6、客户端把数据存储到数据库服务器上的过程
1、连接到数据库服务器 mysql -h ... -u ... -p ...
2、选择库 use 库名
3、创建表/修改表
4、断开与数据库服务器的连接 exit | quit | \q
7、数据类型
1、数值类型()
1、整型
1、int 大整型(4个字节)
取值范围:0 ~ 2**32 -1(42亿多)
2、tinyint 微小整型(1个字节)
1、有符号(signed默认) :-128 ~ 127
2、无符号(unsigned) : 0 ~ 255
mysql> create table t4(
-> id int,
-> name char(20),
-> age tinyint unsigned
-> );
mysql> insert into t4 values(1,"Green",-3); 错误 0~255
3、smallint 小整型(2个字节)
取值范围:0 ~ 65535
4、bigint 极大整型(8个字节)
取值范围:0 ~ 2**64 -1
2、浮点型
1、float(4个字节,最多显示7个有效位)
1、用法
字段名 float(m,n) m:总位数 n:小数位位数
float(5,2) 取值范围? -999.99 ~ 999.99
mysql> create table t5(
-> id int,
-> name char(20),
-> salary float(10,2)
-> );
2、注意
1、浮点型插入整数时会自动补全小数位
mysql> insert into t5 values(1,"Bob",5000);
表中5000.00
2、小数位如果多于指定的位数,会对下一位四舍五入
mysql> insert into t5 values(2,"Tom",8888.8888);
表中8888.89
3、最多显示7个有效位
mysql> insert into t5 values(3,"Lucy",123456789.00);
表中1234567?.??
2、double(8个字节,最多显示15个有效位)
3、decimal(m+2个字节,最多显示28个有效位)
1、字段名 decimal(m,n)
mysql> create table t7(
-> id int,
-> name char(20),
-> age tinyint unsigned,
-> salary decimal(18,2)
-> )default charset=utf8;
mysql> insert into t7 values(1,"武松",30,123456789.123456);
表中123456789.12
2、存储空间(整数部分和小数部分分开存储)
规则:将9位数字的倍数包装成4个字节
即:对于每个部分,需要4个字节来存储9位数的每个倍数,
剩余数字所需的存储空间如下表:
剩余数字 字节
0 0
1-2 1
3-4 2
5-6 3
7-9 4
示例:decimal(19,9) --->9字节
整数部分:10/9=商1余1 4字节+1字节=5字节
小数部分:9/9=商1余0 4字节+0字节=4字节
2、字符类型
1、char(定长)
1、宽度取值范围:0 ~ 255
mysql> create table t8(
-> id int,
-> name char(2),
-> age tinyint unsigned
-> )default charset=utf8;
mysql> insert into t8 values(1,"上官雨",38); 错误
mysql> insert into t8 values(1,"关羽",38); 正确
2、不给定宽度默认为1
2、varchar(变长)
1、取值范围:1~65535
mysql> create table t9(
-> id int,
-> name varchar(15),
-> age tinyint unsigned
-> )default charset=utf8;
mysql> insert into t9 values(1,"令狐冲","AID1111"30);
2、注意:
1、varchar没有默认宽度,必须给定一个宽带
2、char和varchar使用时都给定宽度,但不能超过各自的范围
3、char 和 varchar 的特点
1、char:浪费存储空间,但是性能高
2、varchar:节省存储空间,但是性能低
4、text / longtext(4G) / blob / longblob(4G)
5、字符类型的宽度和数值类型的宽度的区别
1、数值类型的宽度为显示宽度,仅仅用于select查询时显示,
和占用的存储空间大小无关,可用zerofill查看效果
2、字符类型的宽度超过则无法存储
mysql> create table t10(
-> id int(3) zerofill,
-> name char(15),
-> )default charset=utf8;
mysql> insert into t10 values(1,"赵云");
表中id为 001
mysql> create table t11(
-> id int(100) zerofill,
-> name varchar(15),
-> )default charset=utf8;
mysql> insert into t11 values(1,"赵云");
表中id为 000......0001(1前99个0)
6、ctrl+s 表示屏蔽输入内容,ctrl+q表示显示屏蔽的内容
7、练习
1、创建一个库studb2,utf8在studb2库中创建表tab,字段如下:
学号:id 要求显示宽度为3,位数不够用0填充
姓名:name 变长,宽度20
班级:class 定长,宽度为7
年龄:age 微小整型,不能输入负数
身高:height 浮点型,小数位为2位
工资:salary 浮点型,最大为 9999999.99
create table tab(
-> id int(2) zerofill,
-> name varchar(20),
-> class char(7),
-> age tinyint unsigned,
-> height float(5,2),
-> salary decimal(10,2)
-> );
2、查看 tab 的表结构
3、在表中插入 2 条记录
4、查询表中记录,只显示姓名,年龄和工资
select name,age,salary from tab;
5、查询所有学生的 id 、name 、height 和 salary
3、枚举类型(字段值只能在列举的范围内选择)
1、enum 单选(最多65535个不同值)
字段名 enum(值1,值2,...,值N)
mysql> create table t12(
-> id int(3) zerofill,
-> name varchar(15),
-> class char(7),
-> sex enum("男","女","保密"),
-> likes set("女","男","学习","人工智能")
-> )default charset=utf8;
mysql> insert into t12 values
-> (1,"赵云","AID1712","男","女,学习,人工智能");
表中id为 000......0001(1前99个0)
mysql> select * from t12\G; ---》表竖着显示
2、set 多选(最多64个不同值)
字段名 set(值1,值2,...,值N)
like set("Study","Girl","Python","MySQL")
"Study,Girl"
4、日期时间类型
1、year : 年 YYYY
2、date : 日期 YYYYMMDD
3、time : 时间 HHMMSS
4、datetime
5、timestamp : 日期时间 YYYYMMDDHHMMSS
6、注意:
插入记录时datetime不给值默认返回NULL,
而timestamp字段默认返回系统当前时间
示例
mysql> create table t13(
-> id int(3) zerofill,
-> name varchar(15),
-> age tinyint unsigned,
-> birth_year year,
-> birthday date,
-> class time,
-> meeting datetime
-> )character set utf8;
mysql> insert into t13 values
-> (1,"鹰王",88,1928,19280520,090000,20180131000000);
mysql> create table t14(
-> id int(3) zerofill,
-> name varchar(15),
-> meeting datetime,
-> class timestamp
-> )character set utf8;
mysql> insert into t14(id,name) values(1,"赵敏");
mysql> select * from t14;
8、表字段的操作
语法:alter table 表名 执行动作;
1、添加字段(add)
1、添加到末尾
alter table 表名 add 字段名 数据类型;
2、添加到开始
alter table 表名 add 字段名 数据类型 first;
3、添加到指定位置
alter table 表名 add 字段名 数据类型 after 字段名;
mysql> create table t15(
-> name varchar(15),
-> )default charset=utf8;
mysql> alter table t15 add age tinyint unsigned;
mysql> alter table t15 add id int first;
mysql> alter table t15 add sex enum("M","F") after name;
2、删除字段(drop)
alter table 表名 drop 字段名;
mysql> alter table t15 drop sex;
3、修改字段数据类型(modify)
alter table 表名 modify 字段名 新数据类型;
# 修改数据类型会受到表中原有数据的限制
mysql> alter table t15 modify name char(15);
4、修改字段名(change)
alter table 表名 change 旧名 新名 数据类型;
mysql> alter table t15 change name new_name char(15);
5、修改表名(rename)
alter table 表名 rename 新表名;
mysql> alter table t15 rename new_t15;
6、练习
1、创建库 studb2
2、在库中创建表 stuinfo,字段如下:
姓名、年龄、手机号 char(11)
3、查看表结构
4、在表中第一列添加一个字段:学号
alter table stuinfo add id int first;
5、把手机号的数据类型改为 bigint 8个字节
alter table stuinfo modify phnumber bigint;
6、在表中最后一列添加一个字段:注册时间 register,数据类型为:timestamp
alter table stuinfo add register timestamp;
7、在表中 学号、姓名、年龄、手机号 四个字段插入2条记录
insert into stuinfo(id,name,age,phnumber) values
(1,"Tom",20,13838384386),(2,"Jim",25,13999999999);
8、查询5分钟内的记录明细
select * from stuinfo where
register > (now() - interval 5 minute);
作业:
1、填空题
1、MySQL中的数据类型有:数值类型 字符类型 枚举类型 日期时间类型
2、关系型数据库的核心内容是 关系 即 二维表
2、简答题
1、简述客户端把数据存储到数据库服务器上的过程
2、char和varchar的区别,各自的特点
2、操作题
1、创建一个学校的库 school
2、在库中创建一个表 students 存储学生信息,字段如下
学号id(显示宽度为3,不够用0填充)、
姓名name、年龄age(不能为负数)、
手机号、成绩score(浮点型)、
性别sex(单选)、爱好likes(多选)、入学时间(年月日)
3、查看students的表结构
4、在students表中增加一个字段id,加在第一列
5、在表中的 姓名、手机号、成绩 三个字段插入3条记录
6、查看所有学生的姓名、手机号和成绩