Mysql 基础知识(详细)

 

 

目录

DBA之禅

0、SQL概要

1、环境配置

2、登陆

3、建库建表

如何选择 MySQL 存储引擎

4、简单查询

5、聚合、分组查询

6、数据更新

7、视图

8、函数,谓词,case表达式

9、联结表、组合查询

10、全文本搜素

11、存储过程

12、容灾备份

13、mysql日志

 


DBA之禅

一名合格的DBA所应遵循的四个生存守则(转) 
 1.备份重于一切 
我们必需知道,系统总是要崩溃的,没有有效的备份只是等哪一天死!我经常开玩笑的说,唯一会使DBA在梦中惊醒的就是,没有有效的备份. 
2.三思而后行 
任何时候都要清楚你所做的一切,否则宁可不做!有时候一个回车,一条命令就会造成不可恢复的灾难,所以,你必需清楚确认你所做的一切,并且在必要时保护现场. 
3.rm是危险的 
要知道在UNIX/Linux下,这个操作意味着你可能将永远失去后面的东西,所以,确认你的操作!!! 
太多的人在 "rm -rf" 上悲痛欲绝,当年写下这条守则时,是一个凌晨被一个朋友吵醒,他说误操作rm -rf删除掉了200G的数据库,并且没有备份. 
我当时能告诉他的只有一句话:要保持冷静
4.你来制定规范 
良好的规范是减少故障的基础。所以,做为一个DBA,你需要来制订规范,规范开发甚至系统人员,这样甚至可以规避有意或是无意的误操作.减少数据库的风险. 
我们知道,在管理良好的数据库服务器上,rm -rf甚至可能是不允许使用的. 
也许我们需要遵守的可能更多,所以我一直强调DBA一定要严谨专注,当然我也非常喜欢另外一句话:坚韧卓绝之人,必能成就万事。
 

0、SQL概要

数据定义语言(Data Definition Language,DDL)   CAD;  create、alter、drop
数据操作语言(Data Manipulation Language,DML) DUSI; delete、update、select、insert  --commit
数据控制语言(Data Control Language,DCL)      CRGR; commit、rollback、grant、revoke(取消赋权)

 

1、环境配置

--系统环境,阿里云主机
[root@oracle /]# cat /etc/redhat-release 
CentOS release 6.9 (Final)

--查看是否安装
yum list installed | grep mysql

--安装mysql
yum install mysql mysql-server mysql-devel -y

--安装后,查看安装信息
rpm -qi mysql-server

--启动停止,重启
service mysqld start/stop/restart

--开机重启
chkconfig mysqld on

--Linux下面mysql 清屏
system clear;

--mysql变量分为系统变量(环境属性)与状态变量(运行中属性)
--查看版本相关属性
show global variables like'%version%' \G;
--查看字符设置
show global variables where variable_name like 'character%';
--查看日志是否开启
mysql> show global variables where variable_name like '%log%' and value='off';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_direct_non_transactional_updates | OFF   |
| binlog_rows_query_log_events            | OFF   |
| general_log                             | OFF   |
| innodb_api_enable_binlog                | OFF   |
| innodb_locks_unsafe_for_binlog          | OFF   |
| innodb_undo_log_truncate                | OFF   |
| log_bin                                 | OFF   |
| log_bin_trust_function_creators         | OFF   |
| log_bin_use_v1_row_events               | OFF   |
| log_builtin_as_identified_by_password   | OFF   |
| log_queries_not_using_indexes           | OFF   |
| log_slave_updates                       | OFF   |
| log_slow_admin_statements               | OFF   |
| log_slow_slave_statements               | OFF   |
| log_syslog                              | OFF   |
| relay_log_recovery                      | OFF   |
| slow_query_log                          | OFF   |
| sql_log_off                             | OFF   |
+-----------------------------------------+-------+

--发下mysql Linux不好安装,安装5.7地址
http://www.mamicode.com/info-detail-1166036.html
查看初始密码:grep 'temporary password'  /var/log/mysqld.log 

2、登陆

--本地登陆
mysql -uroot -proot

--远程登陆,需要有远程登陆权限
mysql -uroot -h127.0.0.1 -P 3306 -proot

3、建库建表

---编码
MySQL服务器可以支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集,相比oracle等其他数据库管理系统,在同一个数据库只能使用相同的字符集,MySQL明显存在更大的灵活性。

character set可以简写为char set和charset
建表  engine=innodb default charset=utf8;

建库 create database dbking charset=utf8;
show create database db_name;命令查看数据库创建语句:


查看当前数据库的字符集
mysql> show variables like 'character%';

名词解释:

    character_set_client:客户端请求数据的字符集
    character_set_connection:客户机/服务器连接的字符集
    character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
    character_set_filesystem:把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
    character_set_results:结果集,返回给客户端的字符集
    character_set_server:数据库服务器的默认字符集
    character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。


查看当前数据库的校对规则
mysql> show variables like 'collation%';

名词解释:
collation_connection 当前连接的字符集。
collation_database    当前日期的默认校对。每次用USE语句来“跳转”到另一个数据库的时候,这个变量的值就会改变。如果没有当前数据库,这个变量的值就是collation_server变量的值。
collation_server 服务器的默认校对。

创建对象的默认值
字符集合校对规则有4个级别的默认设置:

1)服务器级别;
2)数据库级别;
3)表级别、列级别;
4)连接级别。
更低级别的设置会集成高级别的设置。
这里有一个通用的规则:先为服务器或者数据库选择一个合理的字符集,然后根据不同的实际情况,让某个列选择自己的字符集。


附送几个数据库中文编码的经验教训:
1. 基于可维护的角度,虽然latin1没什么问题,但是还是尽量换成utf8或者gb系列
2. 出现乱码时:
SHOW VARIABLES LIKE 'character%'
SHOW VARIABLES LIKE 'collation_%';
a、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
b、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;
c、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
d、要保证程序编码与浏览器、终端编码一致
3. 要想简单一点的话,就将各个字符集都设为一致的,写入mysql的配置文件,每次用客户端都设置一下字符集(set names 'xxx'),写入和读取时要记得确保字节流的编码是ok的


----------------------------------------------------------------------------------------
--查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

--查看编码
show variables like '%character%';

--创建数据库
create database shop;
判断原来不存在,则创建数据库,并指定编码格式和校验集:
create database if not exists hehe default character set utf8 collate utf8_general_ci;

--使用数据库
use shop;

--查看表
show tables;

mysql> use shop;
Database changed
mysql> show tables;
Empty set (0.00 sec)

--创建表
drop table if exists shohin;
create table shohin
(
shohin_id char(4) primary key not null,
shohin_name varchar(100) not null,
shohin_leibie varchar(32),
shohin_number integer,
shohin_price integer,  
shohin_time date
)engine=InnoDB default charset=utf8;

--删除表
drop table shohin;

--描述表
desc shohin

--增加一栏/删除一栏
alter table shohin add column shohin_add int;
alter table shohin drop column shohin_add int;

mysql> desc shohin;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_name   | varchar(100) | NO   |     | NULL    |       |
| shohin_leibie | varchar(32)  | YES  |     | NULL    |       |
| shohin_number | int(11)      | YES  |     | NULL    |       |
| shohin_price  | int(11)      | YES  |     | NULL    |       |
| shohin_time   | date         | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> alter table shohin add column shohin_add int;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc shohin;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_name   | varchar(100) | NO   |     | NULL    |       |
| shohin_leibie | varchar(32)  | YES  |     | NULL    |       |
| shohin_number | int(11)      | YES  |     | NULL    |       |
| shohin_price  | int(11)      | YES  |     | NULL    |       |
| shohin_time   | date         | YES  |     | NULL    |       |
| shohin_add    | int(11)      | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

--查看建表语句
show create table shohin;

 --插入数据 start transaction或begin语句可以开始一项新的事务。commit可以提交当前事务,是变更成为永久变更。

start transaction;
insert into shohin values
('0001','T恤','衣服',1000,500,'2009-09-20'),
('0002','打孔器','办公用品',500,320,'2009-09-11'),
('0003','运动T恤','衣服',4000,2800,NULL),
('0004','菜刀','厨房用具',3000,2800,'2009-09-20'),
('0005','高压锅','厨房用具',6800,5000,'2009-01-15'),
('0006','叉子','厨房用具',500,NULL,'2009-09-20'),
('0007','擦菜板','厨房用具',880,790,'2008-04-28'),
('0008','圆珠笔','办公用品',100,NULL,'2009-11-11');
commit;

--重命名表
alter table shohin rename to xixi;

如何选择 MySQL 存储引擎

不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。
 

功能MylSAMMEMORYInnoDBArchive
存储限制256TBRAM64TBNone
支持事务NoNoYesNo
支持全文索引YesNoNoNo
支持树索引YesYesYesNo
支持哈希索引NoYesNoNo
支持数据缓存NoN/AYesNo
支持外键NoNoYesNo

可以根据以下的原则来选择 MySQL 存储引擎:

  • 如果要提供提交、回滚和恢复的事务安全(ACID 兼容)能力,并要求实现并发控制,InnoDB 是一个很好的选择。
  • 如果数据表主要用来插入和查询记录,则 MyISAM 引擎提供较高的处理效率。
  • 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果。
  • 如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。

4、简单查询

--表数据
mysql> desc xixi;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_name   | varchar(100) | NO   |     | NULL    |       |
| shohin_leibie | varchar(32)  | YES  |     | NULL    |       |
| shohin_number | int(11)      | YES  |     | NULL    |       |
| shohin_price  | int(11)      | YES  |     | NULL    |       |
| shohin_time   | date         | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

mysql> select * from xixi;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤        | 衣服        |          1000 |          500 | 2009-09-20  |
| 0002      | 打孔器   | 办公用品  |           500 |          320 | 2009-09-11  |
| 0003      | 运动T恤  | 衣服        |          4000 |         2800 | NULL        |
| 0004      | 菜刀      | 厨房用具  |          3000 |         2800 | 2009-09-20  |
| 0005      | 高压锅   | 厨房用具  |          6800 |         5000 | 2009-01-15  |
| 0006      | 叉子      | 厨房用具  |           500 |         NULL | 2009-09-20  |
| 0007      | 擦菜板   | 厨房用具  |           880 |          790 | 2008-04-28  |
| 0008      | 圆珠笔   | 办公用品  |           100 |         NULL | 2009-11-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

--限制条数
ysql> select * from xixi limit 2;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤         | 衣服          |          1600 |          500 | 2009-09-20  |
| 0002      | 打孔器      | 办公用品      |           500 |          320 | 2009-09-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

mysql> select * from xixi limit 2,2;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0003      | 运动T恤     | 衣服          |          4000 |         2800 | NULL        |
| 0004      | 菜刀        | 厨房用具      |          3000 |         2800 | 2009-09-20  |
+-----------+-------------+---------------+---------------+--------------+-------------+


--查询名字
select shohin_name from xixi;
select shohin_name as shangping_name from xixi;

--常数查询
select '666' as test,66 as test1,shohin_name from xixi;

--不要重复的,distinct
mysql> select shohin_leibie, shohin_name from xixi;
+---------------+-------------+
| shohin_leibie | shohin_name |
+---------------+-------------+
| 衣服        | T恤        |
| 办公用品  | 打孔器   |
| 衣服        | 运动T恤  |
| 厨房用具  | 菜刀      |
| 厨房用具  | 高压锅   |
| 厨房用具  | 叉子      |
| 厨房用具  | 擦菜板   |
| 办公用品  | 圆珠笔   |
+---------------+-------------+

--在多个列之前使用,此时会将多个列的数据进行组合,将重复的数据结合为一条
mysql> select distinct shohin_leibie, shohin_name from xixi;
+---------------+-------------+
| shohin_leibie | shohin_name |
+---------------+-------------+
| 衣服        | T恤        |
| 办公用品  | 打孔器   |
| 衣服        | 运动T恤  |
| 厨房用具  | 菜刀      |
| 厨房用具  | 高压锅   |
| 厨房用具  | 叉子      |
| 厨房用具  | 擦菜板   |
| 办公用品  | 圆珠笔   |
+---------------+-------------+

mysql> select distinct shohin_leibie from xixi;
+---------------+
| shohin_leibie |
+---------------+
| 衣服        |
| 办公用品  |
| 厨房用具  |
+---------------+


--where语句
mysql> select shohin_name from xixi where shohin_price >=5000;
+-------------+
| shohin_name |
+-------------+
| 高压锅   |
+-------------+

--between语句
mysql> select * from xixi where shohin_number between 100 and 500;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0002      | 打孔器      | 办公用品      |           500 |          320 | 2009-09-11  |
| 0006      | 叉子        | 厨房用具      |           500 |         NULL | 2009-09-20  |
| 0008      | 圆珠笔      | 办公用品      |           100 |         NULL | 2009-11-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+


--不含from查询语句
mysql> select (1+2) as haha;
+------+
| haha |
+------+
|    3 |
+------+

--时间大小比较
mysql> select * from xixi where shohin_time < '2009-09-20' limit 1;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0002      | 打孔器   | 办公用品  |           500 |          320 | 2009-09-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

--多添加查询
mysql> select * from xixi where shohin_leibie='厨房用具';
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0004      | 菜刀      | 厨房用具  |          3000 |         2800 | 2009-09-20  |
| 0005      | 高压锅   | 厨房用具  |          6800 |         5000 | 2009-01-15  |
| 0006      | 叉子      | 厨房用具  |           500 |         NULL | 2009-09-20  |
| 0007      | 擦菜板   | 厨房用具  |           880 |          790 | 2008-04-28  |
+-----------+-------------+---------------+---------------+--------------+-------------+

--当与NULL进行逻辑运算时,其结果为不确定。
mysql> select * from xixi where shohin_leibie='厨房用具' and (shohin_price=null or shohin_time='2008-04-28');
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0007      | 擦菜板   | 厨房用具  |           880 |          790 | 2008-04-28  |
+-----------+-------------+---------------+---------------+--------------+-------------+

mysql> select * from xixi where shohin_leibie='厨房用具' and (shohin_price='2800' or shohin_time='2009-09-20');
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0004      | 菜刀      | 厨房用具  |          3000 |         2800 | 2009-09-20  |
| 0006      | 叉子      | 厨房用具  |           500 |         NULL | 2009-09-20  |
+-----------+-------------+---------------+---------------+--------------+-------------+

--正则查询
mysql> select * from xixi where shohin_leibie regexp '用品|用具';
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0002      | 打孔器      | 办公用品      |           500 |          320 | 2009-09-11  |
| 0004      | 菜刀        | 厨房用具      |          3000 |         2800 | 2009-09-20  |
| 0005      | 高压锅      | 厨房用具      |          6800 |         5000 | 2009-01-15  |
| 0006      | 叉子        | 厨房用具      |           500 |         NULL | 2009-09-20  |
| 0007      | 擦菜板      | 厨房用具      |           880 |          790 | 2008-04-28  |
| 0008      | 圆珠笔      | 办公用品      |           100 |         NULL | 2009-11-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

--concat连接
mysql> select * from xixi limit 1;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤         | 衣服          |          1600 |          500 | 2009-09-20  |
+-----------+-------------+---------------+---------------+--------------+-------------+
mysql> select concat (shohin_id,'(',shohin_name,')') as id_name from xixi limit 1;
+------------+
| id_name    |
+------------+
| 0001(T恤)  |
+------------+


5、聚合、分组查询

--count(*),包含空值null
mysql> select count(*) from xixi;
+----------+
| count(*) |
+----------+
|        8 |
+----------+

--统计不含null的行数
mysql> select count(shohin_price) from xixi;
+---------------------+
| count(shohin_price) |
+---------------------+
|                   6 |
+---------------------+

--sum,avg,max,min。※MAX和MIN函数几乎适用于所有数据类型的列,SUM和AVG函数只适用于数值类型的列
mysql> select sum(shohin_price) '不含null总价' from xixi;
+------------------+
| 不含null总价 |
+------------------+
|            12210 |
+------------------+

mysql> select max(shohin_time) '最大时间',min(shohin_time) '最小时间' from xixi;
+--------------+--------------+
| 最大时间 | 最小时间 |
+--------------+--------------+
| 2009-11-11   | 2008-04-28   |
+--------------+--------------+

--统计不重复值
mysql> select count(distinct shohin_leibie) from xixi;
+-------------------------------+
| count(distinct shohin_leibie) |
+-------------------------------+
|                             3 |
+-------------------------------+

mysql> select * from xixi;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤        | 衣服        |          1000 |          500 | 2009-09-20  |
| 0002      | 打孔器   | 办公用品  |           500 |          320 | 2009-09-11  |
| 0003      | 运动T恤  | 衣服        |          4000 |         2800 | NULL        |
| 0004      | 菜刀      | 厨房用具  |          3000 |         2800 | 2009-09-20  |
| 0005      | 高压锅   | 厨房用具  |          6800 |         5000 | 2009-01-15  |
| 0006      | 叉子      | 厨房用具  |           500 |         NULL | 2009-09-20  |
| 0007      | 擦菜板   | 厨房用具  |           880 |          790 | 2008-04-28  |
| 0008      | 圆珠笔   | 办公用品  |           100 |         NULL | 2009-11-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

mysql> select shohin_leibie,count(*) from xixi group by shohin_leibie;
+---------------+----------+
| shohin_leibie | count(*) |
+---------------+----------+
| 衣服        |        2 |
| 办公用品  |        2 |
| 厨房用具  |        4 |
+---------------+----------+

--过滤分组
mysql> select shohin_leibie,count(*) from xixi group by shohin_leibie having count(*)=2;
+---------------+----------+
| shohin_leibie | count(*) |
+---------------+----------+
| 衣服        |        2 |
| 办公用品  |        2 |
+---------------+----------+


--子句的执行顺序:SELECT->FROM->WHERE->GROUP BY->HAVING
SELECT 列名1,列名2,列名3, ... FROM 表名
GROUP BY 列名1,列名2,列名3, ...
HAVING 分组结果对应的条件;

--降序排列
select shohin_id from xixi order by shohin_id desc;

--别名省略as
mysql> select shohin_name othername from xixi order by othername;
+------------+
| othername  |
+------------+
| 菜刀     |
| 高压锅  |
| 运动T恤 |
| T恤       |
| 叉子     |
| 圆珠笔  |
| 打孔器  |
| 擦菜板  |
+------------+


6、数据更新

--更新数据
insert into xixi(shohin_name) values('haha'); 

--删除一条数据
delete from xixi where shohin_name='haha';
--删除所有数据
delete from xixi

--其他表中复制
create table xixi1(select shohin_id,shohin_name from xixi);

--更新数据 
UPDATE 表名 SET 列名=NULL WHERE 条件;
--多列
UPDATE 表名 SET 列名=NULL,列名=NULL WHERE 条件;
update xixi set shohin_number=1100 where shohin_name='T恤';

--事务:需要在同一个处理单元中执行的一系列更新处理的集合

创建事务:
事物开始语句(start transtion);
DML语句1;
DML语句2;
DML语句3;
...
事物结束语句(commit或者rollback);

start transtion;
begin;
update xixi set shohin_number=1200 where shohin_name='T恤';
update xixi set shohin_number=1300 where shohin_name='T恤';
update xixi set shohin_number=1600 where shohin_name='T恤';
commit;

7、视图

视图与表的唯一区别:是否保存了实际的数据。数据库中的数据实际上会被保存到计算机的存储设备中,但使用视图时并不会将数据保存到存储设备之中,也不会将数据保存到其他任何地方。实际上是他保存的是select语句。视图就是从存在的表里面挑选出部分字段或者数据,本质可以理解为一条查询语句。

--创建视图,as关键字不可省略
create view xixi_view(id,name) as select shohin_id,shohin_name from xixi;

--删除视图
drop view xixi_view;

--使用视图的查询:通常需要执行2条以上的SELECT语句
a.首先执行定义视图的select语句;
b.根据得到的结果,再执行在from子句中使用视图的SELECT语句。

--视图的限制:通过聚合得到的视图无法进行更新
a.定义视图时不能使用ORDER BY子句(视图和表一样,数据行都是没有顺序的)
b.当定义视图的SELECT语句满足以下某些条件时,可以对视图进行更新(更新包括:INSERT、DELETE、UPDATE)。条件如下:SELECT语句中未使用DISTINCT;FROM只有一张表;未使用GROUP BY子句;未使用HAVING子句

--子查询,一张一次性视图
select shohin_id from (select shohin_id,shohin_name from xixi) as haha;

mysql> select shohin_id from xixi where shohin_leibie in 
    -> (select shohin_leibie from xixi where shohin_leibie='厨房用具');

8、函数,谓词,case表达式

--算术函数、字符串函数、日期函数、转换函数、聚合函数。
大小写,去空格,对齐,子串


--日期函数
select current_date;
select current_time
select current_timestamp;

--谓词:满足返回值是真值的函数,‘_’代表任意一个字符,而‘%’则代表一个或多个字符
select * from xixi where shohin_leibie like'%厨房%';

--CASE表达式:一种表示(条件)分歧的函数
mysql> select * from xixi;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤         | 衣服          |          1600 |          500 | 2009-09-20  |
| 0002      | 打孔器      | 办公用品      |           500 |          320 | 2009-09-11  |
| 0003      | 运动T恤     | 衣服          |          4000 |         2800 | NULL        |
| 0004      | 菜刀        | 厨房用具      |          3000 |         2800 | 2009-09-20  |
| 0005      | 高压锅      | 厨房用具      |          6800 |         5000 | 2009-01-15  |
| 0006      | 叉子        | 厨房用具      |           500 |         NULL | 2009-09-20  |
| 0007      | 擦菜板      | 厨房用具      |           880 |          790 | 2008-04-28  |
| 0008      | 圆珠笔      | 办公用品      |           100 |         NULL | 2009-11-11  |
+-----------+-------------+---------------+---------------+--------------+-------------+

mysql> select case when shohin_name in ('T恤','运动T恤') then '衣服'
    ->             when shohin_name in ('打孔器','圆珠笔') then '办公用品'
    ->             else '厨房用具'
    ->             end as shohin_lb
    ->             from xixi;
+--------------+
| shohin_lb    |
+--------------+
| 衣服         |
| 办公用品     |
| 衣服         |
| 厨房用具     |
| 厨房用具     |
| 厨房用具     |
| 厨房用具     |
| 办公用品     |
+--------------+

9、联结表、组合查询

--先创建表
mysql> create table jh1
    -> (id int,
    -> bh int);

mysql> create table jh2
    -> (id2 int,
    -> bh2 int);
--insert into jh1 values(1,2),(3,4),(5,6);

mysql> select * from jh1;
+------+------+
| id   | bh   |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
+------+------+

mysql> select * from jh2;
+------+------+
| id2  | bh2  |
+------+------+
|    1 |    2 |
|    7 |    8 |
+------+------+

--m*n,交叉连接
mysql> select * from jh1,jh2;
+------+------+------+------+
| id   | bh   | id2  | bh2  |
+------+------+------+------+
|    1 |    2 |    1 |    2 |
|    1 |    2 |    7 |    8 |
|    3 |    4 |    1 |    2 |
|    3 |    4 |    7 |    8 |
|    5 |    6 |    1 |    2 |
|    5 |    6 |    7 |    8 |
+------+------+------+------+

--内连接
mysql> select * from jh1,jh2 where jh1.id=jh2.id2;
+------+------+------+------+
| id   | bh   | id2  | bh2  |
+------+------+------+------+
|    1 |    2 |    1 |    2 |
+------+------+------+------+
mysql> select * from jh1,jh2 where jh1.id>jh2.id2;
+------+------+------+------+
| id   | bh   | id2  | bh2  |
+------+------+------+------+
|    3 |    4 |    1 |    2 |
|    5 |    6 |    1 |    2 |
+------+------+------+------+

mysql> select * from jh1,jh2 where jh1.id<jh2.id2;
+------+------+------+------+
| id   | bh   | id2  | bh2  |
+------+------+------+------+
|    1 |    2 |    7 |    8 |
|    3 |    4 |    7 |    8 |
|    5 |    6 |    7 |    8 |
+------+------+------+------+

--union与union all,union会去除重复着,union all会打印重复值
mysql> select * from jh1 union select * from jh2;
+------+------+
| id   | bh   |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|    7 |    8 |
+------+------+

mysql> select * from jh1 union all select * from jh2;
+------+------+
| id   | bh   |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|    1 |    2 |
|    7 |    8 |
+------+------+

10、全文本搜素

-- 类似like语句,MyISAM支持全文本搜索,InnoDB不支持。
   为了进行全文本搜索,必须在被搜索的列建立索引,在建立索引后,使用match()与against()完成搜索,match指定被搜索的列,against指定要使用的搜索表达式。传递给match()的值必须与fulltext()定义中的相同,如果指定多个列,则必须列出他们,次序也需正确。

select shohin_price from xixi where match(shohin_price) against('500');

11、存储过程

qu tmd 这个总是出问题,……
--多条语句结合处理一个任务
存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
过程体格式:以begin开始,以end结束(可嵌套)

----------创建存储过程名字为cunchuway
delimiter //
create procedure cunchuway()
begin
  select sum(shohin_id) as totalnum 
  from xixi;
end //
--将语句的结束符号恢复为分号,一定要有空格哈   delimiter 分隔符
delimiter ;
--调用
call cunchuway();
--删除
drop procedure cunchuway;


----------创建带参数存储过程名字为cunchuname
delimiter //
create procedure cunchuname(in idd int)
begin
  select * from xixi where shohin_id=idd;
end //
--将语句的结束符号恢复为分号,一定要有空格哈
delimiter ;
--调用
call cunchuname(0001);
--删除
drop procedure cunchuname;

----触发器
在 MySQL 中,只有执行 INSERT、UPDATE 和 DELETE 操作时才能激活触发器。

BEFORE 和 AFTER,触发器被触发的时刻,表示触发器是在激活它的语句之前或之后触发。若希望验证新数据是否满足条件,则使用 BEFORE 选项;若希望在激活触发器的语句执行之后完成几个或更多的改变,则通常使用 AFTER 选项。

-- NEW用来表示将要(before)或已经(after)插入的新数据。
-- old用来表示将要或已经被删除的原数据。

--查看触发器状态
show triggers;
show triggers from databaseName;

--创建触发器
drop trigger if exists haha.sumid;  
delimiter //
create trigger sumid
 after insert on xixi
 for each row
begin

 set @sum=@sum+new.shohin_number;
end
//
delimiter ;

 set @sum=(select sum(shohin_number) from xixi);
insert into xixi(shohin_id,shohin_name,shohin_number) values(0009,'吼吼',1000);
select @sum;

触发器创建的四个要素

(1)监视地点(table) 
(2)监视事件(insert/update/delete) 
(3)触发时间(after/before) 
(4)触发事件(insert/update/delete)

--触发器进阶
-- 变量直接赋值
set @num=999;
-- 使用select语句查询出来的数据方式赋值,需要加括号:
set @name =(select name from table);
 
-- 简单的if语句:
set sex = if (new.sex=1, '男', '女');

-- 多条件if语句:
if old.type=1 then
    update table ...;
elseif old.type=2 then
    update table ...;
end if;

12、容灾备份

 

不同容灾备份对比

 

差异备份,恢复差一备份      增量备份,恢复增2备份
热备:读写  温备:只读  冷备

---------------------------------------------------------------------------------
备份方式1: 只导出数据,无表结构,小心乱码
--可以使用 SELECT INTO OUTFILE 语句把表数据导出到一个文本文件中进行备份。
*************注意:这种方法只能导出或导入数据的内容,而不包括表的结构。若表的结构文件损坏,则必须先设法恢复原来表的结构。
select * from hehe.shohininto outfile '/var/mysql.txt';
load data infile '/var/mysql.txt' into table hehe.shohin;

将数据库 haha 的表 xixi 的全部数据备份到 /var/lib/mysql-files/mysql.txt 的文件中,要求每个字段用逗号分开,并且字符用双引号标注,每行以问号结束。
show variables like "secure_file_priv";


start transaction;
insert into xixi values
('0001','T','fg',1000,500,'2009-09-20'),
('0008','gg','gf',100,NULL,'2009-11-11');
commit;

mysql> 
select * from hehe.shohin
into outfile '/var/lib/mysql-files/mysql.txt'
fields terminated by ','
enclosed by '"'
lines terminated by '\r\n';


用记事本查看 MySQL 备份文件夹下的 file.txt 文件
delete from xixi;

--恢复----乱码
mysql> 
load data infile '/var/lib/mysql-files/mysql.txt'
into table hehe.shohin
fields terminated by ','
enclosed by '"'
lines terminated by '\r\n';

--恢复乱码
show variables like "%char%";
此时可以使用set names utf8;
再次使用show variables like "%char%";


mysqldump 和xtrabackup
保持一致性方法:快照,只读锁
-------------------------------------------------------------------------------
备份方式2:
mysqldump备份数据是insert语句,可以文本处理,缺点是效率低,不能很多数据
innodb支持热备,支持事务,可以基于事务热备。 
myisam只支持温备,表备份,请求锁住

----master-data记录binlog的编号 
----lock-all-tables myisam的锁表参数
------default-character-set=utf8 编码设置
mysqldump -uroot -h127.0.0.1 --all-databases --master-data=2 -p > bakmysql.sql
mysqldump -uroot -h127.0.0.1 --all-databases --master-data=2 -p|gzip > bakmysql.sql.gz
后者路径改成  /root/backmysql/bak_$(date +%F).sql.gz



-----------------------------------------------------------------------------恢复
恢复关闭binlog
set sql_log_bin=off;
--获取全路径
[root@oracle ~]# readlink -f bakmysq1l.sql 
/root/bakmysq1l.sql
--恢复数据有空格
mysql> \. /root/bakmysq1l.sql

----------------------------------------------------------------------------------
xtrabackup:物理备份工具 对innodb可以热备,增量,差异备份   对myisan温备,增加读锁,只能全量备份。

----------------innodb如何保证一致性
--xtrabackup备份会运行2线程,一个复制innodb的page,一个负责innodb的事务日志(redo),事务日志会被xtrabackup记录到自己的日志文件当中,备份结束后有2份,一份不可用(未确定的在事务中),一份备份的事务日志,通过应用事务日志变成一份可用的,提交的replayed,未提交的roolback,类似崩溃后的恢复,
这个过程被称为‘prepare’;prepare操作保证了备份出的数据一致性。
---表引擎有innodb又有myisam时,先热备innodb,之后备份myisam加锁,温备,最后对innodb库prepare,保证所有引擎的世界点是一致的。


--innodb逻辑存储结构看,所有的数据都被逻辑的存放在一个空间中,为表空间(tablespace)。表空间又由段(segment)、区(extend)、页(page)组成,页也可以别成为块(block)。  备份读取页备份,LSN记录,LSN类似seq实现增量备份,有变化的页就记录实现增量,恢复就LSN覆盖旧的页。

xtrabackup安装
yum list | grep percona-xtrabackup
查看版本:
xtrabackup -version

2.4的xtrabackup=2.3的innobackupex+2.3的xtrabackup
2.3的: 
1).xtrabackup只能备份InnoDB和XtraDB 两种数据表
2).innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表





13、mysql日志

mysql日志有错误 、查询 、慢日志、 二进制、 中继 、innodb存储引擎事务这6种类型

--错误日志: 错误信息,警告信息
mysql> show variables like '%log_error%';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| binlog_error_action | ABORT_SERVER        |
| log_error           | /var/log/mysqld.log |
| log_error_verbosity | 3                   |
+---------------------+---------------------+

修改位置永久生效 my.cnf修改log_error

--查询日志,记录了数据库执行的命令,不管正确与否
show variables where variable_name like '%general_log%' or variable_name='log_output';
+------------------+---------------------------+
| Variable_name    | Value                     |
+------------------+---------------------------+
| general_log      | OFF                       |
| general_log_file | /var/lib/mysql/oracle.log |
| log_output       | FILE                      |
+------------------+---------------------------+
默认关闭,暂时打开
set global general_log=on;

--慢查询日志 响应比较慢的日志,dml超过指定时间,都叫‘慢查询’
show variables where variable_name like '%slow_query%' or variable_name='log_output';
临时开启
set global slow_query_log=on;
查看开机以来的所有慢查询
show global status like '%slow_queries%';

--二进制日志,binlog,查询不记录,修改才记录,用户备份恢复,重新执行操作的语句
show variables like '%log_bin%';
+---------------------------------+-------------------------------+
| Variable_name                   | Value                         |
+---------------------------------+-------------------------------+
| log_bin                         | ON                            |
| log_bin_basename                | /var/lib/mysql/mybinlog       |
| log_bin_index                   | /var/lib/mysql/mybinlog.index |
| log_bin_trust_function_creators | OFF                           |
| log_bin_use_v1_row_events       | OFF                           |
| sql_log_bin                     | ON                            |
+---------------------------------+-------------------------------+
去对应目录 ll mybin* 查看

三种模式
statuement 记录语句  
row模式,插入1000行,记录1000行,空间,io大 --生产端环境,保险,一般row
mixed模式:混合

二进制:记录的事件字节和位置字节,事件 events  ,位置 position  

-----------------------------------------
row模式只会记录修改的
mysql> show binary logs;
+-----------------+-----------+
| Log_name        | File_size |
+-----------------+-----------+
| mybinlog.000001 |       154 |
+-----------------+-----------+

--类似切归档
flush logs;
--查看记录到哪里了
show master status;


mysql> select * from shohin;
+-----------+-------------+---------------+---------------+--------------+-------------+
| shohin_id | shohin_name | shohin_leibie | shohin_number | shohin_price | shohin_time |
+-----------+-------------+---------------+---------------+--------------+-------------+
| 0001      | T恤         | 衣服          |          1000 |          500 | 2009-09-20  |
| 0002      | 打孔器      | 办公用品      |           500 |          320 | 2009-09-11  |
| 0003      | 运动T恤     | 衣服          |          4000 |         2800 | NULL        |
+-----------+-------------+---------------+---------------+--------------+-------------+

mysql> show binary logs;
+-----------------+-----------+
| Log_name        | File_size |
+-----------------+-----------+
| mybinlog.000001 |       154 |
+-----------------+-----------+

mysql> insert into shohin(shohin_id,shohin_name) values(100,'擦菜');
Query OK, 1 row affected (0.01 sec)
mysql> commit;

mysql> show binary logs;
+-----------------+-----------+
| Log_name        | File_size |
+-----------------+-----------+
| mybinlog.000001 |       430 |
+-----------------+-----------+
1 row in set (0.00 sec)
--查看事件
show binlog events;
mysql> show binlog events in 'mybinlog.000001';
+-----------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name        | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+-----------------+-----+----------------+-----------+-------------+---------------------------------------+
| mybinlog.000001 |   4 | Format_desc    |        10 |         123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mybinlog.000001 | 123 | Previous_gtids |        10 |         154 |                                       |
| mybinlog.000001 | 154 | Anonymous_Gtid |        10 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mybinlog.000001 | 219 | Query          |        10 |         291 | BEGIN                                 |
| mybinlog.000001 | 291 | Table_map      |        10 |         351 | table_id: 108 (hehe.shohin)           |
| mybinlog.000001 | 351 | Write_rows     |        10 |         399 | table_id: 108 flags: STMT_END_F       |
| mybinlog.000001 | 399 | Xid            |        10 |         430 | COMMIT /* xid=11 */                   |
+-----------------+-----+----------------+-----------+-------------+---------------------------------------+

--从指定字节查看
mysql> show binlog events in 'mybinlog.000001' from 154;


mysql> show binlog events in 'mybinlog.000001' from 430;
+-----------------+-----+------------+-----------+-------------+-----------------------+
| Log_name        | Pos | Event_type | Server_id | End_log_pos | Info                  |
+-----------------+-----+------------+-----------+-------------+-----------------------+
| mybinlog.000001 | 430 | Rotate     |        10 |         476 | mybinlog.000002;pos=4 |
+-----------------+-----+------------+-----------+-------------+-----------------------+

 

 

总结比较详细的mysql脑图:https://blog.csdn.net/weixin_36986228/article/details/89091649

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值