windows安装:
安装选项: 多功能数据库(innodb,myisam都友好)
事务数据库(innodb友好,myisam也支持) 非事务数据库(不能用innodb)
启动关闭 net start/stop mysql
Linux启动和关闭: servie mysql stop
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | 存储数据库对象信息,用户表、列、权限、字符集、分区信息
| mysql | 存储了用户权限信息
| performance_schema |
| test | 测试数据库,任何用户都可以使用
| test1 |
+--------------------+
DDL语句: --一般管理员用的多,开发用的少
create table emp(
enname varchar(10),
hiredate date,
sal decimal(10,2),
deptno int(2));
desc emp;
show create table emp;
对表操作
修改类型: alter table emp modify enname varchar(20);
增加表字段: alter table emp add column age int(3);
删除表字段: alter table emp drop column age;
字段改名: alter table emp change sal sal1 decimal(10,3);
change和modify都可以修改表定义,change需要写2次列名,不方便,但是可以改列名称。modify不能。
修改字段排列顺序:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| enname | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
新增字段birth date 在hiredate之后:
alter table emp add birth date after hiredate;
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| enname | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| birth | date | YES | | NULL | |
修改字段 sql,放在最前
alter table emp modify birth date first; --或者after hiredate
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| birth | date | YES | | NULL | |
| enname | varchar(20) | YES | | NULL | |
更改表名
alter table emp rename emp1;
DML语句:
插入:
mysql> desc emp;
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| birth | date | YES | | NULL | |
| enname | varchar(20) | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+--------+---------------+------+-----+---------+-------+
#10位数字,末尾2位是小数,
全插:insert into emp(birth,enname,sal,deptno) values('2020-01-19','xixi',300.10,2);
全插省略:insert into emp values('2020-01-19','xixi',300.10,2);
一次性插入多条语句,注意逗号:
insert into emp values
('2020-01-19','xixi2',300.10,2),
('2020-01-19','xixi3',300.10,2),
('2020-01-19','xixi4',300.10,2);
部分插入有空格:
部分插入: insert into emp (birth,enname) values('2020-01-19','xixi');
更新语句:
update emp set sal=300.20 where enname='xixi4';
更新多个表字段:
mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 12 | hehe |
| 12 | haha |
+--------+----------+
2 rows in set (0.00 sec)
mysql> select * from emp limit 2;
+------------+--------+--------+--------+
| birth | enname | sal | deptno |
+------------+--------+--------+--------+
| 2020-01-19 | haha | 300.10 | 2 |
| 2020-01-19 | xixi | NULL | NULL |
+------------+--------+--------+--------+
update emp e,dept d set e.sal=e.sal*d.deptno,d.deptno=1 where d.deptname=e.enname;
删除记录:
delete from emp where enname='xixi4';
多表删除
delete emp e,dept d where d.deptname=e.enname and e.sal=100;
查询语句:
select * from emp where enname='haha' and deptno !=2;
select * from emp order by enname desc;
select enname,count(*) from emp group by enname;
select enname,count(*) from emp where sal>100 group by enname;
表连接:
内连接:选出互相匹配的记录
外连接:选出不同的记录
左连接: 左边所有加右边没有的空
右连接: 右边所有加左边没有
左右连接可以相互转化。
子查询:需要的条件是另外一个select的结果。 关键字 in、not in、=、!=、exists、not exists。
select * from emp where enname in(select deptname from dept);
联合查询:
mysql> select enname from emp union select deptname from dept;
+--------+
| enname |
+--------+
| haha |
| xixi |
| hehe |
+--------+
mysql> select enname from emp union all select deptname from dept;
+--------+
| enname |
+--------+
| haha |
| xixi |
| haha |
| haha |
| hehe |
| haha |
+--------+
DCL语句
DCl 语句主要书DBA用来管理系统中的对象权限使用
创建一个用户xixi,具有对test库中所有表查询的权限。
grant select,insert on test.* to 'xixi'@'localhost' identified by '123';
帮助命令 ?命令 eg: ? show;
查询元数据信息:
业务需求: 删除test1库下面所有前缀未tmp的表;
test1下的存储引起myisam 改为innodb;
表名、列名、列类型、索引名信息均存在information_schema 里面
int=integer
定点类型 dec(10,2)
create table t1(id1 int,id2 int(5));
insert into t1(1,1);
不足补0:
alter table t1 modify id1 int zerofill;
mysql> select * from t1;
+------------+------+
| id1 | id2 |
+------------+------+
| 0000000001 | 1 |
+------------+------+
alter table t1 modify id2 int(5) zerofill;
超出宽度也不怕:
mysql> select * from t1;
+------------+-------+
| id1 | id2 |
+------------+-------+
| 0000000001 | 00001 |
+------------+-------+
mysql> insert into t1 values(222,1234567);
mysql> select * from t1;
+------------+---------+
| id1 | id2 |
+------------+---------+
| 0000000001 | 00001 |
| 0000000222 | 1234567 |
时间类型:
mysql> create table t (d date,t time,dt datetime);
mysql> desc t;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d | date | YES | | NULL | |
| t | time | YES | | NULL | |
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
mysql> insert into t values(now(),now(),now());
mysql> select * from t;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2020-01-20 | 03:52:19 | 2020-01-20 03:52:19 |
+------------+----------+---------------------+
--datetime是date和time的组合
算术运算符
比较运算符
逻辑运算符
mysql> select not 0,not 1,not null;
+-------+-------+----------+
| not 0 | not 1 | not null |
+-------+-------+----------+
| 1 | 0 | NULL |
+-------+-------+----------+
1、字符串函数
2、数值函数 abs()
mysql> select abs(-3);
+---------+
| abs(-3) |
+---------+
| 3 |
+---------+
3、日期和时间函数
select curdate(); 当前日期
select curtime();
select now();
4、流程函数
if ifnull(判断null值函数),case when
create table salary (userid int,salary decimal(9,2));
insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);
select * from salary;
月薪高于2000属于高薪,2000一下低薪
select if(salary>2000,'high','low') from salary;
null值用0替换
select ifnull(salary,0) from salary;
select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
select database();
select version();
select user();
select inet_ntoa(3232235777); 换算ip地址
ip地址比较: inet_aton函数
show engines \G;
show variables like 'have%';
修改表存储引擎: alter table t engine=myisam;
1、myisam 不支持事务,外键 访问速度快,读和插入操作为主,很少的更新删除。
.frm 存储表定义
.myd 存储数据
.myi 存储索引 --数据文件和索引文件可以放在不通的目录,平均io,获得更快速度。
2、innodb 事务
设置自动增长 alter table xixi auto_increment = n;
3、memory 快,大小限制
内存中建表 对应一个磁盘文件 .frm
第三方存储引擎
选择合适数据类型
char 与varcha
较大文本选择text或者blob
mysql的字符集和校对规则: 服务器级,数据库级,表,和字段
服务器可以在my.cnf 设置,获取启动选项中指定
查看:show variables like 'character_set_database';
查看表: show create table xixi \G;
character_set_client,character_set_connection,character_set_results.
客户端、连接和返回结果的字符集。
设置方式有2种
1、 set names ***;
2、 [mysql]
default-character-set=gbk;
改表字符集 视图 触发器:只能建立在永久表上。 事务控制语句和锁定语句 sql安全,sql注入 :绑定变量,应用程序转行函数。 第三部分 优化篇 第四部分 管理维护篇 mysql的复制: 将主数据库的ddl和dml操作通过(二进制文件)到从库上,从库对日志重新执行,重做 更新不频繁或者实时性要求不高从库查询,实时性高的主库查询。 原理: 1、主库提交事务把数据变更作为事件event记录在二进制文件的binlog,主库的sync_binlog参数控制binlog日志刷新到磁盘。 2、主库推送的二进制日志文件binlog中的事件到从库的中继日志relay log,之后从库应用日志,实现逻辑复制 3、涉及3个线程。 主库的binlog dump线程,从库的i/o线程和sql线程。 从库启动复制,创建i/o线程连接主库,主库创建binlog dump线程读取数据库事件发送改i/o线程,i/o线程然后更新到从库的中继日志rela log,从库的sql线程读取中继日志更新到数据库事件并应有。 主库: show processlist\G 查看binlog dump线程。 从库: show processlist\G 查看io和sql线程。 --异步,存在一定延时 涉及2种重要文件: 二进制日志文件(3种记录方式)和中继日志文件。 查看是否开启:show variables like '%log_bin'; 查看哪种方式记录:show variables like '%binlog_format%'; 查看所有二进制:show binary/master logs; 查看当前使用:show master status; 中继日志:和二进制一样,区别是sql执行后会删除。 http://www.zsythink.net/archives/1286 从库会创建master.info和relay-log.info保持复制进度,记录从库io线程读取主库binlog的进度和应用日志的进度。 一主多从 mysql库只应用和自己server id不同的应用日志(binlog中记录了server id),双主不会循环利用 半同步复制,解决主库可能宕机,事务流失的可能。 主库锁表: flush tables with read lock; unlock tabls; mmm master-master-manager 双主切换和管理的脚本程序,但同意时刻只能对一个主写操作, mha 高可用方案,30s内切换,数据几乎不丢失。 --类似领导监控,出问题就换master
1、mysqldump --default-character-set=gbk -d>xixi.sql 只导出表结构,修改语句,新字符集
2、mysqldump导出所有记录 >data.sql 修改data.sql里面的数据
3、建库,设置字符
create database databasename default charset utf8;
4、创建表,执行xixi.sql
mysql -uroot -p databasenaeme
mysql -uroot -p databasename 索引的设计和使用
索引用于快速找出某个列种有一特定值的行,索引避免磁盘搜索。
视图,虚拟的表
show views;
存储过程:sql语句集合,光标,流程控制
lock table 和unlock table
mysql分区:把一个表分为更小部分。逻辑一个表,10个物理分区组成。第五部分 架构篇
集群
高可用架构