mysql数据库初识基本用法数据引擎(一)
一、MySQL的相关概念介绍
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。
MySQL规范
- 在数据库系统中 , SQL语句不区分大小写 (建议用大写) , 但字符串常量区分大小写 ; 建议命令大写 , 表名库名小写
- SQL语句可单行或多行书写 , 以" ; "结尾 , 关键字不能跨多行或简写
- 用空格和缩进来提高语句的可读性 , 子句通常位于独立行 , 便于编辑 , 提高可读性
- 单行注释 : -- 多行注释 : / *... */
- SQL语句可拆行操作
二、MySQL中的数据类型
MySQL有三大类数据类型, 分别为数字、日期\时间、字符串, 这三大类中又更细致的划分了许多子类型:
-
数字类型
-
- 整数: tinyint、smallint、mediumint、int、bigint
- 浮点数: float、double、real、decimal
-
日期和时间: date、time、datetime、timestamp、year
-
字符串类型
-
- 字符串: char、varchar
- 文本: tinytext、text、mediumtext、longtext
- 二进制(可用来存储图片、音乐等): tinyblob、blob、mediumblob、longblob
这里不能详细对这些类型进行介绍了, 篇幅可能会很长, 详细介绍参见: 《MySQL数据类型》 :http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html
mysql安装
# 路径
# 1.路径不能有中文
# 2.路径中不能有特殊字符
# 修改配置文件
# 1.编码utf-8
# 2.所有的配置项后面不要有特殊的符号
# 3.修改两个路径basedir datadir
# 检测文件的扩展名设置
# 工具-->文件夹选项-->查看-->扩展名 不要隐藏
# 配置环境变量
# 在path中添加
# C:\mysql\mysql-5.6.45-winx64\bin
# 以管理员的身份重新打开一个cmd
# mysqld install 安装成功
# 启动mysql
# net start mysql 启动mysql server
# 在cmd启动mysql 客户端
# mysql
# 客户端和本地的mysql server相连
配置文件
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql\mysql-5.6.44-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\mysql-5.6.44-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
扩展名.ini
卸载
# 卸载
# net stop mysql 停止mysql服务
# mysqld remove 删除服务
# 把安装软件也删掉
# 删除环境变量
# 清除注册表/重启计算机
三、使用MySQL数据库
当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:
mysql -h 主机名 -u 用户名 -p 密码;
- -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;
- -u : 所要登录的用户名;
- -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
输入 exit 或 quit 退出登录。
登录,设置密码
初始状态下,管理员root,密码为空,默认只允许从本机登录localhost
设置密码
[root@egon ~]# mysqladmin -uroot password "123" 设置初始密码 由于原密码为空,因此-p可以不用
[root@egon ~]# mysqladmin -uroot -p"123" password "456" 修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码
命令格式:
[root@egon ~]# mysql -h172.31.0.2 -uroot -p456
[root@egon ~]# mysql -uroot -p
[root@egon ~]# mysql 以root用户登录本机,密码为空
忘记密码
*linux平台下,破解密码的两种方式*
[root@egon ~]# rm -rf /var/lib/mysql/mysql #所有授权信息全部丢失!!!
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
[root@egon ~]# vim /etc/my.cnf #mysql主配置文件
[mysqld]
skip-grant-table
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q
[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123 #以新密码登录
windows平台下,5.7版本mysql,破解密码的两种方式:
#1 关闭mysql
#2 在cmd中执行:mysqld --skip-grant-tables
#3 在cmd中执行:mysql
#4 执行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;
#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新启动mysql
方式一
#1. 关闭mysql,可以用tskill mysqld将其杀死
#2. 在解压目录下,新建mysql配置文件my.ini
#3. my.ini内容,指定
[mysqld]
skip-grant-tables
#4.启动mysqld
#5.在cmd里直接输入mysql登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';
flush privileges;
#6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了
方式二
在windows下,为mysql服务指定配置文件
*强调:配置文件中的注释可以有中文,但是配置项中不能出现中文*
#在mysql的解压目录下,新建my.ini,然后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1
#解压的目录
basedir=E:\mysql-5.7.19-winx64
#data目录
datadir=E:\my_data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据
#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123
#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573
#!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准
my.ini
统一字符编码
#1. 修改配置文件
[mysqld]
default-character-set=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
#mysql5.5以上:修改方式有所改动
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
#2. 重启服务
#3. 查看修改结果:
\s
show variables like '%char%'
显示当前时间
select now();
显示数据库版本
select version();
创建一个数据库
create database 数据库名 [其他选项];
例如我们需要创建一个名为python01 的数据库, 在命令行下执行以下命令:
create database python01 charset=utf8; # charset=utf8 是指定数据库支持的编码类型,默认是拉丁文,注意不是utf-8
注意: MySQL语句以分号(;)作为语句的结束
查看数据库
show databases; # 注意加s
查看数据库的创建语句
show create database python01;
修改数据库的字符类型
alter database python01 charset=utf8;
删除数据库
drop databse python01;
使用数据库
use python01;
查看当前使用的数据库
select database();
三、数据表的操作
创建数据表
create table 数据表名字 (字段 类型 约束, ....)
eg:
create table xxxx (id int, name varchar(30));
查看数据表
show tables;
查看数据表详细信息
desc xxxx;
加约束
create table xxx (id int primary Key not null auto_increment, name varchar(30));
为了方便写的时候观看,可以拆成多行
create table xxx (
id int primary Key not null auto_increment,
name varchar(30));
注意注意注意:表中的最后一个字段不要加逗号
小练习题
create table student(
id int unsigned not null primary Key auto_increment,
name varchar(20),
age tinyint unsigned default 0,
hight decimal(5, 2), # 有5个数字,其中两个是小数
gender enum("男", "女", "中性", "保密") default "保密", # 枚举 enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female;set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
cls_id int unsigned
);
往表中插入数据
insert into student value(0, "老王", 18, 180.88, "男", 1);
查看表中所有列
select * from student;
建立表之间的关系
#一对多或称为多对一
三张表:出版社,作者信息,书
一对多(或多对一):一个出版社可以出版多本书
关联方式:foreign key
=====================多对一=====================
create table press(
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
insert into press(name) values
('北京工业地雷出版社'),
('人民音乐不好听出版社'),
('知识产权没有用出版社')
;
insert into book(name,press_id) values
('九阳神功',1),
('九阴真经',2),
('九阴白骨爪',2),
('独孤九剑',3),
('降龙十巴掌',2),
('葵花宝典',3)
;
#多对多
三张表:出版社,作者信息,书
多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
关联方式:foreign key+一张新的表
=====================多对多=====================
create table author(
id int primary key auto_increment,
name varchar(20)
);
#这张表就存放作者表与书表的关系,即查询二者的关系查这表就可以了
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);
#插入四个作者,id依次排开
insert into author(name) values('egon'),('alex'),('yuanhao'),('wpq');
#每个作者与自己的代表作如下
egon:
九阳神功
九阴真经
九阴白骨爪
独孤九剑
降龙十巴掌
葵花宝典
alex:
九阳神功
葵花宝典
yuanhao:
独孤九剑
降龙十巴掌
葵花宝典
wpq:
九阳神功
insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1)
;
四、数据表的增删改查
增加字段
alter table student add birthday datetime;
修改字段,不重命名版
alter table student modify birthday date; # birthday字段不变,改变类型
修改字段,重命名版
alter table student change birthday birth date default "1990-01-01";
删除字段
alter table student drop hight;
相应的值也会被删除
删除数据表
drop table xxx;
最常用的部分,数据的增删改查
向表中插入数据
insert into classes value(0, "菜鸟班"); # classes的id被设定为自动增加,所以插入数据时id部分随便我们怎么写都行,都会自动改变按应该的顺序增加
eg:
insert into classes value(null, "菜鸟班");
insert into classes value(default, "菜鸟班");
# 枚举中的下标从1开始 1----------》 “男”
insert into student values(default, "小李飞刀“, 20, 1, 1, "1990-02-01");
部分插入
insert student(name, gender) values("小乔", 2);
多行插入
insert into student(name, gender) values("大乔", 2),("貂蝉", 2);
更新数据
update student set gender=2 where id=1; # 不指定id将全部修改
定条件查询
select * from student where name="小乔";
select * from student where id > 3;
select name, gender from student where id=2;
select name as 姓名, gender as 性别 from student where id=2;
删除数据
delect from student where xxx;
逻辑删除,用一个字段表示这条信息不在使用
给student添加is_delete字段,bit类型
alter table student add is_delete bit default 0;
复制表
复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
只复制表结构
mysql> select * from service where 1=2; //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create table t4 like employees;
总结
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
#1. 操作文件夹
增:create database db1 charset utf8;
查:show databases;
改:alter database db1 charset latin1;
删除: drop database db1;
#2. 操作文件
先切换到文件夹下:use db1
增:create table t1(id int,name char);
查:show tables
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删:drop table t1;
#3. 操作文件中的内容/记录
增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
查:select * from t1;
改:update t1 set name='sb' where id=2;
删:delete from t1 where id=1;
清空表:
delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
auto_increment 表示:自增
primary key 表示:约束(不能重复且不能为空);加速查找
五、存储引擎
什么是数据库引擎
mysql中建立的库===>文件夹
库中建立的表===>文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎
创建新表时如果不指定存储引擎 , 那么系统就会使用默认存储引擎 , MySQL 5.5 之前的默认存储引擎是MyISAM
, 5.5 之后改为了InnoDB
查看当前数据库支持的存储引擎类型;
SHOW ENGINES;
查看正在使用的存储引擎
show variables like 'storage_engine%'; #查看正在使用的存储引擎
1.MyISAM 和 InnoDB的适用场景
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
2.MyISAM 和 InnoDB的区别
1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持
2)myisam表不支持外键
3)在执行数据库写入的操作(insert,update,delete)的时候,myisam表会锁表,而innodb表会锁行
4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快
#InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其
特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
#MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
#NDB 存储引擎
年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
#Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
#NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
#BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅 力所在。
1.存储引擎
数据的不同存储方式就是存储引擎
show engines;查看存储引擎
innodb 两个文件
5.6及以上默认的存储引擎
transaction 事务 保证数据安全 数据的完整性,在一段操作的前后加标志,读取到结束标志之前只进行内存级别的操作,不会直接修改硬盘数据。
row-level looking 行级锁 锁住一行数据,不让其他人修改
table-level looking 表级锁 同理
foreign keys 外键约束
树tree 加速查询 (树形结构(数据+树)+ 表结构)
myisam 三个文件
mysql5.5以下 默认的存储方式
table-level locking 表级锁
树tree - 加速查询 (树形结构 + 数据 + 表结构)
memory 1个文件
断电消失
基于hash
查看表结构
show create table staff;
指定存储引擎存储
create table 表名(字段 类型,····) engine=myisam;
2.数据类型
数值
整数
tinyint int
create table int_t (
ti tinyint, # ****
i int, # ***** 无约束-128 127
tiun tinyint unsigned,
iun int unsigned #数值类的约束条件,无符号,0-255
);
浮点数
create table fd_t(
f float, # 精度问题 小数点后5位 # *****
d double, # 精度更高但也不准确
f2 float(5,2),# 在精确位四舍五入
d2 double(5,2)# 在精确位四舍五入
)
create table dec_t(
dec1 decimal, 精度更高
dec2 decimal(30,20)
)
时间
内置函数 now()
datetime 打卡时间/日志/论坛博客类的评论\文章/*****
(插入时间两种方式
20190101121212
‘2019-12-12 12:12:12’
)
date 员工生日/入职日期/离职日期/开班时间 *****
time 上课时间/下课时间/规定上班时间 竞赛数据
year
timestamp 由于表示范围的问题,导致用的少了
create table time_t2(
dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, # 表示的范围更大,还能拥有timestamp的特点
d date,
t time,
y year,
ts timestamp # 不能为空,默认值是当前时间,在修改的时候同时更新时间
)
字符串
字符串
char 0-255 定长存储 存储速度更快 占用更多的空间 *****
char(12)
alex --> 'alex ' --> 12的长度
varchar 0-65535 变长存储 存储速度慢 占用的空间小 ****
varchar(12)
'alex' --> 'alex4' --> 5的长度
手机号码/身份证号码 : char
用户名/密码 : 有一定范围弹性 char
评论 : varchar
时间和空间
时间换空间
空间换时间
create table ch_t(
c char,
c2 char(5),
vc2 varchar(5)
)
enum和set
enum和set
单选题,只能从有限的条件中选择
create table enum_t(
id int,
name char(12),
gender enum('男','女','不详')
)
gender性别(男 女 不详)
多选题,从有限的条件中选
create table set_t(
id int,
name char(12),
hobby set('抽烟','喝酒','烫头','搓脚')
)
不选不会报错,数据会显示空格
3.约束
not null 非空
unique 唯一
primary key 主键
unsigned 无符号:数值专用
default 默认添加字段
****一张表一个主键,主键就是非空加唯一,如果没设置主键,就是第一个非空加唯一的
字段默认设置为主键。
primary key =====not null unique
4.严格模式
1.开启与关闭Strict Mode方法
找到MySQL安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可
例如这就表示开启了严格模式:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
2.Strict Mode功能说明
不支持对not null字段插入null值
不支持对自增长字段插入”值
不支持text字段有默认值