MySQL基本配置及问题
一、MySQL配置
1.下载解压
2.将mysql目录下bin设置到Path
3.在mysql目录下新建文本文档,改名为my.ini
,按照下面内容配置my.ini
其中:
以下内容改为自己的mysql放置目录。basedir="D:\mysql-5.7.16-winx64"datadir="D:\mysql-5.7.16-winx64\data"Server=D:\mysql-5.7.16-winx64\bin\mysqld.exe注:使用其他编辑器编写该文件时使用UTF-8无BOM格式编码。不然后面命令会报错Found option without preceding group in config file。
4.安装MySQL服务:打开cmd命令提示符, 执行命令:mysqld --install
安装服务,提示”Service successfully installed.”表示成功;
5.执行mysqld.exe --initialize
命令,创建data
6.启动:net start MySQL
7.卸载方法:
(1). sc delete MySQL
卸载服务
(2). 清除path下的文件路径
(3). 清除注册表文件。
二、登陆MySQL
|
三、解决MySQL 5.7密码忘记
- 在任务管理器中结束mysqld.exe进程,确保mysql服务器端已结束运行。
- 打开cmd命令提示符,进入mysql.exe所在的文件夹(例如:D:\mysql-5.7.16-winx64\bin)
- 输入命令
mysqld --skip-grant-tables
回车,此时就跳过了mysql的用户验证。 - 此时该窗口命令行无法操作,打开一个新的命令行,直接输入mysql,不需要带任何登录参数直接回车登陆上数据库。
- 输入
show databases;
可以看到所有数据库说明成功登陆. - 输入
use mysql;
选择mysql数据库。 - 输入
update MySQL.user set authentication_string=password('root') where user='root' ;
修改密码。 - 重新打开dos再次登陆后若提示ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
输入命令,重新设置密码即可解决。SET PASSWORD = PASSWORD('123456');
常用命令
一、对数据库的操作
1.增删查改数据库
|
2.备份与恢复数据库
注:
备份操作需要在dos命令行下执行。
恢复操作需要在mysql控制台操作。
mysql显示中文乱码问题:
show variables like 'char%';
查看字符编码集。- 若都为utf8,查看当前控制台字符集格式(win下dos一般为GBK)。
- 设置返回字符集格式为utf8
set character_set_results=gbk;
。
二、对表的操作
1.创建表
|
2.修改表结构
|
desc表时key栏的解释
使用MySQL数据库desc 表名时,我们看到Key那一栏,可能会有4种值,即 ‘ ‘,’PRI’,’UNI’,’MUL’。
- 如果Key是空的,那么该列值的可以重复,表示该列没有索引,或者是一个非唯一的复合索引的非前导列;
- 如果Key是PRI,那么该列是主键的组成部分;
- 如果Key是UNI,那么该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL);
- 如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。
- 如果对于一个列的定义,同时满足上述4种情况的多种,比如一个列既是PRI,又是UNI,那么”desc 表名”的时候,显示的Key值按照优先级来显示 PRI->UNI->MUL。那么此时,显示PRI。
- 一个唯一性索引列可以显示为PRI,并且该列不能含有空值,同时该表没有主键。
- 一个唯一性索引列可以显示为MUL,如果多列构成了一个唯一性复合索引,因为虽然索引的多列组合是唯一的,比如ID+NAME是唯一的,但是没一个单独的列依然可以有重复的值,只要ID+NAME是唯一的即可。
三、CRUD语句
1.Insert
insert into 表名 (列名.....) values (值....);
- 插入的数据应与字段的数据类型相同。
- 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
- 字符和日期型数据应包含在单引号中。
- 插入空值,不指定或insert into table value(null)
在values中列出的数据位置必须与被加入的列的排列位置相对应。
eg:create table test (id int ,name varchar(64));insert into test (id,name) values(3,’aaa’);insert into test (name,id) values(’aaa’,3);若values全部对应写出,则可省略列名。
2.Update
update 表名 set 列名=表达式 ... where 条件
- UPDATE语法可以用新值更新原有表行中的各列。
- SET子句指示要修改哪些列和要给予哪些值。
- WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
3.Delete
delele from 表名 where 条件;
- 若不使用where子句,将删除表中所有数据。
所有要小心使用. - Delete语句不能删除某一列的值(可使用update)
- 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
- 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
- 删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,truncate table 表名,可以删除表的记录,速度快,但不能回滚。
mysql中事务的特殊说明:
(1). mysql 控制台是默认自动提交事务(dml)
(2). 要在控制台使用事务应:set autocommit=false;
savepoint 保存点
//操作…rollback to 保存点
4.Select
select [distinct] 列名....(可运算) from 表名 where 条件;
- Select 指定查询哪些列的数据。
- column指定列名。
- 号代表查询所有列。
`select from 表名;` - From指定查询哪张表。
- DISTINCT可选,指显示结果时,是否剔除重复数据
select distinct 列名 from 表名
- 列可参与运算
select 列名1+列名2+... from 表名 whrer 条件
- 列名可用as显示别名
select 列名 as '别名' from 表名 where 条件
(1).where子句中常用的运算符
(2).order by 子句
select 列名1+列名2+... as '别名' from 表名 where 条件 order by '别名' desc;
对查询结果排序
最后加:
asc升序(默认)
desc降序
分页查找:
select * from 表名 where 条件 limit 起始行 输出行数
- 起始行从0开始计算。
- 输出行数表示从起始行开始输出多少行的数据。
5.其他函数
(1).count
select count(*)|count(列名) from 表名 where 条件;
返回满足条件的某一列(行)的总数
(2).sum
select sum(列名){,sum列名} from 表名 where 条件;
对满足条件列的数值求和,返回该列中各行的数值的总和
- sum仅对数值列有效
- 对多列求和不能缺少“,”,eg:
select sum(列名),sum(列名),sum(列名) from 表名;
- 对多个列求总和,eg:
select sum(列名1+列名2+...) from 表名;
(3).avg
select avg(列名){,avg列名} from 表名 where 条件;
返回满足where条件的一列的平均值
- 条件、用法同sum。
- 若某一行数值为“null”,则该行不参与平均;若为“0”则参与平均
(4).max/min
select max(列名) from 表名 where 条件;
返回满足where条件的一列的最大值
(5).group by
select 列名 from 表名 group by 待分组列名
对group by子句中的列进行分组
(6).having
select 列名 from 表名 group by 待分组列名 having 条件
- having和where均可实现过滤,但having和以使用合计函数,通常跟在group by后,作用于组。
- 顺序:group by ……having……order by……
(7).日期和时间函数
select current_date() from dual;
//得到当前日期select date(now()) from dual
//得到当前日select * from 表名 where date_add(日期数据的列名, interval 2 hour) >= now()
//得到日期数据的列名下,距今两个小时内的数据
- where date_add(日期/date/datetime/timestamp, interval 数字 type)
type类型可以是:microsecond;second;minute;hour;day;week;month;quarter;year
(8).字符串函数
select charset(列名) from 表名
//查看某列所用的字符集格式
四、定义表的约束
1、主键约束
primary key:
- 主键:用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能为null,不允许为空,不允*许重复。
- 用法:创建表时写在要设为主键的列的定义后,不需要分隔符。
- 删除主键:
alter table tablename drop primary key;
2、主键自动增长
auto_increment
- 用法:同上。
3、唯一约束
unique
- 表的某列的值不能重复,可以为null(null可重复),表中可以有多个unique。
4、非空约束
not null
- MySQL中列的值默认可以为空,若不允许其为空则需not null说明
5、外键约束
foreign key
- 先建主表,在建从表
- 用法:
- 在创建从表时,定义:
constraint 外键名称 foreign key(从表的外键列名) references 主表名(从表要指向的列)
- 从表只能指向主表的主键列或者unique。
- 外键列的数据类型和主表列的数据类型要一样。
- 外键的值要么为null;要么需要在主表列中存在。
- 外键可以指向本表的主键/unique列。
- 外键名前缀:fk,主键名前缀:pk
- 在创建从表时,定义:
MySQL的数据类型
一、数值型
1.bit(m)
m默认为 1 最大 64
2.tinyint [unsigned]
如果是有符号则表示 -128 到 127 ,如果是无符号 0-255
eg:
create table test3(num tinyint) – -128 到 127
create table test4(num tinyint unsigned) 0 — 255
3.smallint
samllint 是两个字节表示的.
带符号是 负的2的15次方 到 2的15次方-1 ,无符号 2的16方 -1
4.其它的数值类型
5.float
FLOAT[(M,D)] [UNSIGNED] 是定长
m:表示有效位。d:表示小数点有几位。
eg:
create table test5( num float);
create table test6(num float(5,1));
6.double
其用法和float 类似,只是表示的范围更大,也是定长
7.numeric(m,d)
用于表示小数,或者整数
eg:
create table test7 (num numeric); //这样其实就是可以存放整数.
create table test8 (num numeric(5,2));//这样就可以表示 有效为5,小数点有两位的数
二、字符串型
一览图:
常用的有
1.char(m)
m 范围是 0-255, 定长.
char(10) 若存放 ‘abc’ 字串,实际在表示 ‘abc ’;
eg:
create table test11 (name char(20));
2.varchar(m)
m 表示大小 ,范围 0-65535, 变长
varchar(20) 若存放 ‘abc’ 字串,实际在表示 ‘abc’;
建议:
若表的某列长度固定,比如 产品编号..学号. .. 而且在 255内,应当使用char
若长度不能取得,或者长度 大于255 小于 65535 则使用varchar
3.text
该类型可以表示更大的字串.
三、日期类型
1.date
日期 (年-月-日)
create table test12(birthday date);
对于date 只保存 年-月-日
2.datetime
日期时间类型
create table test13(hiredate datetime);
3.timestamp
邮戳: 该类型可以保存 年-月-日 : 时:分:秒
和datetime 最大的区别:当 update 某条记录的时候,该列值自动更新
create table test14 (name varchar(64) , sal float, hiredate1 timestamp, hiredate2 datetime);
参考文章:
Mysql命令desc:获取数据表结构
21分钟 MySQL 入门教程
韩顺平MySQL视频讲解