目录:
一, MySQL下载安装与配置教
1.点击"MySQL下载地址"进入官网,按下面红框操作
2.往下拉找到"MySQL Community (GPL) Downloads »“点击
3.找到"MySQL Community Server"点击
4.选择自己电脑的系统,再往下选择第一个download免安装版本下载。
5.之后选择no thanks , just start my download.
5.下载压缩文件后加压到你选择的目录下(目录最好不要带中文)
6.初始化
首先建立个data文件夹和bin文件夹同目录
找到mysql解压目录\bin的绝对路径。
例如:我的"F:\s1\mysql-8.0.20-winx64\mysql-8.0.20-winx64\bin”
cmd+r打开命令提示符点击进入,输入mysql解压目录\bin的绝对路径+mysql --initialize-insecure
例如我的:”F:\s1\mysql-8.0.20-winx64\mysql-8.0.20-winx64\bin\mysql --initialize-insecure"(写的时候无引号)
7.之后打开环境变量的Path变量进行编辑,增加一个变量值,值为mysql解压目录\bin的绝对路径.
【右键计算机】–》【属性】–》【高级系统设置】–》【高级】–》【环境变量】–》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
8,建立MySQL服务
(1)、以管理员身份运行命令提示符
(2)、安装服务”F:\s1\mysql-8.0.20-winx64\mysql-8.0.20-winx64\bin\mysql.exe" --install 或mysqld --install
(3)、”F:\s1\mysql-8.0.20-winx64\mysql-8.0.20-winx64\bin\mysql.exe" --remove
安装成功后会在服务中找到MySQL服务
9.启动服务
1.直接点击MySQL服务中的启动
2.或在终端输入 net start MySQL
10.关闭服务
1.直接点击MySQL服务中的停止
2.或在终端输入 net stop MySQL
二, 数据库的链接和登陆
mysqld代表服务器端
mysql代表客户端
1.启动服务器端
1.F:\s1\mysql-8.0.20-winx64\mysql-8.0.20-winx64\bin\mysqld;
2.net start mysql
2.客户端链接
mysql -u root -p
Enter password:
三, 用户管理
1.创建用户
固定id登陆
create user '用户名'@'ip地址' identified by '密码';
任意id登陆
create user '用户名'@'%' identified by '密码';
2.删除用户
drop user '用户名'@'id地址';
3.修改用户
mysql -u root -p
Enter password:***
mysql> use mysql; --选择数据库--
Database changed
mysql> update user set user="新用户名" where user="root";
--将用户名为root的改为新用户名--
mysql> flush privileges; --刷新权限--
mysql> exit
4.修改密码
一下几种方法我在用的时候都会报错
使用win+R 输入CMD进入dos界面。进入你的mysql安装路径下面的bin文件家里面;
先使用:mysql -u root -p 输入密码进入mysql命令窗口mysql>:
ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘123456’;
方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password(‘123456’);
方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123
**方法3:用UPDATE直接编辑user表** 首先登录MySQL。 mysql> use mysql; mysql> update user set password=password('123') where user='root' and host='localhost'; mysql> flush privileges;
**方法4:在忘记root密码的时候,可以这样** 以windows为例: 1. 关闭正在运行的MySQL服务。 2. 打开DOS窗口,转到mysql\bin目录。 3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 5. 输入mysql回车,如果成功,将出现MySQL提示符 >。 6. 连接权限数据库: use mysql; 。 6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。 7. 刷新权限(必须步骤):flush privileges; 。 8. 退出 quit。 9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
注意:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
5.查看所有用户
select user,host from mysql.user;
1.user表结构
2. 解析
(root,%),表示可以远程登录,并且是除服务器外的其他任何终端
(root,localhost),表示可以本地登录,即可以在服务器上登陆
(root,127.0.0.1 ),表示可以本机登陆,即可以在服务器上登陆
(root,sv01),表示主机名为sv1可以登陆,sv01具体指的哪台机器,可以在cat /etc/hosts查看
(root,::1) ,表示本机可以登陆, 看密码都是相同嘛,具体::1代表意义,待查
Select_priv。确定用户是否可以通过SELECT命令选择数据。
Insert_priv。确定用户是否可以通过INSERT命令插入数据。
Update_priv。确定用户是否可以通过UPDATE命令修改现有数据。
Delete_priv。确定用户是否可以通过DELETE命令删除现有数据。
Create_priv。确定用户是否可以创建新的数据库和表。
Drop_priv。确定用户是否可以删除现有数据库和表。
Reload_priv。确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表。
Shutdown_priv。确定用户是否可以关闭MySQL服务器。在将此权限提供给root账户之外的任何用户时,都应当非常谨慎。
Process_priv。确定用户是否可以通过SHOW PROCESSLIST命令查看其他用户的进程。
File_priv。确定用户是否可以执行SELECT INTO OUTFILE和LOAD DATA INFILE命令。
Grant_priv。确定用户是否可以将已经授予给该用户自己的权限再授予其他用户。例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户。
References_priv。目前只是某些未来功能的占位符;现在没有作用。
Index_priv。确定用户是否可以创建和删除表索引。
Alter_priv。确定用户是否可以重命名和修改表结构。
Show_db_priv。确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库。可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因。
Super_priv。确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SET
GLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令。
Create_tmp_table_priv。确定用户是否可以创建临时表。
Lock_tables_priv。确定用户是否可以使用LOCK TABLES命令阻止对表的访问/修改。
Execute_priv。确定用户是否可以执行存储过程。此权限只在MySQL 5.0及更高版本中有意义。
Repl_slave_priv。确定用户是否可以读取用于维护复制数据库环境的二进制日志文件。此用户位于主系统中,有利于主机和客户机之间的通信。
Repl_client_priv。确定用户是否可以确定复制从服务器和主服务器的位置。
Create_view_priv。确定用户是否可以创建视图。此权限只在MySQL 5.0及更高版本中有意义。关于视图的更多信息,参见第34章。
Show_view_priv。确定用户是否可以查看视图或了解视图如何执行。此权限只在MySQL 5.0及更高版本中有意义。关于视图的更多信息,参见第34章。
Create_routine_priv。确定用户是否可以更改或放弃存储过程和函数。此权限是在MySQL 5.0中引入的。
Alter_routine_priv。确定用户是否可以修改或删除存储函数及函数。此权限是在MySQL 5.0中引入的。
Create_user_priv。确定用户是否可以执行CREATE USER命令,这个命令用于创建新的MySQL账户。
Event_priv。确定用户能否创建、修改和删除事件。这个权限是MySQL 5.1.6新增的。
Trigger_priv。确定用户能否创建和删除触发器,这个权限是MySQL 5.1.6新增的。
四,授权管理
show grants for '用户'@'IP地址' -- 查看权限
grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权
revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限
权限:
增 insert 改update
删 delete 查select
对于目标数据库以及内部其他:
数据库名.* 数据库中的所有表
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库,所有表
1.忘记密码
mysql密码是动态md5加密,是不可逆向查询的,所以你查看不了密码只能修改
# 启动免授权服务端
mysqld --skip-grant-tables
# 客户端
mysql -u root -p
# 修改用户名密码
update mysql.user set authentication_string=password('666') where user='root';
flush privileges;
flush privileges,将数据读取到内存中,从而立即生效。
五,数据类型
MySQL的数据类型大致分为:数值、时间和字符串
1.数值
bit[(M)]
二进制位(101001),m表示二进制位的长度(1-64),默认m=1
tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-128 ~ 127.
无符号:
0 ~ 255
特别的: MySQL中无布尔值,使用tinyint(1)构造。
int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-2147483648 ~ 2147483647
无符号:
0 ~ 4294967295
特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:
-9223372036854775808 ~ 9223372036854775807
无符号:
0 ~ 18446744073709551615
decimal[(m[,d])] [unsigned] [zerofill]
准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
特别的:对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-3.402823466E+38 to -1.175494351E-38,
0
1.175494351E-38 to 3.402823466E+38
有符号:
0
1.175494351E-38 to 3.402823466E+38
**** 数值越大,越不准确 ****
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
无符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
0
2.2250738585072014E-308 to 1.7976931348623157E+308
有符号:
0
2.2250738585072014E-308 to 1.7976931348623157E+308
**** 数值越大,越不准确 ****
2.字符串
char (m)
char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
PS: 即使数据小于m长度,也会占用m长度
varchar(m)
varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
text
text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
3.时间
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
YEAR
YYYY(1901/2155)
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
4.枚举
enum
枚举类型,
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO sh
注意:枚举适用于值不经常改动,且有限;
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
在添加size值的时候只能选择上面其中一个
5.集合
set
集合类型
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
注意:与枚举不同的是集合再添加元素的时候可以是多个
六,数据库的相关操作
1、显示数据库
SHOW DATABASES;或show databases;
默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据
2、创建数据库
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8;
例如:
CREATE DATABASE db1 DEFAULT CHARSET utf8;
#创建了db1数据库
3、使用数据库
use 数据库名
例如:
use db1
4.显示当前使用的数据库中所有表:
SHOW TABLES;
七,表的基本操作
1.查看数据表
select * from t1;
注意:你需要先进入该表的数据库; ----》use 数据库名;
2.创建表单
create table 表名(
列名 类型 是否可以为空,
列名 类型 是否可以为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
#ENGINE=InnoDB#引擎,回滚
#DEFAULT CHARSET=utf8#默认字符编码
#unsigneded #无符号整型
#not null#不为空
#auto_increment#自动填充
#primary key#主键,加约束,确定该数据的唯一性一般用于id
**完整的建表:**
create table class(
cid int signed not null auto_increment primary key,
caption varchar(32)
)engine=innodb default charset=utf8
**不完整的建表**
例如:
不能填充中文
create table t1(id int signed not null auto_increment primary key,name char(10));
注意:1、对于自增列,必须是索引(含主键)。
2、对于自增可以设置步长和起始值
会话级别
show session variables like 'auto_inc%';
set session auto_increment_increment=2;
set session auto_increment_offset=10;
全局级别
shwo global variables like 'auto_inc%';
set global auto_increment_increment=2;
set global auto_increment_offset=10;
3.增加表内容
#增加一行的值
insert into 表 (列名,列名...) values (值,值,值...);
#增加两行的值
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...);
#将另一个表的值复制过来
insert into 表 (列名,列名...) select (列名,列名...) from 表;
易错点:
记住 values (值,值,值...)中的值如果是字符集要带双引号;
而数字就不需要
4.清空表
#删除表整个的内容如果在增加内容后id接着删除之前最后一个id增加
delete from 表;
#按条件删除表的内容
delete from 表 where id=1 and name='alex';
#删除表整个的内容如果在增加内容后id重新加载从1开始
truncate table 表名;
5.删除表
drop table 表名;
6.其他
a、条件
select * from 表 where id > 1 and name != 'alex' and num = 12;
select * from 表 where id between 5 and 16;
select * from 表 where id in (11,22,33)
select * from 表 where id not in (11,22,33)
如果id=nid则显示
select * from 表 where id in (select nid from 表)
b、通配符
select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)
select * from 表 where name like 'ale_' - ale开头的所有(一个字符)
c、限制
select * from 表 limit 5; - 前5行
select * from 表 limit 4,5; - 从第4行开始的5行
select * from 表 limit 5 offset 4 - 从第4行开始的5行
d、排序
select * from 表 order by 列 asc - 根据 “列” 从小到大排列
select * from 表 order by 列 desc - 根据 “列” 从大到小排列
select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
e、分组
为什么要分组?
因为:在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
select num from 表 group by num
select num,nid from 表 group by num,nid
8.0之前版本分组之后才可以进行排序
select num,nid from 表 where nid > 10 group by num,nid order nid desc
8.0之后
select max(tid),tname,count(tname) from st1 group by tname order by max(tid) desc;
select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid
函数条件的使用
select num from 表 group by num having max(id) > 10
特别的:group by 必须在where之后,order by之前
在分组之后使用过上面的函数
where,order by 的条件和列不能是唯一标识,例如id
f、连表
无对应关系则不显示
select A.num, A.name, B.name
from A,B
Where A.nid = B.nid
无对应关系则不显示
select A.num, A.name, B.name
from A inner join B
on A.nid = B.nid
A表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A left join B
on A.nid = B.nid
B表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A right join B
on A.nid = B.nid
g、组合
组合,自动处理重合
select nickname
from A
union
select name
from B
组合,不处理重合
select nickname
from A
union all
select name
from B
八,主键,外键,唯一索引
1.主键
主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
create table tb1(
nid int not null auto_increment primary key,
num int null
);
或
create table tb1(
nid int not null,
num int not null,
primary key(nid,num)
);
复制代码
2.外键
外键,一个特殊的索引,只能是指定内容
creat table color(
nid int not null primary key,
name char(16) not null
);
creat table teacher(
tid int not null primary key,
tname char(16) not null
);
create table fruit(
nid int not null primary key,
smt char(32) null ,
color_id int not null,
teacher_id int not null,
constraint fk_cc foreign key (color_id) references color(nid),
constraint fk_cc foreign key (teacher_id) references teacher(tid)
);
注意:在操作需要先建立两张表,再插入内容
3.索引
唯一索引:约束不能为空,加速查找(可以为空)
主键:约束不能为空,加速查找(不可以为空)
(1).唯一索引
create table t1(id int signed not null auto_increment primary,
name_id int,
unique uql(name_id));
unique uql(name_id));保证了name_id不能重复
(2).联合索引
create table t1(id int signed not null auto_increment primary,
name_id int,
xx int,
unique uql(name_id,xx));
name_id和xx联合索引
name_id,xx出现过一次不能出现第二次
例如:name_id=1,xx=1
则不能在同时让name_id,xx=1
但是可以name_id=1,xx=3