数据库管理软件分类
- 关系型:如sqllite,db2,oracle,access,sql server,mysql,注意:sql语句通用
- 非关系型:mongodb,redis,memcache
- 可以简单的理解为:关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构
mysql软件安装
一、Window版本
1.安装步骤
- 步骤1:下载:MySQL Community Server 5.7.16 下载
- 步骤2:解压:如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\\mysql-5.7.16-winx64
- 步骤3:添加环境变量:【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
- 步骤4:初始化:mysqld --initialize-insecure
- 步骤5:启动MySQL服务:mysqld # 启动MySQL服务
- 步骤6:启动MySQL客户端并连接MySQL服务:mysql -u root -p # 连接MySQL服务器
2.制作MySQL的Windows服务
- 制作MySQL的Windows服务,在终端执行此命令:"c:\\mysql-5.7.16-winx64\\bin\\mysqld" --install 注意:--install前,必须用绝对路径
- 移除MySQL的Windows服务,在终端执行此命令:"c:\\mysql-5.7.16-winx64\\bin\\mysqld" --remove
- 注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
- 启动MySQL服务:net start mysql 关闭MySQL服务:net stop mysql
mysql软件基本管理
一、windows平台下
1.忘记密码
- 关闭mysql服务
- 在cmd中执行:mysqld --skip-grant-tables
- 在cmd中执行:mysql
- 执行如下sql:
- update mysql.user set authentication_string=password(\'\') where user = \'root\';
- flush privileges;
- 杀死mysqld: tskill mysqld
- 重启mysql服务
2.配置文件my.ini
- 强调:配置文件中的注释可以有中文,但是配置项中不能出现中文
3.统一字符编码
[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:\\mysql-5.7.18-winx64 # 设置mysql数据库的数据的存放目录 datadir=D:\\mysql-5.7.18-winx64\\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
#1. 修改配置文件 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] user="root" password=123456 default-character-set=utf8 #2. 重启服务 #3. 查看修改结果: #show variables like \'%char%\'
4.小知识点补充
""" 1 如何查看当前具体进程 tasklist tasklist |findstr mysqld 2 如何杀死具体进程(只有在管理员cmd窗口下才能成功) taskkill /F /PID PID号 3 查看当前计算机的运行进程数 services.msc 4 将mysql制作成系统服务 mysqld --install 5 移除mysql系统服务 mysqld --remove
## 当你输入的命令不对 又不想让服务端执行并返回报错信息 可以用\\c取消
mysql> \\s 查看当前用户信息
6 设置密码 mysqladmin -uroot -p原密码 password 新密码 改命令直接在终端输入即可 无序进入客户端 mysqladmin -uroot -p123 password 123456 7.破解密码 # 1 先关闭当前mysql服务端 命令行的方式启动(让mysql跳过用户名密码验证功能) mysqld --skip-grant-tables # 2 直接以无密码的方式连接 mysql -uroot -p 直接回车 # 3 修改当前用户的密码 update mysql.user set password=password(123456) where user=\'root\' and host=\'localhost\'; # 4 立刻将修改数据刷到硬盘 flush privileges; # 5 关闭当前服务端 然后以正常校验授权表的形式启动 """
存储引擎
- 存储引擎就是表的类型
- 查看MySQL支持的存储引擎show engines;
- 指定表类型/存储引擎:
- create table t1(id int)engine=innodb; #一般用这个
- create table t2(id int)engine=memory;
- create table t3(id int)engine=blackhole;
- create table t4(id int)engine=myisam;
操作库
一、基础操作
1、增
- create database db1 charset utf8;
2、删
- drop database db1;
3、改
- alter database db1 charset utf8;
4、查
- show databases;
- show create database db1;
- select database(); 查看当前操作的是哪个数据库
5、其他操作
- use db1 #选择数据库
二、导入导出
1、导出数据库数据: #语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql #示例: #单库备份
mysqldump -uroot -p123 -B db1 > db1.sql
加-B 会多下面两行
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;
在以后恢复时,不需要手动进行建库和use库了
mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多库备份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
mysqldump -uroot -p123 --B db1 db2 mysql db3 > db1_db2_mysql_db3.sql
#备份所有库 mysqldump -uroot -p123 --all-databases > all.sql mysqldump -uroot -p123 -A > all.sql
生产环境下,也要加的额外参数 -R, --routines 备份存储过程和函数数据 --triggers 备份触发器数据
mysqldump -uroot -p123 -A -R --triggers > all.sql
2、导入数据库数据: mysqldump -u root -p密码 数据库名称 < 文件路径
#方法一: [root@bubu backup]# mysql -uroot -p123 < /backup/all.sql
#方法二(推荐): mysql> use db1; mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql
#注:如果备份/恢复单个库时,可以修改sql文件 DROP database if exists school; create database school; use school;
3、执行导入文件: create database db5 mysqldump -u root -p -d db5 < db1.sql
操作表
一、基础操作
1、增
1
2
3
4
5
6
|
create table 表名( 字段名 1 类型[(宽度) 约束条件], 字段名 2 类型[(宽度) 约束条件], 字段名 3 类型[(宽度) 约束条件] )engine = innodb default charset = utf8; #注意:表中的最后一个字段不要加逗号 |
2、删
- drop table t1; #删表
- delete from t1;#清空表 #对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
- truncate t1 #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
3、改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
语法: 1. 修改表名 alter table 表名 rename 新表名; 2. 增加字段 alter table 表名 add 字段名 数据类型 [完整性约束条件…], add 字段名 数据类型 [完整性约束条件…]; alter table 表名 add 字段名 数据类型 [完整性约束条件…] FIRST; alter table 表名 add 字段名 数据类型 [完整性约束条件…] AFTER 字段名; 3. 删除字段 alter table 表名 drop 字段名; 4. 修改字段 alter table 表名 modify 字段名 数据类型 [完整性约束条件…]; alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件…]; 示例: 1. 修改存储引擎 mysql> alter table t1 - > engine = innodb; 2. 添加字段 mysql> alter table t1 - > add name varchar( 20 ) not null, - > add age int ( 3 ) not null default 22 ; mysql> alter table t1 - > add stu_num varchar( 10 ) not null after name; / / 添加name字段之后 mysql> alter table t1 - > add sex enum( \'male\' , \'female\' ) default \'male\' first; / / 添加到最前面 3. 删除字段 mysql> alter table t1 - > drop sex; mysql> alter table t1 - > drop mac; 4. 修改字段类型modify mysql> alter table t1 - > modify age int ( 3 ); mysql> alter table t1 - > modify id int ( 11 ) not null primary key auto_increment; / / 修改为主键 5. 增加约束(针对已有的主键增加auto_increment) mysql> alter table t1 modify id int ( 11 ) not null primary key auto_increment; ERROR 1068 ( 42000 ): Multiple primary key defined mysql> alter table t1 modify id int ( 11 ) not null auto_increment; Query OK, 0 rows affected ( 0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 6. 对已经存在的表增加复合主键 mysql> alter table t1 - > add primary key(host_ip,port); 7. 增加主键 mysql> alter table t1 - > modify name varchar( 10 ) not null primary key; 8. 增加主键和自动增长 mysql> alter table t1 - > modify id int not null primary key auto_increment; 9. 删除主键 a. 删除自增约束 mysql> alter table t1 modify id int ( 11 ) not null; b. 删除主键 mysql> alter table t1 - > drop primary key; |
4、查
- desc t1; #查看表结构
- show create table t1\\G; #查看表详细结构,可加\\G
- show tables;
二、其他操作
1.复制表
- 复制表结构+记录 (key不会复制: 主键、外键和索引): create table new_service select * from service;
- 只复制表结构: create table new1_service select * from service where 1=2;
- create table t4 like t1;
三、数据类型
1、整数类型
- 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
- 作用:存储年龄,等级,id,各种号码等
- 注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关。其实没有必要指定显示宽度,使用默认的就ok
2、浮点型
- 定点数类型 DEC等同于DECIMAL
- 浮点类型:FLOAT DOUBLE
- 作用:存储薪资、身高、体重、体质参数等
3、日期类型
- DATE TIME DATETIME TIMESTAMP YEAR
- DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
- 作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
- create table t1(x datetime not null default now()); # 需要指定传入空值时默认取当前时间
- create table t2(x timestamp); # 无需任何设置,在传空值的情况下自动传入当前时间
4、字符串类型
- 官网:查看
- 注意:char和varchar括号内的参数指的都是字符的长度
- char类型:定长,简单粗暴,浪费空间,存取速度快
- varchar类型:变长,精准,节省空间,存取速度慢
- text类型:用于保存变长的大字符串
- length:查看字节数,char_length:查看字符数
5、枚举类型与集合类型
- 字段的值只能在给定范围中选择,如单选框,多选框
- enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female sex enum(\'male\',\'female\',\'保密\'), #在指定范围内,多选一
- set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...) hobby set(\'play\',\'music\',\'read\',\'study\') #在指定范围内,多选多
四、表完整性约束
约束条件与数据类型的宽度一样,都是可选参数,作用:用于保证数据的完整性和一致性
- 是否是key: 主键: primary key 外键: foreign key 索引:(index,) 唯一:unique key (uk)
- 是否允许为空,默认null,可设置not null,字段不允许为空,必须赋值,或者也可以自动添加默认值 not null defalut 2
- 无符号unsigned
- 使用0填充 zerofill
1、unsigned
- age int unsigned NOT NULL default 20,
2、not null与default
- age int not null defalut 18,
- age int not null,
3、unique
- #方法1:在某一个字段后用unique: name varchar(20) unique,
- #方法2:在所有字段后单独定义unique: constraint uk_name unique(name) #创建唯一并为其命名uk_name
- #联合唯一:在所有字段后单独定义unique: unique(host,port)
4、primary key
- #方法1:not null+unique: id int not null unique, #主键
- #方法2:在某一个字段后用primary key : id int primary key, #主键
- #方法3:在所有字段后单独定义primary key: constraint pk_name primary key(id); #创建主键并为其命名pk_name
- #多列做主键:在所有字段后单独定义primary key: primary key(ip,port)
5、auto_increment
- 约束字段为自动增长,被约束的字段必须同时被key约束
- id int primary key auto_increment,#primary key auto_increment一般一起使用
6、foreign key
- 多对一:关联方式:foreign key
- 多对多:关联方式:foreign key + 一张新的表
- 一对一:关联方式:foreign key+unique
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
""" 多对一:关联方式:foreign key 多对多:关联方式:foreign key + 一张新的表 一对一:关联方式:foreign key+unique =====================多对一===================== 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 #一个出版社可以出版多本书 ); =====================多对多===================== create table author( id int primary key auto_increment, name varchar(20) ); create table book( 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) ); =====================一对一===================== create table customer( id int primary key auto_increment, name varchar(20) not null, qq varchar(10) not null, phone char(16) not null ); create table student( id int primary key auto_increment, class_name varchar(20) not null, customer_id int unique, #该字段一定要是唯一的 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique on delete cascade on update cascade ); """ |
操作记录
一、基础操作
1、增
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段 1 ,字段 2 ,字段 3 …字段n) VALUES(值 1 ,值 2 ,值 3 …值n); 语法二: INSERT INTO 表名 VALUES (值 1 ,值 2 ,值 3 …值n); 2. 指定字段插入数据 语法: INSERT INTO 表名(字段 1 ,字段 2 ,字段 3 …) VALUES (值 1 ,值 2 ,值 3 …); 3. 插入多条记录 语法: INSERT INTO 表名 VALUES (值 1 ,值 2 ,值 3 …值n), (值 1 ,值 2 ,值 3 …值n), (值 1 ,值 2 ,值 3 …值n); 4. 插入查询结果 语法: INSERT INTO 表名(字段 1 ,字段 2 ,字段 3 …字段n) SELECT (字段 1 ,字段 2 ,字段 3 …字段n) FROM 表 2 WHERE …; |
2、删
1
2
3
4
5
6
7
|
语法: DELETE FROM 表名 WHERE CONITION; 示例: DELETE FROM mysql.user WHERE password = ’’; |
3、改
1
2
3
4
5
6
7
8
9
|
语法: UPDATE 表名 SET 字段 1 = 值 1 , 字段 2 = 值 2 , WHERE CONDITION; 示例: UPDATE mysql.user SET password = password(‘ 123 ’) where user = ’root’ and host = ’localhost’; |
4、查
①单表
1):单表查询的语法
1
2
3
4
5
6
|
SELECT DISTINCT 字段 1 ,字段 2. .. FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 |
2):关键字的执行优先级
- -> from -> where -> group by-> having-> select-> distinct-> order by-> limit
- 1.找到表:from
- 连表的情况
- 1.1 on 执行on过滤
- 1.2 join 添加外部行
- 2.拿着where指定的约束条件,去文件/表中取出一条条记录
- 3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
- 4.将分组的结果进行having过滤
- 5.执行select
- 6.去重distinct
- 7.将结果按条件排序:order by
- 8.限制结果的显示条数