简介:各个版本的区别 官网:https://dev.mysql.com/downloads/mysql/
Mysql5.7-64位下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip
1、下载后得到zip压缩包.
2、解压到自己想要安装到的目录,本人解压到的是D:\Environment\mysql-5.7.19
3、添加环境变量:我的电脑->属性->高级->环境变量->选择PATH,在其后面添加:mysql 安装文件下的bin文件夹
4、新建编辑 my.ini 文件 ,注意替换路径位置
[mysqld]
basedir=D:\Program Files\mysql-5.7\
datadir=D:\Program Files\mysql-5.7\data\
port=3306
skip-grant-tables
5、启动管理员模式下的CMD,并切换至mysql下的bin目录,将mysql 注册成服务
# mysqld --install 服务名称
mysqld --install mysql5.7.19
6、初始化数据文件输入(使用其中一个即可):
# 方式一:初始化用户密码为空,同时生成Data文件夹
mysqld --initialize-insecure --user=mysql
# 方式二:会打印root用户的初始默认密码,同时并生成Data文件夹
mysqld --initialize --console
7、然后再次启动mysql 然后用命令 mysql –u root –p 进入mysql管理界面(密码可为空)
8、进入界面后更改root密码,然后刷新权限
-- 修改密码
update mysql.user set authentication_string=password('password') where user='root' and Host='localhost';
-- 刷新权限
flush privileges;
10、修改 my.ini文件删除最后一句skip-grant-tables
11、重启mysql即可正常使用
net stop mysql
net start mysql
12、删除服务命令
# mysqld --remove 服务名称
mysqld --remove mysql
1、安装开发工具包和依赖包
# 安装开发工具包
$ yum groups mark install 'Development Tools'
$ yum -y install wget bzip2 bzip2-devel gcc gcc-c++
# 安装依赖包
$ yum -y install ncurses-devel openssl-devel openssl cmake mariadb-devel
2、为mysql创建用户和组
# 创建用户和组
$ groupadd -r -g 306 mysql
$ useradd -r -M -s /sbin/nologin -g mysql mysql
3、下载二进制格式的mysql软件包
# 下载二进制格式的mysql软件包
$ cd /usr/src/
$ wget https://downloads.mysql.com/archives/get/file/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
4、解压软件至/usr/local/
# 解压软件至/usr/local/
$ tar xf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
$ cd /usr/local/
$ ln -s mysql-5.7.23-linux-glibc2.12-x86_64/ mysql
注:
1.ln软连接,-s是代号(symbolic)的意思;
2.使用方法:ln -s 源文件 目标文件;
3.我们需要在不同的目录,用到相同的文件时,我们只要在其它目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
5、修改目录/usr/local/mysql的属主属组,添加环境变量
# 修改目录/usr/local/mysql的属主属组,添加环境变量
# 注:-R处理指定目录以及其子目录下的所有文件
$ chown -R mysql.mysql /usr/local/mysql
$ echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
$ ./etc/profile.d/mysql.sh
6、建立数据存放目录
$ mkdir /opt/data
$ chown -R mysql.mysql /opt/data/
7、初始化数据库
$ /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
8、配置mysql
$ ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
‘/usr/local/include/mysql’ -> ‘/usr/local/mysql/include/’
$ echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
$ ldconfig -v
9、生成配置文件
[root@zzg local]# cat > /etc/my.cnf <
> [mysqld]
> basedir = /usr/local/mysql
> datadir = /opt/data
> socket = /tmp/mysql.sock
> port = 3306
> pid-file = /opt/data/mysql.pid
> user = mysql
> skip-name-resolve
> EOF
10、配置服务启动脚本
$ cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
$ sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
$ sed -ri 's#^(datadir=).*#\1/opt/data#g' /etc/init.d/mysqld
11、启动
$ service mysqld start
12、修改密码
mysql> set password = password(123456');
mysql的核心知识之服务管理
简介:mysql的service服务管理与登录管理
查看mysql服务进程:ps -ef | grep mysql service
服务管理:cp -a mysql.server /etc/rc.d/init.d/mysql
启动命令:service mysql start
关闭命令:service mysql stop
重新启动命令:service mysql restart
查看状态命令:service mysql status
登录管理:ln -s /usr/local/mysql/bin/* /bin
登录命令:mysql -uroot -p
默认端口号:3306
配置文件:/etc/my.cnf
简介:MySQL的操作语句分类
名称 | 解释 | 命令 |
---|---|---|
DDL 数据定义语言 (Data Definition Language) | 建库、建表 | CREATE、DROP、ALTER |
DML 数据操纵语言(Data Manipulation Language) | 表中数据的增删改操作 | INSERT、UPDATE、DELETE |
DQL 数据查询语言(Data Query Language) | 对数据进行查询 | SELECT |
DCL 数据控制语言(Data Control Language) | 对用户的权限进行设置 | GRANT、commit、 rollback |
简介:细讲数据库的创建使用
--直接创建数据库 db1
create database db1;
--查看当前在哪个库里边
select database();
--进入库的操作
use 库名;
--判断是否存在,如果不存在则创建数据库 db2
create database if not exists db2;
--创建数据库并指定字符集为 gbk
create database db3 default character set gbk;
--查看某个库是什么字符集;
show create database XD;
--查看当前mysql使用的字符集
show variables like 'character%';
<1>整数型
类型 大小 范围(有符号) 范围(无符号unsigned) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 字节 (-8388608,8388607) (0,16777215) 大整数值
INT 4 字节 (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 字节 (-2的63次方,-2的63次方减1) (0,2的64次方减1) 极大整数值
<2>浮点型
FLOAT(m,d) 4 字节 单精度浮点型 备注:m代表总个数,d代表小数位个数
DOUBLE(m,d) 8 字节 双精度浮点型 备注:m代表总个数,d代表小数位个数
<3>定点型
DECIMAL(m,d) 依赖于M和D的值,如果M>D,为M+2否则为D+2字节 备注:m代表总个数,d代表小数位个数
<4>字符串类型
类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535字节 变长字符串
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65535字节 长文本数据
MEDIUMTEXT 0-16777215字节 中等长度文本数据
LONGTEXT 0-4294967295字节 极大文本数据
char的优缺点:存取速度比varchar更快,但是比varchar更占用空间
varchar的优缺点:比char省空间。但是存取速度没有char快
<5>时间型
数据类型 字节数 格式 备注
date 3 yyyy-MM-dd 存储日期值
time 3 HH:mm:ss 存储时分秒
year 1 yyyy 存储年
datetime 8 yyyy-MM-dd HH:mm:ss 存储日期+时间
timestamp 4 yyyy-MM-dd HH:mm:ss 存储日期+时间,可作时间戳(根据时区来显示)
create table test_time (
date_value date,
time_value time,
year_value year,
datetime_value datetime,
timestamp_value timestamp
) engine=innodb charset=utf8;
-- 插入时间数据
insert into test_time values(now(), now(), now(), now(), now());
mysql> select * from test_time;
+------------+------------+------------+---------------------+---------------------+
| date_value | time_value | year_value | datetime_value | timestamp_value |
+------------+------------+------------+---------------------+---------------------+
| 2020-07-26 | 14:19:44 | 2020 | 2020-07-26 14:19:44 | 2020-07-26 14:19:44 |
+------------+------------+------------+---------------------+---------------------+
其区别在于:float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形式保存数值。
float有个坏处,当你给定的数据是整数的时候,那么它就以整数给你处理。这样我们在存取货币值的时候自然遇到问题,我的default值为:0.00而实际存储是0,同样我存取货币为12.00,实际存储是12。
幸好mysql提供了两个数据类型:decimal,这种数据类型可以轻松解决上面的问题:decimal类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。
create table t1(
field_float float(10,2) default null,
field_decimal decimal(10,2) default null
);
insert into t1 values
(1234567.21, 1234567.21),
(9876543.21, 9876543.12),
(98765430.21, 98765430.12);
mysql> select * from t1;
+-------------+---------------+
| field_float | field_decimal |
+-------------+---------------+
| 1234567.25 | 1234567.21 |
| 9876543.00 | 9876543.12 |
| 98765432.00 | 98765430.12 |
+-------------+---------------+
浮点型float:
1234567.21 出现偏差:1234567.25
9876543.21 出现偏差:9876543.00
98765430.21出现偏差:98765432.00
create table t2(
field_float float(5,2) default null,
field_double double(5,2) default null,
field_decimal decimal(5,2) default null
);
insert into t2 values (1.2345,1.2345,1.2345);
insert into t2 values (12.345,12.345,12.345);
insert into t2 values (123.45,123.45,123.45);
insert into t2 values (1234.5,1234.5,1234.5);
insert into t2 values (123.4,123.4,123.4);
mysql> select * from t2;
+-------------+--------------+---------------+
| field_float | field_double | field_decimal |
+-------------+--------------+---------------+
| 1.23 | 1.23 | 1.23 |
| 12.35 | 12.35 | 12.35 |
| 123.45 | 123.45 | 123.45 |
| 999.99 | 999.99 | 999.99 |
| 123.40 | 123.40 | 123.40 |
+-------------+--------------+---------------+
1.2345 --- 小数点后最多2位,所以保存可以,自动四舍五入数据截断,输出: 1.23
12.345 --- OK,小数位超1为,由于超出位为5,自动四舍五入,最后得出为 12.35
123.45 --- 正好符合3个整数位和2个小数位
1234.5 --- 因为小数位未满2位,要补0.所以应该为1234.50,但是整个位数超出了5,保存报错,输出999.99
123.4 --- 小数未满部分补0。按照123.40保存
默认状态比较:
浮点数如果不写经度和标度,会按照实际精度值保存,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0) 来操作,如果数据超过了精度和标度值,系统会报错。
简介:讲解表是怎么来创建的,以及常见约束条件举例说明
CREATE TABLE 表名 (
字段名1 字段类型1 约束条件1 说明1,
字段名2 字段类型2 约束条件2 说明2,
字段名3 字段类型3 约束条件3 说明3
);
-- 1.1.只复制表结构到新表,注意:这种方式用于日常测试,因为可能索引等会复制不过来
create table 新表名 as select * from 旧表名 where 1=2;
-- 1.2.复制表结构及数据到新表
create table 新表名 as select * from 旧表名
-- 2.复制表结构及数据到新表
create table 新表名 like 旧表名;
comment ----说明解释
not null ----不为空
default ----默认值
unsigned ----无符号(即正数)
auto_increment ----自增
zerofill ----自动填充,不足位数的用0来填充,如 int(3),5则为005
unique key ----唯一值
CREATE TABLE student (
id tinyint(5) zerofill auto_increment not null comment '学生学号',
name varchar(20) default null comment '学生姓名',
age tinyint default null comment '学生年龄',
class varchar(20) default null comment '学生班级',
sex char(5) not null comment '学生性别',
unique key (id)
)engine=innodb charset=utf8;
CREATE TABLE student (
id tinyint(5) auto_increment default null comment '学生学号',
name varchar(20) default null comment '学生姓名',
age tinyint default null comment '学生年龄',
class varchar(20) default null comment '学生班级',
sex char(5) not null comment '学生性别',
unique key (id)
)engine=innodb charset=utf8;
简介:如何查看表的基本结构信息
--语法:
--[FROM db_name]可选,表示查询哪个数据库下面的表信息。
--[LIKE 'pattern'] 可选,表示查询哪些具体的表名
show table status [FROM db_name] [LIKE 'pattern']
-- 查看当前库所有表的信息:
show table status\G
-- 查询db_name 数据库里所有表的信息
show table status from db_name\G
-- 查询db_name 里 table_name 表的信息
show table status from db_name like 'table_name '\G
-- 查询db_name 数据库里表名以tb开头的表的信息
show table status from db_name LIKE 'tb%'\G
mysql> show table status like 'tableName' \G
Name:表名称
Engine:表的存储引擎
Version:版本
Row_format:行格式。对于MyISAM引擎,这可能是Dynamic,Fixed或Compressed。动态行的行长度可变,例如Varchar或Blob类型字段。固定行是指行长度不变,例如Char和Integer类型字段
Rows:表中的行数。对于MyISAM和其他存储引擎,这个值是精确的,对于innoDB存储引擎,这个值通常是估算的
Avg_row_length:平均每行包括的字节数
Data_length:整个表的数据量(以字节为单位)
Max_data_length:表可以容纳的最大数据量,该值和存储引擎相关
Index_length:索引占用磁盘的空间大小(以字节为单位)
Data_free:对于MyISAM引擎,表示已经分配,但目前没有使用的空间。这部分空间包含之前被删除的行,以及后续可以被insert利用到的空间
Auto_increment:下一个Auto_increment的值
Create_time:表的创建时间
Update_time:表的最近更新时间
Check_time:使用 check table 或myisamchk工具最后一次检查表的时间
Collation:表的默认字符集和字符排序规则
Checksum:如果启用,保存的是整个表的实时校验和
Create_options:创建表时指定的其他选项
Comment:包含了其他额外信息,对于MyISAM引擎,保存的是表在创建时带的注释。如果表使用的是innodb引擎 ,保存的是InnoDB表空间的剩余空间。如果是一个视图,注释里面包含了VIEW字样。
-- 查看数据库中的所有表:
mysql> show tables;
+---------------------+
| Tables_in_jdbcstudy |
+---------------------+
| t1 |
| t2 |
| test_time |
| student |
+---------------------+
4 rows in set (0.04 sec)
-- 查看创建表的sql语句:
-- show create table 表名;
mysql> show create table test_time;
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_time | CREATE TABLE `test_time` (
`date_value` date DEFAULT NULL,
`time_value` time DEFAULT NULL,
`year_value` year(4) DEFAULT NULL,
`datetime_value` datetime DEFAULT NULL,
`timestamp_value` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
-- 查看表结构:
-- desc 表名;
mysql> desc test_time;
+-----------------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------+------+-----+---------+-------+
| date_value | date | YES | | NULL | |
| time_value | time | YES | | NULL | |
| year_value | year(4) | YES | | NULL | |
| datetime_value | datetime | YES | | NULL | |
| timestamp_value | timestamp | YES | | NULL | |
+-----------------+-----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
-- \G:有结束sql语句的作用,把显示的数据纵向旋转90度,替换;
mysql> show create table test_time\G
*************************** 1. row ***************************
Table: test_time
Create Table: CREATE TABLE `test_time` (
`date_value` date DEFAULT NULL,
`time_value` time DEFAULT NULL,
`year_value` year(4) DEFAULT NULL,
`datetime_value` datetime DEFAULT NULL,
`timestamp_value` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
-- \g :有结束sql语句的作用,等同 ;
desc test_time\g
-- 等同于
desc test_time;
简介:细讲核心知识表结构的修改
rename table 旧表名 to 新表名;
rename table student to user;
-- 给表添加一列:
alter table 表名 add 列名 类型;
alter table user add addr varchar(50);
alter table 表名 add 列名 类型 comment '说明';
alter table user add famliy varchar(50) comment '学生父母';
-- 给表最前面添加一列:
alter table 表名 add 列名 类型 first;
alter table user add job varchar(10) first;
-- 给表某个字段后添加一列:
alter table 表名 add 列名 类型 after 字段名;
alter table user add servnumber int(11) after id;
-- 注意:没有给表某个字段前添加一列的说法。
alter table 表名 drop 列名;
alter table user drop famliy;
alter table 表名 modify 列名 新类型;
alter table user modify servnumber varchar(20);
alter table 表名 change 旧列名 新列名 类型;
alter table user change servnumber telephone varchar(20);
alter table 表名 character set 字符集;
alter table user character set GBK;
-- 如删除不存在的数据表会抛出错误
drop table 表名;
drop table user;
-- 看表是否存在,若存在则删除表:
drop table if exists 表名;
drop table if exists teacher;
简介:讲解表数据新增的多种例子
insert into 表名(字段名) values(字段对应值);
-- 选择字段插入数据
insert into employee (empno,ename,job,mgr,hiredate,sal,deptnu)
values ('1000','小明','经理','10001','2019-03-03','12345.23','10');
-- 所有字段都插入时可以省略字段名
insert into 表名 values(所有字段对应值);
insert into employee values ('1001','小明','经理','10001','2019-03-03','12345.23','10');
insert into 表名1 select * from 表名2;
insert into 表名1(字段名1,字段名2) select 字段名1,字段名2 from 表名2;
insert into emp (empno,ename) select empno,ename from employee;
create table 表名1 as select 字段名1,字段名2 from 表名2;
create table emp as select empno ,ename from employee;
insert into 表名 (字段名1,字段名2) values (值1,值2),(值3.值4),(值5,值6);
--某个公司的员工表
CREATE TABLE employee(
empno INT PRIMARY KEY comment '雇员编号',
ename VARCHAR(20) comment '雇员姓名',
job VARCHAR(20) comment '雇员职位',
mgr INT comment '雇员上级编号',
hiredate DATE comment '雇佣日期',
sal DECIMAL(7,2) comment '薪资',
deptnu INT comment '部门编号'
);
简介:讲解如何对表数据进行修改删除以及注意事项
update 表名 set 字段名1=值1 where 字段名=值;
update 表名 set 字段名1=值1,字段名2=值2 where 字段名=值;
delete from 表名 where 字段名=值;
--删除表的三种方式
truncate table 表名;
delete from 表名;
drop table 表名;
drop > truncate > delete
面试时:面试官问在删改数据之前,你会怎么做?
答案:会对数据进行备份操作,以防万一,可以进行数据回退
面试时:delete与truncate与drop 这三种删除数据的共同点都是删除数据,他们的不同点是什么?
1.delele 会把删除的操作记录给记录起来,以便数据回退,不会释放空间,而且不会删除定义。
2.truncate不会记录删除操作,会把表占用的空间恢复到最初,不会删除定义
3.drop会删除整张表,释放表占用的空间。
简介:详细讲解汉字显示乱码问题
mysql> show variables like 'character%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
- character_set_client:客户端请求数据的字符集
- character_set_connection:客户端与服务器连接的字符集
- character_set_database:数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将默认使用配置上的字符集
- character_set_results:返回给客户端的字符集(从数据库读取到的数据是什么编码的)
- character_set_server:为服务器安装时指定的默认字符集设定。
- character_set_system:系统字符集(修改不了的,就是utf8)
- character_sets_dir:mysql字符集文件的保存路径
mysql> set character_set_xxx gbk;
[client]
default-character-set=gbk
#作用于外部的显示
[mysqld]
character_set_server=gbk
#作用于内部,会作用于创建库表时默认字符集
alter database xiaoxiao default character set gbk;
alter table employee default character set utf8;
简介:细讲对数据表中的数据进行各种查询,以及项目实战查询
/*创建部门表*/
CREATE TABLE dept(
deptnu INT PRIMARY KEY comment '部门编号',
dname VARCHAR(50) comment '部门名称',
addr VARCHAR(50) comment '部门地址'
);
某个公司的员工表
CREATE TABLE employee(
empno INT PRIMARY KEY comment '雇员编号',
ename VARCHAR(50) comment '雇员姓名',
job VARCHAR(50) comment '雇员职位',
mgr INT comment '雇员上级编号',
hiredate DATE comment '雇佣日期',
sal DECIMAL(7,2) comment '薪资',
deptnu INT comment '部门编号'
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*创建工资等级表*/
CREATE TABLE salgrade(
grade INT PRIMARY KEY comment '等级',
lowsal INT comment '最低薪资',
higsal INT comment '最高薪资'
);
/*插入dept表数据*/
INSERT INTO dept VALUES (10, '研发部', '北京');
INSERT INTO dept VALUES (20, '工程部', '上海');
INSERT INTO dept VALUES (30, '销售部', '广州');
INSERT INTO dept VALUES (40, '财务部', '深圳');
/*插入emp表数据*/
INSERT INTO employee VALUES (1009, '唐僧', '董事长', NULL, '2010-11-17', 50000, 10);
INSERT INTO employee VALUES (1004, '猪八戒', '经理', 1009, '2001-04-02', 29750, 20);
INSERT INTO employee VALUES (1006, '猴子', '经理', 1009, '2011-05-01', 28500, 30);
INSERT INTO employee VALUES (1007, '张飞', '经理', 1009, '2011-09-01', 24500,10);
INSERT INTO employee VALUES (1008, '诸葛亮', '分析师', 1004, '2017-04-19', 30000, 20);
INSERT INTO employee VALUES (1013, '林俊杰', '分析师', 1004, '2011-12-03', 30000, 20);
INSERT INTO employee VALUES (1002, '牛魔王', '销售员', 1006, '2018-02-20', 16000, 30);
INSERT INTO employee VALUES (1003, '程咬金', '销售员', 1006, '2017-02-22', 12500, 30);
INSERT INTO employee VALUES (1005, '后裔', '销售员', 1006, '2011-09-28', 12500, 30);
INSERT INTO employee VALUES (1010, '韩信', '销售员', 1006, '2018-09-08', 15000,30);
INSERT INTO employee VALUES (1012, '安琪拉', '文员', 1006, '2011-12-03', 9500, 30);
INSERT INTO employee VALUES (1014, '甄姬', '文员', 1007, '2019-01-23', 7500, 10);
INSERT INTO employee VALUES (1011, '妲己', '文员', 1008, '2018-05-23', 11000, 20);
INSERT INTO employee VALUES (1001, '小乔', '文员', 1013, '2018-12-17', 8000, 20);
/*插入salgrade表数据*/
INSERT INTO salgrade VALUES (1, 7000, 12000);
INSERT INTO salgrade VALUES (2, 12010, 14000);
INSERT INTO salgrade VALUES (3, 14010, 20000);
INSERT INTO salgrade VALUES (4, 20010, 30000);
INSERT INTO salgrade VALUES (5, 30010, 99990);
简介:详解where条件下的各种查询
select * from employee;
select empno,ename,job as ename_job from employee;
select * from employee where ename='后裔';
select * from employee where sal != 50000;
select * from employee where sal <> 50000;
select * from employee where sal > 10000;
show variables like '%aracter%';
select * from employee where ename like '林%';
select * from employee where sal between 10000 and 30000;
select * from employee where hiredate between '2011-01-01' and '2017-12-1';
select * from employee where ename in ('猴子','林俊杰','小红','小胡');
select distinct(job) from employee;
统计查询(聚合函数):
--count(code)或者count(*)
select count(*) from employee;
select count(ename) from employee;
--sum() 计算总和
select sum(sal) from employee;
--max() 计算最大值
select * from employee where sal= (select max(sal) from employee);
--avg() 计算平均值
select avg(sal) from employee;
--min() 计算最低值
select * from employee where sal= (select min(sal) from employee);
--concat函数: 起到连接作用
select concat(ename,' 是 ',job) as aaaa from employee;
简介:详解group by的用法以及应用场景
select deptnu,count(*) from employee group by deptnu;
select deptnu,job,count(*) from employee group by deptnu,job;
select job,count(*) from employee group by job;
简介:详解having的用法以及应用场景
select job,count(*) from employee group by job having job ='文员';
select deptnu,job,count(*) from employee group by deptnu,job having count(*)>=2;
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2;
简介:详解order by的用法以及应用场景
select * from employee order by sal;
select * from employee order by hiredate;
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu desc;
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu asc;
select deptnu,job,count(*) as 总数 from employee group by deptnu,job having 总数>=2 order by deptnu;
-- 顺序:where ---- group by ----- having ------ order by
简介:详解limit的用法以及应用场景
select * from XD.employee limit 4,5;
简介:详解exists的用法
select 1 from employee where 1=1;
select * from 表名 a where exists (select 1 from 表名2 where 条件);
-- 查询出公司有员工的部门的详细信息
select * from dept a where exists (select 1 from employee b where a.deptnu=b.deptnu);
select * from dept a where not exists (select 1 from employee b where a.deptnu=b.deptnu);
简介:详解左右连接的用法以及应用场景
-- 列出部门名称和这些部门的员工信息,同时列出那些没有的员工的部门
-- dept,employee
select a.dname,b.* from dept a left join employee b on a.deptnu=b.deptnu;
select b.dname,a.* from employee a right join dept b on b.deptnu=a.deptnu;
简介:详解内连接与联合查询的用法以及应用场景
-- 想查出员工张飞的所在部门的地址
select a.addr from dept a inner join employee b on a.deptnu=b.deptnu and b.ename='张飞';
select a.addr from dept a,employee b where a.deptnu=b.deptnu and b.ename='张飞';
-- 对销售员的工资从低到高排序,而文员的工资从高到低排序
(select * from employee a where a.job = '销售员' order by a.sal limit 999999)
union
(select * from employee b where b.job = '文员' order by b.sal desc limit 999999);
简介:高级查询实战
-- 涉及表: employee dept
-- 语句:
select deptnu,count(*) from employee group by deptnu
-- 语句:
select a.deptnu,a.dname,a.addr, b.zongshu from dept a,
(select deptnu,count(*) as zongshu from employee group by deptnu) b
where a.deptnu=b.deptnu;
--涉及表:employee
--语句:
select * from employee where sal > (select sal from employee where ename='安琪拉');
-- 涉及表:employee
-- 语句:
select a.ename,ifnull(b.ename,'BOSS') as leader from employee a left join employee b on a.mgr=b.empno;
-- 涉及表:employee dept
-- 条件:a.hiredate < b.hiredate
-- 语句:
select a.empno,a.ename,c.dname from employee a
left join employee b on a.mgr=b.empno
left join dept c on a.deptnu=c.deptnu
where a.hiredate < b.hiredate;
-- 涉及表:dept employee
-- 语句:
select a.dname,b.* from dept a left join employee b on a.deptnu=b.deptnu;
-- 涉及表:employee dept
-- 条件:job='文员'
-- 语句:
select deptnu,count(*) as zongshu from employee group by deptnu;
--语句:
select b.ename,a.dname,b.job,c.zongshu from dept a ,employee b ,
(select deptnu,count(*) as zongshu from employee group by deptnu) c
where a.deptnu=b.deptnu and b.job='文员' and b.deptnu=c.deptnu;
简介:高级查询实战续
-- 涉及表:employee
-- 条件:min(sal) > 15000
-- 语句:
select job,count(*) from employee group by job having min(sal) > 15000;
-- 涉及表:employee dept
select ename from employee where deptnu=(select deptnu from dept where dname='销售部');
-- 涉及表:employee dept
-- 语句:
select a.ename,b.dname from employee a,dept b
where a.deptnu = b.deptnu
and a.job = (select job from employee where ename='诸葛亮');
--语句:
select a.ename,b.dname from employee a
left join dept b on a.deptnu = b.deptnu
where a.job = (select job from employee where ename='诸葛亮');
-- 涉及表:employee dept
-- 语句:
select a.ename,a.sal,b.dname from employee a ,dept b
where a.deptnu=b.deptnu
and sal > (select max(sal) from employee where deptnu=30);
-- 涉及表:employee
-- 语句:
select deptnu , count(*) ,avg (sal) from employee group by deptnu;
-- 涉及表:employee dept salgrade
-- 条件:select avg(sal) from employee
-- 语句:
select a.*,c.dname,b.ename,d.grade from employee a,employee b,dept c ,salgrade d
where a.mgr=b.empno and a.deptnu =c.deptnu
and a.sal > (select avg(sal) from employee)
and a.sal between d.lowsal and d.higsal;
简介:精讲数据控制语言如何限制用户的各种权限
数据控制语言(DCL:Data Control Language)是用来设置或者更改数据库用户或角色权限的语句,
这些语句包括GRANT、DENY、REVOKE等语句。
简介:详解如何从安全角度出发限制root用户指定ip登录
-- 查看root用户可以在哪台机器登录
select user,host from mysql.user where user='root';
-- 修改mysql库里边的user表
update mysql.user set host='localhost' where user='root';
update mysql.user set host='%' where user='root';
-- 刷新权限
flush privileges;
简介:详解忘记密码以及如何修改用户密码
-- 1.第一种(mysql客户端界面内)
-- 语法:set password for 用户@ip = password('密码');
-- 为当前用户设置密码
set password = password('密码')
-- 为指定用户设置密码
set password for root@'%' = password('root');
set password for root@localhost = password('root');
-- 刷新权限
flush privileges;
-- 2.第二种(mysql客户端界面内)
-- 语法:
-- update mysql.user set authentication_string=password('密码') where user='用户' and host='ip';
-- 该用户可以从任意远程主机登陆
update mysql.user set authentication_string=password('root') where user='root' and host='%';
-- 只有本地用户可以登录
update mysql.user set authentication_string=password('root') where user='root' and host='localhost';
-- 刷新权限
flush privileges;
-- 3.第三种(在Linux界面中):
-- 语法:
-- mysqladmin -u用户 -p旧密码 password 新密码;
mysqladmin -uroot -p password 123456;
mysqladmin -uroot -proot password 123456;
简介:讲解如何创建新用户与删除用户并限制ip登录
--username:你将创建的用户名
--host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
--password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
create user 'username'@'host' identified by 'password';
--1.创建一个pig用户,并指定登录密码:123456,可以在任何一台远程主机都可以登录
create user 'pig'@'%' identified by '123456';
-- 刷新权限
flush privileges;
--2.创建一个pig用户,并指定登录密码:为空,指定在120网段的机器登录
create user 'pig'@'120.%.%.%' identified by '';
-- 刷新权限
flush privileges;
-- 查询
select * from mysql.user where user='pig'\G
mysql> show grants for 'pig'@'%';
+---------------------------------+
| Grants for pig@% |
+---------------------------------+
| GRANT USAGE ON *.* TO 'pig'@'%' |
+---------------------------------+
1 row in set (0.00 sec)
USAGE:无权限的意思
mysql> show grants for 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
WITH GRANT OPTION:表示这个用户拥有grant权限,即可以对其他用户授权
-- 删除用户语法:
drop user 'username'@'host';
-- 删除pig用户的两种方式
drop user 'pig'@'%';
delete from mysql.user where user='pig';
-- 刷新权限
flush privileges;
简介:讲解如何限制用户对库表的增删改查权限
grant 权限1,权限2..... on 数据库对象 to '用户' [with grant option]
grant 权限1,权限2..... on 数据库对象 to '用户'@'host' identified by 'password' [with grant option];
all privileges:代表所有权限
*.*:代表所有库所有表
with grant option:这个选项表示该用户可以将自己拥有的权限授权给别人。
权限授权
--对现有用户进行授权:对现有用户pig授予所有库所有表所有权限。
grant all privileges on *.* to 'pig';
--对没有的用户进行授权:创建一个新用户dog授予XD库的所有权限,登录密码123456,任何一台主机登录
grant all privileges on XD.* to 'dog'@'%' identified by '123456';
--对没有的用户进行授权:创建一个新用户cat授予XD库的employee表 查与修改权限,登录密码123456,任何一台主机登录
grant select,update on XD.employee to 'cat'@'%' identified by '123456';
--对没有的用户进行授权:对用户cat授予XD库的employee表insert 权限,登录密码123456,任何一台主机登录
grant insert on XD.employee to 'cat'@'%' identified by '123456';
-- 刷新权限
flush privileges;
-- 语法:
revoke 权限1,权限2..... on 数据库对象 from '用户'@'host';
--回收pig用户的所有权限(注意:并没有回收它的登录权限)
revoke all privileges on *.* from 'pig' @ '%';
flush privileges;
--回收pig用户的所有权限(并回收它的登录权限)
delete from mysql.user where user='pig';
flush privileges;
--回收cat用户对XD库的employee的查与修改权限
revoke select,update on XD.employee from 'cat'@'%';
-- 刷新权限
flush privileges;
-- 权限列表
ALL [PRIVILEGES] -- 设置除GRANT OPTION之外的所有简单权限
ALTER -- 允许使用ALTER TABLE
ALTER ROUTINE -- 更改或取消已存储的子程序
CREATE -- 允许使用CREATE TABLE
CREATE ROUTINE -- 创建已存储的子程序
CREATE TEMPORARY TABLES -- 允许使用CREATE TEMPORARY TABLE
CREATE USER -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW -- 允许使用CREATE VIEW
DELETE -- 允许使用DELETE
DROP -- 允许使用DROP TABLE
EXECUTE -- 允许用户运行已存储的子程序
FILE -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX -- 允许使用CREATE INDEX和DROP INDEX
INSERT -- 允许使用INSERT
LOCK TABLES -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS -- 允许使用SHOW FULL PROCESSLIST
REFERENCES -- 未被实施
RELOAD -- 允许使用FLUSH
REPLICATION CLIENT -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT -- 允许使用SELECT
SHOW DATABASES -- 显示所有数据库
SHOW VIEW -- 允许使用SHOW CREATE VIEW
SHUTDOWN -- 允许使用mysqladmin shutdown
SUPER -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE -- 允许使用UPDATE
USAGE -- “无权限”的同义词
GRANT OPTION -- 允许授予权限
/* 表维护 */
-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
简介:深入详解事务
什么是事务?
数据库事务通常指对数据库进行读或写的一个操作过程。有两个目的,第一个是为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法;第二个是当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
事务的特性(ACID):
你要使用事务的话,表的引擎要为innodb引擎
简介:主要讲解事务的开启以及事务实战,深入了解什么是事务
事务的开启与提交:
create table account (
id tinyint(5) zerofill auto_increment not null comment 'id编号',
name varchar(20) default null comment '客户姓名',
money decimal(10,2) not null comment '账户金额',
primary key (id)
)engine=innodb charset=utf8;
# 关闭事务自动提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
# 开启事务自动提交
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
简介:详细讲解视图的优缺点以及应用
什么是视图?视图的作用是什么?
视图的优点是:
1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
4)不占用空间:视图是逻辑上的表,不占用内存空间
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。
1)性能差:sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,
那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。
2)修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,
对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
--创建的基本语法是:
create view <视图名称> as select 语句;
create view <视图名称> (字段) as select 语句;
--视图存在时,可以对视图进行修改;视图不存在时,可以创建视图
create or replace view <视图名称>;
--修改的语法是:
alter view <视图名称> as select 语句;
--查看视图的字段信息
desc 视图名;
describe 视图名;
--查看视图的详细信息(定义语句)
show create view 视图名;
--视图删除语法:
drop view <视图名称> ;
简介:介绍什么是触发器以及如何来创建
-- 创建单个执行语句的触发器
create trigger 触发器名称 before|after insert|update|delete
on 表名 for each row sql语句;
-- 创建有多个执行语句的触发器,不同语句用分号隔开
create trigger 触发器名称 before|after insert|update|delete
on 表名 for each row
begin
执行语句列表
end
--before/after:可以设置为事件发生前或后
--insert/update/delete:它们可以在执行insert、update或delete的过程中触发
--for each row:每隔一行执行一次动作
--查看触发器信息
--1.查看所有触发器
SHOW TRIGGERS;
--查看某个触发器,所有触发器的信息都存在 information_schema 数据库的 triggers 表中
SELECT * FROM information_schema.triggers WHERE trigger_name= '触发器名';
--删除触发器
drop trigger 触发器名称;
--创建一个员工迟到表:
create table work_time_delay(
empno int not null comment '雇员编号',
ename varchar(50) comment '雇员姓名',
status int comment '状态'
);
-- 自定义语句的结束符号
delimiter //
mysql> delimiter //
mysql>
mysql> create trigger trig_work after insert on work_time_delay
-> for each row
-> begin
-> update employee set sal=sal-100 where empno=new.empno;
-> end
-> //
Query OK, 0 rows affected (0.01 sec)
new:指的是事件发生before或者after保存的新数据
简介:介绍什么是存储过程
优点是:
1)复杂操作,调用简单
2)速度快
缺点是:
1)封装复杂
2) 没有灵活性
create procedure 名称 (参数....)
begin
过程体;
过程体;
end
参数:in|out|inout 参数名称 类型(长度)
声明变量:declare 变量名 类型(长度) default 默认值;
给变量赋值:set @变量名=值;
调用存储命令:call 名称(@变量名);
删除存储过程命令:drop procedure 名称;
查看创建的存储过程命令:show create procedure 名称\G
示例:
# 创建一个简单的存储过程:
# 自定义语句的结束符号
mysql> delimiter //
mysql> create procedure name(in n int)
-> begin
-> select * from employee limit n;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> set @n=5;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> call name(@n);
mysql> create procedure name()
-> begin
-> declare n int default 6;
-> select * from employee limit n;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call name();
简介:主要来详细介绍MyISAM与InnoDB引擎
什么是数据库存储引擎?
如何查看引擎
--如何查看数据库支持的引擎
show engines;
--查看当前数据的引擎:
show create table 表名\G
--查看当前库所有表的引擎:
show table status\G
create table yingqin (
id int,
name varchar(20)
) engine='InnoDB';--(or MyISAM)
alter table 表名 engine='MyiSAm';
# 修改默认引擎,记得保存后重启服务
vi /etc/my.cnf
[mysqld] #增加下面配置
default-storage-engine=MyIsAM
简介:讲解什么是索引,索引的优缺点,以及常见索引有哪些
索引是一个单独的,存储在磁盘中上的数据库结构,它们包含着对数据表里的所有记录的引用指针。使用索引可以快速的找出在某列或多列中有特定值的行。
通过创建唯一索引,来保证数据库表中的每一行数据的唯一性。
可以加快数据的检索速度。
可以保证表数据的完整性与准确性
索引需要占用物理空间。
对表中的数据进行改动时,索引也需要跟着动态维护,降低了数据的维护速度。
index: --普通索引
unique: --唯一索引
primary key:--主键索引
foreign key:--外键索引
fulltext: --全文索引
--组合索引
create table test (
id int(7) zerofill auto_increment not null,
username varchar(20),
servnumber varchar(30),
password varchar(20),
createtime datetime,
primary key (id)
)DEFAULT CHARSET=utf8;
#!/bin/bash
echo "请输入字段servnumber的值:"
read serber
echo "请输入创建sql语句的数量:"
read number
# char=`head /dev/urandom | tr -dc 0-9 | head -c 11`
for (( i=0;i<$number;i++ ))
do
pass=`head /dev/urandom | tr -dc a-z | head -c 8`
let serber=serber+1
echo "insert into test(id,username,servnumber,password,createtime) values('$i','user${i}','${serber}','$pass',now());" >>sql.txt
done
资料:https://blog.csdn.net/qq_41573234/article/details/80250279
简介:介绍普通索引(index)与唯一索引(unique)
普通索引(index):顾名思义就是各类索引中最为普通的索引,主要任务就是提高查询速度。
其特点是允许出现相同的索引内容,允许空(null)值
唯一索引:(unique)顾名思义就是不可以出现相同的索引内容,但是可以为空(null)值
-- 普通索引index
create table test (
id int(7) zerofill auto_increment not null,
username varchar(20),
servnumber varchar(30),
password varchar(20),
createtime datetime,
index (id)
)DEFAULT CHARSET=utf8;
-- 唯一索引unique
create table test (
id int(7) zerofill auto_increment not null,
username varchar(20),
servnumber varchar(30),
password varchar(20),
createtime datetime,
unique index (id)
-- unique index unique_id(id) //unique_id为索引名称
)DEFAULT CHARSET=utf8;
--注意:假如没有指定索引名称时,会以默认的字段名为索引名称
alter table 表名 add index 索引名称 (字段名称);
alter table test add unique unique_username (username);
create index 索引 on 表名 (字段名);
create index index_createtime on test (createtime);
-- CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
-- 索引名:指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。
-- 表名:指定要创建索引的表名。
-- 列名:指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。
-- 长度:可选参数,其指索引的长度,必须是字符串类型才可以使用。
-- ASC|DESC:可选项。ASC指定索引按照升序来排列,DESC指定索引按照降序来排列,默认为ASC
show index from 表名\G
show index from test\G
drop index 索引名称 on 表名;
drop index unique_username on test;
alter table 表名 drop index 索引名;
alter table test drop index createtime;
简介:详细讲解主键索引
把主键添加索引就是主键索引,它是一种特殊的唯一索引,不允许有空值,而唯一索引(unique是允许为空值的)。
指定为“PRIMARY KEY”
主键:主键是表的某一列,这一列的值是用来标志表中的每一行数据的。
注意:每一张表只能拥有一个主键
1)创建表的时候创建
create table test (
id int(7) primary key auto_increment,-- 创建索引方式一
username varchar(20),
password varchar(20)
-- PRIMARY KEY (`rcd_id`) 创建索引方式二
)DEFAULT CHARSET=utf8;
2)直接为表添加主键索引
alter table 表名 add primary key (字段名);
alter table test add primary key (id);
alter table 表名 drop primary key;
alter table test drop primary key;
--注意:在有自增的情况下,必须先删除自增,才可以删除主键
--删除自增:
alter table test change id id int(7) unsigned zerofill not null;
简介:介绍什么是全文索引以及使用
全文索引是将存储在数据库中的文章或者句子等任意内容信息查找出来的索引,单位是词。
全文索引也是目前搜索引擎使用的一种关键技术。指定为 fulltex
-- 建表
create table command (
id int(5) unsigned primary key auto_increment,
name varchar(10),
instruction varchar(60)
)engine=MyISAM;
-- 数据插入
insert into command values('1','ls','list directory contents');
insert into command values('2','wc','print newline, word, and byte counts for each file');
insert into command values('3','cut','remove sections from each line of files');
insert into command values('4','sort','sort lines of text files');
insert into command values('5','find','search for files in a directory hierarchy');
insert into command values('6','cp','复制文件或者文件夹');
insert into command values('7','top','display Linux processes');
insert into command values('8','mv','修改文件名,移动');
insert into command values('9','停止词','is,not,me,yes,no ...');
-- 创建表的时候创建全文索引,索引名称为command_instruction
create table command (
id int(5) unsigned primary key auto_increment,
name varchar(10),
instruction varchar(60),
fulltext key command_instruction(instruction)
)engine=MyISAM;
-- 直接为表添加全文索引
alter table command add fulltext(instruction);
select * from 表名 where match (字段名) against ('检索内容');
select * from command where match(instruction) against ('sections');
select * from command where match(instruction) against ('directory');
in boolean mode:意思是指定全文检索模式为布尔全文检索(简单可以理解为是检索方式)
select * from 表名 where match (字段名) against ('检索内容' in boolean mode);
alter table command drop index instruction;
简介:解析什么是外键约束,以及有什么作用
外键就是作用于两个表数据之间的链接的一列或多列,用来保证表与表之间的数据的完整性和准确性。
语法:foreign key (字段名) references 关联的表名(关联表的字段名)
注意:主键跟外键的字段类型一定要相同
-- 1、create table的方法:
CREATE TABLE `employee` (
`empno` int(11) NOT NULL COMMENT '雇员编号',
`ename` varchar(50) DEFAULT NULL COMMENT '雇员姓名',
`job` varchar(30) DEFAULT NULL,
`mgr` int(11) DEFAULT NULL COMMENT '雇员上级编号',
`hiredate` date DEFAULT NULL COMMENT '雇佣日期',
`sal` decimal(7,2) DEFAULT NULL COMMENT '薪资',
`deptnu` int(11) DEFAULT NULL COMMENT '部门编号',
PRIMARY KEY (`empno`),
foreign key (`deptnu`) references dept(deptnu)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2、alter table的方法:
alter table employee add foreign key (deptnu) references dept(deptnu);
mysql> alter table employee drop index deptnu;
ERROR 1553 (HY000): Cannot drop index 'deptnu': needed in a foreign key constraint
mysql>
mysql> alter table employee drop foreign key employee_ibfk_1;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql> alter table employee drop index deptnu;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
简介:详细介绍联合索引
什么是联合索引:联合索引又称组合索引或者复合索引,是建立在俩列或者多列以上的索引。
创建和删除联合索引
-- 建表时创建索引
create table test (
id int(7) primary key auto_increment not null,
username varchar(20),
servnumber varchar(30),
password varchar(20),
createtime datetime,
index (username,servnumber,password)
)DEFAULT CHARSET=utf8;
-- 增加表联合索引
alter table 表名 add index(字段1,字段2,字段3);
alter table test add index(username,servnumber,password);
-- 删除联合索引
alter table test drop index username;
为什么要使用联合索引,而不使用多个单列索引?:联合索引的效率远远高于单列索引
联合索引的最左原则:只有查询条件中使用了这些字段中第一个字段(即username),索引才会被使用。
注意点总结:
简介:介绍如何开启慢查询日志与问题定位
mysql> show variables like 'slow%';
+---------------------+--------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------+
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mydata/xdclass-public-slow.log |
+---------------------+--------------------------------------+
set global slow_query_log = on;
--日志路径也可以自定义:
set global slow_query_log_file = '路径';
mysql> show variables like '%long%';
mysql>
+----------------------------------------------------------+-----------+
| Variable_name | Value |
+----------------------------------------------------------+-----------+
| long_query_time | 10.000000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_waits_history_long_size | 10000 |
+----------------------------------------------------------+-----------+
set long_query_time=0.4;
修改配置文件 vi /etc/my.cnf
[mysqld]
slow_query_log = 1
long_query_time = 0.1
slow_query_log_file =/usr/local/mysql/mysql_slow.log
最后必须重启服务才能生效!
简介:介绍如何开启性能详情
mysql> show variables like '%profiling%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| have_profiling | YES |
| profiling | OFF |
| profiling_history_size | 15 |
+------------------------+-------+
set profiling = on ;
mysql> show profiles;
+----------+------------+---------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------------------------+
| 1 | 0.00177775 | show variables like '%profiling%' |
| 2 | 0.00037900 | select * from test where id='087878' |
| 3 | 0.34618025 | select * from test where servnumber='1367008787' |
| 4 | 0.31986825 | select * from test where servnumber='13670087879' |
+----------+------------+---------------------------------------------------+
mysql> show profile for query 4;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000100 |
| checking permissions | 0.000010 |
| Opening tables | 0.000023 |
| init | 0.000045 |
| System lock | 0.000015 |
| optimizing | 0.000016 |
| statistics | 0.000028 |
| preparing | 0.000020 |
| executing | 0.000006 |
| Sending data | 0.319489 |
| end | 0.000037 |
| query end | 0.000012 |
| closing tables | 0.000012 |
| freeing items | 0.000040 |
| cleaning up | 0.000017 |
+----------------------+----------+
性能线程的详细解释官方文档链接:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html
简介:介绍日常工作应该尽量避免的sql语句
mysql> explain select * from test where servnumber like '%1367000%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 996303
filtered: 11.11
Extra: Using where
简介:数据库备份的意义
数据备份的意义
数据库的备份类型:
数据库备份的方式:
区别:
数据库备份的场景:
简介:如何利用mysql自带命令mysqldump来备份单库或者多库
mysqldump -u用户名 -p密码 dbname table > 路径/xxx.sql
mysqldump -u用户名 -p密码 --databases dbname1 dbname2 > xxx.sql
-- 常见选项:
-u: 用户名
-p: 密码
-P: 端口号,不写默认3306
--host,-h:服务器IP地址,不写默认本地localhost
--all-databases, -A:备份所有数据库
--databases, -B: 用于备份多个数据库。如果没有该选项,mysqldump把第一个名字参数作为数据库名,后面的作为表名。使用该选项,mysqldum把每个名字都当作为数据库名。
--no-data, -d:不导出任何数据,只导出数据库表结构。
--no-create-info, -t:只导出数据库的数据,而不添加CREATE TABLE 语句
--no-create-db, -n:只导出数据库的数据,而不添加CREATE DATABASE 语句
--quick, -q:快速导出
--xml, -X:导出为xml文件
# 1. 备份全部数据库的数据和结构(-A)
mysqldump -uroot -p123456 -A > 0101.sql
# 2. 备份全部数据库的结构(-d)
mysqldump -uroot -p123456 -A -d > 0102.sql
# 3. 备份全部数据库的数据(-t)(-n)
mysqldump -uroot -p123456 -A -t > 0103.sql
mysqldump -uroot -p123456 -A -n > 0113.sql
# 4. 备份单个数据库的数据和结构(dnname 为数据库名)
mysqldump -uroot -p123456 dnname > 0104.sql
# 5. 备份单个数据库结构(dbname 为数据库名,-d)
mysqldump -uroot -p123456 dbname -d > 0105.sql
# 6. 备份单个数据库数据(sakila 为数据库名,-t)
mysqldump -uroot -p123456 sakila -t > 0106.sql
# 7. 备份多个表的结构和数据 (table1,table2为表名)
mysqldump -uroot -p123456 dbname table1 table2 > 0107.sql
# 8. 一次备份多个数据库
mysqldump -uroot -p123456 --databases db1 db2 > 0108.sql
# 数据恢复方式一:
# Linux系统命令行:1.先建库 2.导入数据
mysqladmin -uroot -p123456 create db_name
mysql -uroot -p123456 db_name < d:\bak\0101.sql
注:在导入备份数据库前,db_name如果没有,是需要创建的;
而且与backup20110527.sql中数据库名是一样的才可以导入。
# 数据恢复方式二:将导出的本地文件导入到指定数据库
# 2. soure 方法:
mysql > use db
mysql > source d:\bak\0101.sql
# 1.远程备份单库:
mysqldump -uroot -p123456 -h120.25.93.69 zabbix | gzip > /mysql_data_back/zabbix_users.sql.gz
# 2.远程备份单库并保留创建库语句:
mysqldump -uroot -p123456 -h120.25.93.69 --databases zabbix | gzip > /mysql_data_back/zabbix_bak.sql.gz
# 3.远程备份单库单表:
mysqldump -uroot -p123456 -h120.25.93.69 zabbix users | gzip > /mysql_data_back/zabbix_users.sql.gz
# 4.远程备份多库:
mysqldump -uroot -p123456 -h120.25.93.69 --databases zabbix XD | gzip > /mysql_data_back/zabbix_XD.sql.gz
# 5.远程备份整库:
mysqldump -uroot -p123456 -h120.25.93.69 --all-databases | gzip > /mysql_data_back/all.sql.gz
# 远程恢复数据(备份的数据文件里有创建库的语句):
mysql -uroot -p123456 -h120.25.93.69 < zabbix_bak.sql
# 远程恢复数据(备份的数据文件里没有创建库的语句):
mysql -uroot -p123456 -h120.25.93.69 zabbix < zabbix_bak.sql
简介:详解数据库源文件以及如何物理备份
# 方式一:mysql内查询
mysql> show variables like 'datadir%';
+---------------+---------------+
| Variable_name | Value |
+---------------+---------------+
| datadir | /data/mydata/ |
+---------------+---------------+
# 方式二:配置文件查询
cat /etc/my.cnf
└── data
└── dbname
├── db.opt -- 创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则
└── table_name
├── .frm --记录着表结构信息的文件
├── .MYI --记录着索引的文件
└── .MYD --记录着表的数据
db.opt:创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则
.frm :记录着表结构信息的文件
.MYI:记录着索引的文件
.MYD:记录着表的数据
└── data
├── ibdata1 -- 共享表空间,里边记录表的数据和索引
└── dbname
├── db.opt -- 创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则
└── table_name
├── .frm --记录着表结构信息的文件
└── .ibd --独立表空间,里边记录这个表的数据和索引
db.opt:创建库的时候生成,主要存储着当前库的默认字符集和字符校验规则
.frm :记录着表结构信息的文件
.ibd :独立表空间,里边记录这个表的数据和索引
ibdata1:共享表空间,里边记录表的数据和索引
1.包含InnoDB表的库:
1.1.直接拷贝/data下的数据库名目录
2.2.拷贝/data 目录下三个文件
-ib_logfile0:事务日志
-ib_logfile1:事务日志
-ibdata1 :共享表空间
2.包含MyISAM表的库
2.1.直接拷贝/data下的数据库目录即可
# 备份dbname数据库时该数据库正在写入数据会显示报错
tar -czvf dbname.tar.gz dbname/
# 如果有数据写入时会报错,所以我们开源开启读锁
# 请求全局读锁
flush tables with read lock;
# 解锁
unlock tables;
简介:讲解如何利用二进制日志来备份数据
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
# 修改my.cnf配置文件
vi /etc/my.cnf
# 加入log-bin配置
[mysqld]
# 开启二进制日志log-bin
log-bin=/data/mydata/log_bin/mysql-bin
server-id=1
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 23638 |
+------------------+-----------+
# 重置(清空)二进制日志文件
mysql> flush logs;
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 23638 |
| mysql-bin.000002 | 1091 |
+------------------+-----------+
mysqldump -uroot -p test user -F > test_bak.sql
简介:讲解如何利用二进制日志来恢复数据
$ mysqlbinlog mysql-bin.000002
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'
# 第一种:在mysqlbinlog 后边加上 --no-defaults
$ mysqlbinlog --no-defaults mysql-bin.000002
# 第二种:注释掉配置文件里边的:default-character-set=utf8
# 第一种:在mysqlbinlog 后边加上 --no-defaults
$ mysqlbinlog --no-defaults --base64-output=DECODE-ROWS -v mysql-bin.000002 > mysqlbin.sql
# 第二种:先注释掉配置文件里边的:default-character-set=utf8,在执行下命令
$ mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000002 > mysqlbin.sql
# 1.找出关键字的行数:
$ mysqlbinlog --no-defaults mysql-bin.000002 | cat -n | grep -iw 'drop'
4180 DROP TABLE `user` /* generated by server */
# 2.打印出相关内容:
$ mysqlbinlog --no-defaults mysql-bin.000002 | cat -n | sed -n '4170,4180p'
4170 # at 59578
4171 #190419 0:41:48 server id 1 end_log_pos 59609 CRC32 0x36cda2b7 Xid = 6380
4172 COMMIT/*!*/;
4173 # at 59609
4174 #190419 0:41:48 server id 1 end_log_pos 59674 CRC32 0x8de2f06a Anonymous_GTID last_committed=145 sequence_number=146
4175 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
4176 # at 59674
4177 #190419 0:41:48 server id 1 end_log_pos 59787 CRC32 0x6b2edd2b Query thread_id=14 exec_time=0 error_code=0
4178 use `XD`/*!*/;
4179 SET TIMESTAMP=1555605708/*!*/;
4180 DROP TABLE `user` /* generated by server */
恢复数据:
$ mysqlbinlog --no-defaults --set-charset=utf8 --stop-position="59674" /data/mydata/log_bin/mysql-bin.000002 | mysql -uroot -p