mysql基础

Posted _枝桠。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql基础相关的知识,希望对你有一定的参考价值。

数据库管理软件分类

  • 关系型:如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
my.ini
#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.限制结果的显示条数

3):简单查询