环境准备
OS: Windows 10
MySQL: MySQL Community Server 5.7.19, 64-bit, ZIP Archive
安装配置
- 配置默认文件(可选)。解决乱码等问题。在MySQL安装根目录新建my.ini替换掉my-default.ini。
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql-5.7.19-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-5.7.19-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
替换'D:\mysql-5.7.19-winx64'内容,不能手动建立data文件夹。
- 安装服务。以管理员身份运行cmd.exe(C:\Windows\System32\cmd.exe),进入
cd %MYSQL_HOME%\bin
,执行命令mysqld install
,屏幕显示Service successfully installed。删除服务:mysqld remove
。 - 初始化。开启服务时报'mysql服务无法启动 服务没有报告任何错误',说明还没有初始化。在bin目录下执行
mysqld --initialize-insecure
(不设置root密码,建议使用)。第一次执行这个命令等待的时间会稍微长了一些,并且控制台没有任何返回结果。mysql根目录下会多出一个里面有内容的data文件夹。 - 启动。
net start mysql
。关闭服务使用net stop mysql
- 登录。
mysql -u root -p
。默认是没有密码的,直接回车进入。如果出现'ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)',原因是新版的mysql为了安全性,默认是有密码的。密码文件直接写在 log-error 日志文件中,放在 root/.mysql_secret 文件里。登录时需要用随机密码登录。 - 设置密码。登录后执行
SET PASSWORD = PASSWORD('new password');
,重置密码成功。也可以在未登录状态下执行mysqladmin -u root -p password 'new password'
。 - 设置环境变量(可选)。如果不想每次执行命令都切换到'%MYSQL_HOME%\bin'目录,把bin目录加入到path env下。
基本使用
对数据库进行增删改查结束后,执行exit
退出数据库,直接关闭cmd窗口是没有退出的,要输入exit才会退出。同样的,mysql service还是在运行中,如果你确认今天不使用mysql了,执行net stop mysql
停止服务,不然一直等到关机后才会关闭服务。
'[]'表示可选,'<>'表示参数。
连接Mysql
mysql [-h<主机地址>] -u<用户名> -p[<用户密码>]。
修改密码
mysqladmin -u<用户名> [-p<旧密码>] password <新密码>。例如,给root新增密码mysqladmin -u root -password ab12
,修改密码mysqladmin -u root -p ab12 password cd34
。
PS: 和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符。命令大小写都可以。
增加新用户
GRANT 权限 ON 数据库.* TO 用户名@登录主机 IDENTIFIED BY '密码';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON test_db.* TO gdd@localhost IDENTIFIED BY 'gdddb';
显示数据库
show databases;(注意:最后有个s)
为了避免显示乱码,修改数据库默认编码(如果之前未在配置文件中配置)。以下以UTF-8编码页面为例进行说明:
- 修改MYSQL的配置文件:my.ini里面修改default-character-set=utf8
- 代码运行时修改:
①Java代码:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
②PHP代码:header("Content-Type:text/html;charset=utf8");
③C语言代码:int mysql_set_character_set( MYSQL * mysql, char * csname);
该函数用于为当前连接设置默认的字符集。字符串csname指定了1个有效的字符集名称。连接校对成为字符集的默认校对。该函数的工作方式与SET NAMES语句类似,但它还能设置mysql -> charset的值,从而影响了由mysql_real_escape_string() 设置的字符集。
创建数据库
create database <数据库名>;
删除数据库
drop database <数据库名>;
- 删除一个已经确定存在的数据库。
mysql> drop database test_db;
- 删除一个不确定存在的数据库。
mysql> drop database if exists test_db;
连接数据库
use <数据库名>;
use 语句告诉MySQL把db_name数据库作为默认(当前)数据库使用,用于后续语句。该数据库保持为默认数据库,直到语段的结尾,或者直到发布一个不同的USE语句。使用USE语句为一个特定的当前的数据库做标记,不会阻碍访问其它数据库中的表。
查看相关信息
MySQL中SELECT命令类似于其他编程语言里的print或者write,你可以用它来显示一个字符串、数字、数学表达式的结果等等。
- 显示当前选择的数据库
select database();
- 显示MySQL的版本
select version();
- 显示当前时间
select now();
- 显示年月日
select current_date;
、显示日SELECT DAYOFMONTH(CURRENT_DATE);
、显示月SELECT MONTH(CURRENT_DATE);
、显示年SELECT YEAR(CURRENT_DATE);
- 显示字符串
select "welecome to my blog!";
- 计算
select ((4 * 4) / 10 ) + 25;
- 串接字符串,使用CONCAT()函数
select CONCAT(f_name, " ", l_name) AS Name from employee_data where title = 'Marketing Executive';
查看该数据库下所有表
show tables;
显示数据表的结构
describe 表名;
创建数据表
create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
CREATE TABLE TEST_TABLE
(
ID INT(2) NOT NULL,
NAME VARCHAR(32) NOT NULL,
SCORE DOUBLE(8,2) NOT NULL,
CONSTRAINT PK_TEST_DB PRIMARY KEY (ID)
);
增加注释
- 给表增加注释。
COMMENT ON TABLE <表名> IS 'Comment';
- 给表中一列增加注释。
COMMENT ON COLUMN <表名>.<字段> IS 'Comment';
增加唯一索引
CREATE UNIQUE INDEX 索引名 on 表名(字段1,字段2);
增加主键
alter table 表名 add primary key (字段);
删除数据表
drop table <表名>
向表中插入数据
insert into <表名> [( <字段1>[,..<字段n > ])] values ( 值1 )[, ( 值n )]
insert into test_table values(1,'Guo',96.45),(2,'Gordon',82.99), (3,'Zhang', 91.59);
查询表中的数据
select <字段1,字段2,...> from <表名> where <表达式>
- 查询所有行
select * from test_table;
- 查询前几行数据
select * from test_table order by id limit 0,2;
删除数据
delete from <表名> where <表达式>;
修改表中数据
update <表名> set <字段>=<新值>,… where <条件>;update test_table set name='Mary' where id=3;
增加或修改字段
alter table <表名> add/modify <字段 类型 其他>;alter table test_table add passtest int(4)
修改表名
rename table 原表名 to 新表名;
当执行 RENAME 时,不能有任何锁定的表或活动的事务。同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,即回滚。
导出和导入数据库
- 导出。mysqldump -u用户名 -p密码 --databases 数据库名 > 导出文件名。导出文件在当前目录生成。
mysqldump -uroot -p123456 --databases dbname > mysql.dump
- 导入。
mysqlimport -uroot -p123456 < mysql.dump
删除与清空表区别
测试: 建一个带有自增字段的表,加入100万数据,然后分别用TRUNCATE和DELETE删除全部数据,再向表里插入一条数据。
结果: TRUNCATE TABLE是非常快的,TRUNCATE之后的自增字段从头开始计数了,而DELETE的仍保留原来的最大数值。
- truncate和delete只删除数据记录不删除结构定义;drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index)。
- delete是DML,这个操作会放到rollback segement中,事务提交之后才生效,如果有相应的trigger,执行的时候将被触发;truncate,drop是DDL, 操作立即生效,原数据不放到rollback segment中,不能回滚, 操作不触发trigger。
- delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不动;drop语句将表所占用的空间全部释放;truncate语句缺省情况下会把空间释放到minextents,除非使用reuse storage,truncate会将高水线复位(回到最开始)。
- 速度:drop>truncate>delete
- 安全性: drop和truncate没有备份(慎重使用);如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
参考链接:
- W3school
- 菜鸟教程
- http://www.cnblogs.com/zhangzhu/archive/2013/07/04/3172486.html