#启动mysql服务:
net start mysql80
#停止mysql服务:
net stop mysql80
#创建数据库
CREATE DATABASE 数据库名
#删除数据库
DROP DATABASE 数据库名
#MySQL的建表语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition,…)] [table_options]
[select_statement]
说明:
TEMPORARY:表示创建临时表,在当前会话结束后将自动消失
IF NOT EXISTS:在建表前,先判断表是否存在,只有该表不存在时才创建
create_definition:建表语句的关键部分,用于定义表中各列的属性
table_options:表的配置选项,例如:表的默认存储引擎、字符集
select_statement:通过select语句建表
#添加字段sex,类型为VARCHAR(1)
ALTER TABLE contacts ADD sex VARCHAR(1);
#修改字段sex的类型为tinyint
ALTER TABLE contacts MODIFY sex tinyint;
#删除字段sex
ALTER TABLE contacts DROP COLUMN sex;
#删除contacts表
DROP TABLE contacts;
#INSERT 插入单条数据:
INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (value1, value2, ..., valueN);
#INSERT 插入多条数据:
INSERT INTO table_name (field1, field2, ..., fieldN) VALUES (valueA1, valueA2, ..., valueAN), (valueB1,valueB2, ..., valueBN), …, (valueN1, valueN2, ..., valueNN);
注意事项:
1、如果字段是字符型,值必须使用单引号或者双引号,如”value”;如果值本身带单引号或双引号,需要转义
2、如果所有列都要添加数据,insert into语句可以不指定列,即 INSERT INTO table_name VALUES (value1, value2, ..., valueN);
#update语法:
UPDATE table_name SET field1=newValue1, field2=newValue2 [WHERE Clause]
注意事项:
1、可以同时更新一个或多个字段
2、可以通过where子句来指定更新的范围,如果不带where,则更新数据表中的所有记录
#delete语法:
DELETE FROM table_name [WHERE Clause]
注意事项:
1、可以通过where子句来指定删除的范围,如果不带where,则删除数据表中的所有记录
#在创建表时添加唯一性约束
create table person(
id int not null auto_increment primary key comment '主键id',
name varchar(30) comment '姓名',
id_number varchar(18) unique comment '身份证号'
);
#成绩表
create table sc(
id int not null auto_increment primary key comment '主键id',
stu_no int not null comment '学号',
course varchar(30) comment '课程',
grade int comment '成绩',
foreign key(stu_no) references stu(stu_no)
);
SELECT column_name1, column_name2
FROM table_name
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
#SQL语句中使用where子句语法
SELECT column_name FROM table_name WHERE column_name 运算符 value
#and、or运算符语法
SELECT column_name FROM table_name WHERE condition1 AND condition2 OR condition3
#where子句使用in语法
SELECT column_name FROM table_name WHERE column_name IN(value1, value2, …)
#where子句使用like语法
SELECT column_name FROM table_name WHERE column_name LIKE ‘%value%’
说明:
1、LIKE子句中的%类似于正则表达式中的*,匹配任意0个或多个字符
2、LIKE子句中的_匹配任意单个字符
3、LIKE子句中如果没有%和_,就相当于运算符=的效果
insert into user(id, name, create_time) values(1, 'zhangsan', now());
select name, date_format(birthday, '%Y/%m/%d') from user;
#case when的语法有2种
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
CASE WHEN [expr] THEN [result1]…ELSE [default] END
#order by语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
ORDER BY column_name, column_name [ASC|DESC]
说明:
1. ASC表示按升序排列,DESC表示按降序排列。
2. 默认情况下,对列按升序排列。
#limit语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
LIMIT [offset,] row_count
说明:
1. offset指定要返回的第一行的偏移量。第一行的偏移量是0,而不是1。
2. row_count指定要返回的最大行数。
#【经验分享】limit的分页公式:
limit (page-1)*row_count, row_count
#group by语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
说明:
1. aggregate_function表示聚合函数。
2. group by可以对一列或多列进行分组。
#having语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
#group_concat语法
group_concat([distinct] column_name [order by column_name asc/desc] [separator '分隔符'])
#distinct语法
SELECT DISTINCT column_name, column_name
FROM table_name;
#表连接语法
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
#自连接语法
SELECT A.column, B.column
FROM table A, table B
WHERE A.column = B.column;
#子查询in语法
SELECT column_name FROM table_name
WHERE column_name IN(
SELECT column_name FROM table_name [WHERE]
);
#where子句使用exists语法
SELECT column_name1
FROM table_name1
WHERE EXISTS (SELECT * FROM table_name2 WHERE condition);
#创建用户
CREATE USER '用户名' [@'主机名'] [IDENTIFIED BY '密码'];
注意:MySQL的用户账号由两部分组成:用户名和主机名,即用户名@主机名,主机名可以是IP或机器名称,
主机名为%表示允许任何地址的主机远程登录MySQL数据库。
#删除用户
DROP USER '用户名' [@'主机名'];
#修改密码
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
#授权
grant all privileges on databaseName.tableName to '用户名' [@'主机名'] ;
#撤销授权
revoke all privileges on databaseName.tableName from '用户名' [@'主机名'] ;
#刷新权限
FLUSH PRIVILEGES;
#查看权限
show grants for '用户名' [@'主机名'] ;
update user set host='localhost' where user ='用户名';
#关闭权限验证
mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-granttables
--shared-memory
说明:参数--defaults-file的值为配置文件my.ini的完整路径。
#刷新权限
FLUSH PRIVILEGES;
#修改root用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#查看是否开启慢查询日志
show variables like 'slow%';
#临时开启慢查询日志
set slow_query_log='ON';
set long_query_time=1;
#慢查询日志文件所在位置
show variables like '%datadir%';
# 创建普通索引
CREATE INDEX indexName ON tableName(columnName(length));
# 创建唯一索引
CREATE UNIQUE INDEX indexName ON tableName(columnName(length));
# 创建复合索引
CREATE INDEX indexName ON tableName(columnName1, columnName2, …);
#删除索引
DROP INDEX [indexName] ON tableName;
#查看索引
SHOW INDEX FROM tableName;
#Range分区示例
create table user_range(
id int not null auto_increment,
name varchar(30),
age int,
birthday date,
province int,
primary key(id,age)
)
#主键必须包含分区字段
partition by RANGE(age)(
partition p1 VALUES LESS THAN (20)DATA DIRECTORY='c:/data/p1',
partition p2 VALUES LESS THAN (40)DATA DIRECTORY='c:/data/p2',
partition p3 VALUES LESS THAN (60)DATA DIRECTORY='c:/data/p3',
partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY='c:/data/p4'
);
#List分区示例
create table user_list(
id int not null auto_increment,
name varchar(30),
age int,
birthday date,
province int,
primary key(id,province)
)
partition by List(province)(
partition p1 VALUES IN (1,3,5,7,9,11,13,15,17,19,21),
partition p2 VALUES IN (2,4,6,8,10,12,14,16,18,20,22),
partition p3 VALUES IN (23,24,25,26,27,28,29,30,31,32,33,34)
);
#Hash分区示例
create table user_hash(
id int not null auto_increment,
name varchar(30),
age int,
birthday date,
province int,
primary key(id,birthday)
)
partition by HASH(YEAR(birthday))
partition 5;
#Key分区示例
create table user_range(
id int not null auto_increment,
name varchar(30),
age int,
birthday date,
province int,
primary key(id,age)
)
partition by Key(age)
partition 5;
#新增分区
alter table 'user' add partition (partition p5 VALUES LESS THAN MAXVALUE);
#对已在的表进行分区
alter table 'user' partition by RANGE(age)(
partition p1 VALUES LESS THAN (20)DATA DIRECTORY='c:/data/p1',
partition p2 VALUES LESS THAN (40)DATA DIRECTORY='c:/data/p2',
partition p3 VALUES LESS THAN (60)DATA DIRECTORY='c:/data/p3',
partition p4 VALUES LESS THAN MAXVALUE DATA DIRECTORY='c:/data/p4'
);
#删除分区(分区下的数据也会被删除)
alter table 'user' drop partition p5;
#移除分区(数据不会被删除)
alter table 'user' REMOVE PARTITIONING;
#创建视图
CREATE VIEW view_name AS SELECT…;
#修改视图
ALTER VIEW view_name AS SELECT…;
#查看视图创建语句
SHOW CREATE VIEW view_name;
#查看有哪些视图
SHOW TABLE STATUS WHERE comment='view';
#删除视图
DROP VIEW view_name;
什么是存储过程
存储过程(Stored Procedure)是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行,类似于编程语言中的方法或函数。
存储过程的优点:
存储过程的缺点:
存储过程示例
#存储过程定义:求两数之和
delimiter //
create procedure my_sum(in a int, in b int, out result int)
begin
set result = a + b;
end
//
delimiter ;
#存储过程调用
call my_sum(10, 20, @result);
select @result;
#存储过程定义:计算1+2+...+n的和
delimiter //
create procedure my_n_sum(in n int, out result int)
begin
declare i int default 1;
declare sum int default 0;
while i<=n do
set sum = sum + i;
set i = i + 1;
end while;
set result = sum;
end;
//
delimiter ;
#测试数据及需求描述
drop table if exists user_info;
drop table if exists email_info;
create table user_info(
id int not null auto_increment primary key,
name varchar(30),
email varchar(50)
);
insert into user_info(id, name, email) values(1, '柳峰', '[email protected]');
insert into user_info(id, name, email) values(2, '张三', '[email protected]');
create table email_info(
id int not null auto_increment primary key,
email varchar(50),
content text,
send_time datetime
);
#存储过程实现
#存储过程示例:根据用户id和邮件内容content给用户发邮件
delimiter //
create procedure send_email(in user_id int, in content text)
begin
/* 根据用户id查询邮箱email */
set @user_email=(select email from user_info where id=user_id);
/* 模拟发送邮件 */
insert into email_info(email, content, send_time) values(@user_email, content, now());
end;
//
delimiter ;
call send_email(1, '欢迎加入MySQL阵营!');
#创建触发器语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
trigger_stmt
参数说明:
trigger_name:触发器名称
trigger_time:触发时间,取值有before、after
trigger_event:触发事件,取值有insert、update、delete
table_name:触发器监控的表名
trigger_stmt:触发执行的语句,可以使用OLD、NEW来引用变化前后的记录内容
NEW.columnName:获取INSERT触发事件中新插入的数据
OLD.columnName:获取UPDATE和DELETE触发事件中被更新、删除的数据
#测试数据及需求描述
drop table if exists user_info;
drop table if exists email_info;
create table user_info(
id int not null auto_increment primary key,
name varchar(30),
email varchar(50)
);
insert into user_info(id, name, email) values(1, '柳峰', '[email protected]');
insert into user_info(id, name, email) values(2, '张三', '[email protected]');
create table email_info(
id int not null auto_increment primary key,
email varchar(50),
content text,
send_time datetime
);
#触发器实战:给新用户发邮件
delimiter //
CREATE TRIGGER send_email_trigger AFTER INSERT ON user_info FOR EACH ROW
BEGIN
insert into email_info(email, content, send_time) values(NEW.email, '欢迎加入MySQL阵营!', now());
END
//
delimiter ;
# 定义预处理语句
PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;
#select…into outfile示例
SELECT * FROM employee INTO OUTFILE 'D:\\employee.txt' /*文件存储路径*/
FIELDS TERMINATED BY ',' /*字符分隔符*/
ENCLOSED BY '"' /*值用双引号引起*/
LINES TERMINATED BY '\r\n'; /*行间分隔符*/
#示例
mysql -h localhost -u root -p -D mydb -e "select * from employee" > E:\employee.txt
# 导出mydb数据库(含数据)
mysqldump -h localhost -u root -p mydb > d:/mydb.sql
# 导出mydb数据库(不含数据)
mysqldump -h localhost -u root -p mydb --no-data > d:/mydb.sql
# 导出mydb.employee数据表
mysqldump -h localhost -u root -p mydb employee > d:/employee.sql
# 导出mydb数据库,忽略contacts表
mysqldump -h localhost -u root -p mydb --ignore-table mydb.contacts > d:/employee.sql
#备份数据库的脚本mysql_mydb-backup.bat
mysqldump -h localhost -uroot -p123456 mydb > d:\backup\mydb.sql
#创建计划任务(每隔指定时间备份一次MySQL)
schtasks/create/sc minute/mo 1/tn 定期备份MySQL/tr d:\backup\mysql_mydb_backup.bat
#删除计划任务
schtasks/delete/tn 定期备份MySQL
#!/bin/bash
#备份目录
backup_dir=/home/liufeng/backup
#备份文件名
backip_filename="mydb-'date+%Y%m%d'.sql"
#进入备份目录
cd $backup_dir
#备份数据库
mysqldump -h localhost -uroot -p123456 mydb > ${backup_dir}/${backup_filename}
#删除7天以前的备份
find${backup_dir} -mtime+7 -name "*.sql" -exec rm -rf{}\;
#每天凌晨01:30执行shell脚本(备份数据库)
30 1 *** bash/home/liufeng/backup/mysql_mydb_backup.sh
#示例
LOAD DATA INFILE 'D:\\employee.txt' INTO TABLE employee character set utf8 /*数据文件位置*/
FIELDS TERMINATED BY ',' /*字段间分隔符*/
ENCLOSED BY '"' /*值用双引号引起*/
LINES TERMINATED BY '\r\n'; /*行间分隔符*/
# source命令的使用示例
source d:/mydb.sq
#数据库
# 创建数据库时指定字符集
CREATE DATABASE databaseName CHARSET utf8 COLLATE utf8_general_ci;
# 查看数据库的字符集
SHOW CREATE DATABASE databaseName;
#表
# 创建表时指定字符集
CREATE TABLE tableName(…) DEFAULT CHARSET=utf8;
# 查看数据库的字符集
SHOW CREATE TABLE tableName;
#字段
CREATE TABLE tableName(…, name varchar(50) not null CHARSET utf8, …);
#查看所有二进制日志列表
show master logs;
#查看正在使用的二进制日志
show master stsaus;
#刷新日志(重新开始新的binlog日志文件)
flush logs
#查询指定的binlog
show binlog events in 'WQ-20160823MDKU-bin.000050' from 10668\G;
#导出恢复数据用的sql
mysqlbinlog "C:\ProgramData\MySQL\MySQL Server 8.0\Data\WQ-20160823MDKU-bin.000057" --
start-position 528 --stop-position 1191 >d:\backup\test.sql
在Windows中,修改了MySQL 8.0的配置文件my.ini后会发现启动MySQL失败,错误提示如下。
在Windows中,MySQL配置文件的编码为ANSI,但是修改配置文件后默认保存的编码为UTF-8,这会导致MySQL解析配置文件错误,无法启动。只需要将配置文件另存为ANSI编码即可。
老版本的Navicat连接能正常连接MySQL 5.x,但是连接MySQL 8.0却报错,错误提示如图所示。
MySQL 5.x的身份认证方式为 mysql_native_password,也就是Navicat客户端支持的认证方式。但是MySQL 8.0升级了身份认证方式,默认为 caching_sha2_password。因此,在不升级Navicat版本的情况下,可以将MySQL 8.0的身份认证方式修改为 mysql_native_password。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
MySQL在5.5.3之后增加了utf8mb4编码,mb4是most bytes 4的缩写,专门用于兼容四字节字符,如Emoji表情,部分中文“ ”。MySQL中的utf8是utf8mb3的别名,utf8mb4兼容utf8,且比utf8能表示更多的字符。MySQL 8.0将utf8mb4作为默认字符集。
什么是原子DDL
MySQL 8.0 开始支持原子性的数据定义语言(DDL),也称为原子 DDL。一个原子 DDL 语句将相关的数据字典更新、存储引擎操作以及写入二进制日志组合成单一的原子事务。当事务正在处理时出现服务器故障,该事务可能被提交,相应的变更会保存到数据字典更新、存储引擎更改以及二进制日志中;也可能被整体回滚。目前,只有 InnoDB 存储引擎支持原子 DDL。
支持原子DDL
不支持原子DDL
原子DDL的使用
任何 DDL 语句,包括原子性或其他的 DDL,都会隐式地结束当前事务,就像在执行语句之前执行了COMMIT 操作一样。这就意味着 DDL 语句不能位于其他事务之中,不能位于事务控制语句(如START TRANSACTION … COMMIT)之中,也不能与同一个事务中的其他语句组合使用。
#使用MySQL Shell连接数据库(支持文档存储)
mysqlsh root@localhost:33060/mydb
#查看当前数据库
db
#查看当前数据库有哪些集合
db.getCollections()
#创建集合
db.createCollection("employee_doc")
#删除集合
db.dropCollection("employee_doc")
#添加文档
db.employee_doc.add({
"id":1,
"name":"张三",
"sex":"男",
"salary":5500,
"dept":"部门A"
})
#查询文档
db.employee_doc.find("name='柳峰'")
#删除文档
db.employee_doc.remove("name='柳峰'")
#删除所有文档
db.employee_doc.remove("true")