1、理解MySQL基本概念mysql
一、MySQL软件:MySQL实际上就是一软件,是一工具,是关系型数据库管理系统软件linux
二、MySQL数据库:就是按照数据结构来组织、存储和管理数据的仓库sql
三、MySQL数据库实例:shell
①MySQL是单进程多线程(而oracle是多进程),也就是说MySQL实例在系统上表现就是一个服务进程,即进程;数据库
②MySQL实例是线程和内存组成,实例才是真正用于操做数据库文件的;windows
通常状况下一个实例操做一个或多个数据库;集群状况下多个实例操做一个或多个数据库。安全
2、MySQL数据库启动以及启动的判断服务器
一、启动MySQL数据实例:session
shell> service mysqld start #rpm包安装的mysql数据结构
若是是源码安装的话,推荐使用mysqld_safe命令的安全启动(能够看到启动信息)。
二、判断MySQL数据库是否启动:
shell> netstat -tulnp|grep 3306 #若是能够过滤出来(有输出)证实已启动
shell> mysqladmin -uroot -p123 ping #出现mysqld is alive证实是活跃的
3、如何使用官方文档和help
一、基本技能:DBA全部的操做必须来自于官方文档
二、mysql> help contents; #寻求help帮助的入口
4、官方文档概览
一、Tutorial:将MySQL经常使用的一些操做使用一个场景串联起来
只是关注里面的灰色部分就能够,按照里面的灰色操做部分顺一遍
二、server Administrator:MySQL管理须要的一些命令、工具、参数等
三、SQL Syntax
SQL语法,使用最多,特别是DDL语句必定要使用SQL语法进行参考
四、Server Option / Variable Reference:MySQL的参数和状态值,使用较多
五、Functions and Operators
MySQL经常使用函数和操做符,使用较多
六、Views and Stored Programs
视图、存储过程、函数、触发器、event语法参考
七、Optimization:优化
很是值得细致的看一遍,此篇文档不只仅用来参考,更多的是用来学习优化知识,算是DBA进阶宝典
八、Partitioning
若是是要进行表分区,此文档是必须参考的资料,也是惟一参考的资料
九、Information Schema、Performance Schema
中级DBA经常使用的两个参考资料
十、Spatial Extensions
地理位置信息
十一、Replication
MySQL使用复制功能,经常使用的参考资料
十二、Semisynchronous Replication
半同步复制,个别场合会用到
5、如何使用官方文档
一、参考官方文档修改密码强度(下降密码强度)、修改密码
①改密码强度:
mysql> show variables like 'validate_password%';
mysql> SET GLOBAL validate_password_policy=0;
②修改密码:set、alter
二、参考官方文档查询当前数据库链接的数量(查询状态值Threads_connected)
mysql> show status like '%Threads_connected%';
注意:查看状态值是show status
查看变量值是show variables
三、创建一个数据库指定字符集
mysql> create database test_db character set utf8;
四、给一个表增长一个列,要求这个列的数据类型是字符串、非空(alter)
ALTER TABLE tbl_name ADD COLUMN col_name varchar(20) not null;
五、用函数将两个字符串串联起来(concat:合并多个字符串)
CONCAT():returns NULL if any argument is NULL.
CONCAT_WS(separator,str1,str2,...)
六、mysqladmin的使用:类同于ping数据库是否活跃、关闭数据库
shell> mysqladmin -uroot -p123 ping
mysqld is alive
shell> mysqladmin -uroot -p123 shutdown
七、如何启动数据库:mysqld_safe命令(切记挂后台&,不然占领当前会话没法退出)
shell> mysqld_safe --defaults-file=/etc/my.cnf &
官方文档对于具备必定基础知识的人来讲,是一个最合适的工具,可使DBA的操做变得没有障碍
6、登陆MySQL查看当前会话的状态
mysql> status
7、描述MySQL在Linux平台下的大小写、同时演示大小写的区别
一、数据库名、表名、表别名严格区别大小写
二、列名、列别名忽略大小写
三、变量名严格区别大小写
四、MySQL在windows下各个对象都不区别大小写
mysql> show variables like 'lower%'; +------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 0 |
+------------------------+-------+
①lower_case_file_system是对实际的文件系统的反应,为只读变量,不能修改。Off表示MySQL所在的文件系统大小写敏感,也就是说进入MySQL所在的文件系统查看里面的内容,发现有mysql文件夹,此时新建一个名为MYSQL的文件夹是能够的,说明大小写敏感。
②lower_case_table_names表示表名或数据库存储是否区别大小写,为只读变量,能够在配置文件my.cnf里面修改:
0表示区分大小写,按照新建数据库的大小写形式存储显示;
1表示不管新建数据库大小写都以小写的形式存储显示。
8、MySQL的几种帮助
一、shell> mysql --help
二、mysql> help show
mysql> show create table tel_name
mysql> help set
9、MySQL的变量如何查看,如何修改
一、查看变量用select
局部变量select var_name;
用户变量select @var_name;
全局变量select @@var_name;
二、修改变量用set
SET variable_assignment [, variable_assignment] ... variable_assignment: user_var_name = expr #变量名字=一个值 |[GLOBAL | SESSION] system_var_name = expr |[@@global. | @@session. | @@]system_var_name = expr
①set global表示修改后对所有会话生效,为全局修改变量
②set session表示修改后对本次会话生效
③若是变量是只读变量能够经过修改MySQL的配置文件my.cnf来修改变量,在[mysqld]下添加一行数据:user_var_name=expr,而后重启数据库再登陆便可。
10、MySQL的状态参数如何查看、如何参考阅读其内容
在官方文档的Server Option / Variable Reference部分,进行参考查看MySQL的参数变量以及状态值
一、cmd-line表示可否在mysql安全启动(mysqld_safe)中进行参数设置 --var_name=……
二、option file表示可否在mysql的参数文件中进行参数设置
三、system var表示是不是系统变量
四、status var表示是不是状态变量
五、var scope表示变量的范围:全局global、会话session
六、dynamic表示是不是动态参数,yes是动态,no是静态
11、如何查看某个数据库里面有多少表、每个表的列的信息
一、show tables; desc tbl_name;
二、mysql> select * from information_schema.TABLES
-> where TABLE_NAME='tbl_name'\G;
①information_schema数据库:也称为数据字典,记录了各数据库的表、视图、索引、存储过程、函数等信息……
②information_schema.TABLES:记录了MySQL中每个数据库中表所在的数据库、表的名字、表的行数等信息。
12、如何查看一个表的建表语句、一个数据库的建库语句
一、show create table tbl_name;
二、show create database db_name;
十3、如何查看MySQL支持的数据类型以及数据类型如何使用
mysql> help contents;
mysql> help data types;
mysql> help ……
十4、列举show命令经常使用的语法
一、show status like …… 查看状态值
二、show variables like …… 查看变量参数值
三、show create …… 查看建表、库……的语句信息
四、show procedure status where db='db_name'\G; #查看存储过程信息
五、show warnings\G; #查看警告信息
十5、help kill如何使用
mysql> help kill
KILL [CONNECTION | QUERY] processlist_id
注:Thread processlist identifiers can be determined from the ID column of the INFORMATION_SCHEMA.PROCESSLIST table。
mysql> select * from INFORMATION_SCHEMA.PROCESSLIST\G;
十6、描述MySQL用户名组成以及特色
一、MySQL用户身份识别认证:用户名user、密码password、登陆mysqld主机host
shell> mysql -uroot -p123 -h172.16.11.99
-u:登陆的用户名
-p:登陆用户对应的密码
-h:MySQL服务器主机IP,默认是localhost的IP
二、MySQL的用户管理模块的特色:客户端请求链接,提供host、username、password,用户管理模块进行验证请求链接,经过mysql.user表进行校验信息。
十7、如何查看MySQL有多少用户以及对应的权限
一、mysql> select count(*) from mysql.user; #查看MySQL有多少用户
二、mysql> select * from mysql.user\G; #用户信息查询(权限)
十8、创建一个用户
一、本地登陆
mysql> create user 'u1'@'localhost' identified by '123';
二、任意均可以登陆
mysql> create user 'u2'@'%' identified by '123';
三、某一个网段能够登陆
mysql> create user 'u3'@'172.16%' identified by '123';
四、具体主机能够登陆
mysql> create user 'u4'@'172.16.12.24' identified by '123';
十9、使用help grant,给用户赋权
二10、创建一个db1数据库的只读用户
建用户而后受权
mysql> GRANT SELECT ON db1.* TO 'olr_user'@'%';
二11、创建一个只能进行系统状态信息查询的管理用户
mysql> grant select on information_schema.* to 'admin_user'@'%';
二12、创建一个db1的生产用户,只能进行dml、select,不能进行ddl
mysql> grant select,insert,update,delete on *.* to 'pro_user'@'%';
二十3、创建一个能够进行DDL的管理用户
mysql> grant create,drop,alter on *.* to 'admin_user'@'%';
二十4、创建一个工资表,只有指定的用户能够访问工资列,其余用户都不能访问工资列
实现步骤:
先在mysql.user里将全部用户检索出来,进行跑批处理(脚本或存储过程)revoke对该表列的权限;
而后grant建立用户,并对该表列赋访问权限。
二十5、查询上述用户以及所赋权限是否正确,同时进行验证
mysql> select * from mysql.user\G; #查看MySQL用户信息
进行用户登陆验证
二十6、解释with grant option,而且演示其功能
mysql> grant all on *.* to 'zhang'@'%' identified by '123' with grant option;
with grant option子句:经过在grant语句的最后使用该子句,就容许被受权的用户把获得的权限继续授给其余用户。也就是说,客户端用zhang用户登陆MySQL,能够将zhang用户有的权限使用grant进行受权给其余用户。
二十7、查询某一个表上的权限、查看某一个列上的权限、查看某一个数据库上面的权限
一、 查询全部数据库的权限
mysql> select * from mysql.user;
二、 查询某个数据库的权限
mysql> select * from mysql.db;
三、 查询某个数据库中某个表的权限
mysql> select * from mysql.tables_priv;
四、 查询某个数据库某个表中某个列的权限
mysql> select * from mysql.columns_priv;
二十8、修改参数运行使用grant创建用户,修改参数禁止grant创建用户
mysql> show variables like 'sql_mode%'; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.37 sec)
sql_mode参数中的NO_AUTO_CREATE_USER值:不自动建立用户
mysql>set @@session.sql_mode=……; #设置sql_mode参数
二十9、修改mysql的用户密码,分别使用grant、alter、set修改
①mysql> grant all on *.* to '用户名'@'登陆主机' identified by '密码';
②mysql> alter user '用户名'@'登陆主机' identified by '密码(自定义)';
③mysql> SET PASSWORD FOR '用户名'@'登陆主机' = PASSWORD('密码');
三10、破解密码步骤:
①到/etc/my.cnf 里将 validate_password=off 行注释 //关闭密码策略
②shell> mysqld_safe --skip-grant-tables & //重启数据库
③shell> mysql -uroot //无密码登陆
④mysql> flush privileges; //刷新权限使密码生效
⑤修改密码,退出,重启数据库,进入
三11、使用revoke进行权限的收回,将上面用户的受权分别收回,同时查看收回后的结果
①REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
②REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
三12、select最简单经常使用语法
一、全表查询
select * from tbl_name;
二、某些行查询
select * from tbl_name where ……;
三、某些列查询
select clm_name from tbl_name;
四、某些行的某些列查询
select clm_name from tbl_name where ……;
五、列别名
select clm_name as new_name from tbl_name;
六、列运算
select clm_name+123 from tbl_name;
三十3、concat函数的使用
一、concat函数:将多个字符串参数首尾相连后返回
二、concat_ws函数:将多个字符串参数以给定的分隔符,首尾相连后返回
三、group_concat:函数的值等于属于一个组的指定列的全部值,以逗号隔开,而且以字符串表示
三十4、演示打开和关闭管道符号“|”的链接功能
PIPES_AS_CONCAT:将“||”视为字符串的链接操做符而非或运算符
|| 管道链接符:
mysql> select 列名1 || 列名2 || 列名3 from 表名;
在mysql中,进行上式链接查询以后,会将查询结果集在一列中显示,列名是‘列名1 || 列名2 || 列名3’
mysql> select s_no || s_name || s_age -> from student; +-------------------------+
| s_no || s_name || s_age |
+-------------------------+
| 1001张三23 |
| 1002李四19 |
+-------------------------+
若是不显示结果,是由于sql_mode参数中没有PIPES_AS_CONCAT,只要给sql_mode参数加入PIPES_AS_CONCAT,就能够实现像CONCAT同样的功能;
若是不给sql_mode参数加入PIPES_AS_CONCAT的话,|| 默认是or的意思,查询结果是一列显示是1。
三十5、使用mysql> help functions; 学习MySQL各种函数
三十6、常见功能函数
一、upper(……)、lower(……)大小写变换
二、user()查看登陆用户、current_user()查看当前用户
三、database()查看使用的数据库
三十7、使用help来学习下面的数据类型(创建对应类型的列、插入数据、显示数据)
一、整数:int
二、非负数:unsigned无符号即非负数---e.g:int unsigned
三、小数:dec
四、浮点数以及科学计数法:float、double
若是FLOAT数据在插入的时候,要使用NeM(科学计数法)的方式插入时:
好比
5e2 就是5*10的2次方
5e-2就是5*10 的-2次方
4e-1+5.1e2 就是510.4
五、字符串:varchar
六、布尔:bool、boolean---synonyms(同义词):TINYINT(1)
七、位:bit
如何使用16进制常量:hex()
如何使用2进制常量:bin()
date类型以及STR_TO_DATE函数
time类型以及STR_TO_DATE函数
dateime数据类型以及标准写法、STR_TO_DATE函数
date和time显示方式以及date_format函数
三十8、时区
一、查看操做系统时区、数据库时区
查看操做系统时区:
shell> cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
shell> ls /usr/share/zoneinfo
……
mysql> show variables like 'system_time%'; #查看MySQL系统时区
mysql> show variables like 'time_zone%'; #查看数据库时区
二、修改数据库时区为东八区,去掉数据库时区对os时区的依赖(查看官方文档)
加载系统时区:将Linux时区导入到数据库中
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo |mysql -uroot -p123 mysql
mysql> set @@global.time_zone='Asia/Shanghai';
修改数据库时区为东八区,同时在参数文件中进行修改,永久保存
三、时区在何时有用:
若是数据库里面没有timestamp这个数据类型,那么时区参数没有意义!
你如何确认你的数据库里面是否有timestamp类型的列?
mysql> select table_name,column_name,data_type -> from information_schema.columns -> where data_type='timestamp';
……
时区原理描述:insert过程和select过程的描述:相对应的0时区的转换
四、时区的正确实践(timestamp)
insert之前:你的values对应的时间究竟是哪一个时区,而后设置set @@session.time_zone为对应的时区
select获取之前:你想获得什么时区的时间,就设置set @@session.time_zone为对应的时区
三十9、字符集
一、查看服务器的字符集
mysql> show variables like 'character_set_server';
二、查看数据库字符集
mysql> show variables like 'character_set_database';
通常在数据库实现字符集便可,表和列都默认采用数据库的字符集
gbk
utf8
三、查看表的字符集、查看列的字符集
mysql> show create table tbl_name;
四、字符集原理描述、字符集正确实践
对于insert过程描述、对于select过程描述
①对于insert来讲,character_set_client、character_set_connection相同,并且正确反映客户端使用的字符集
②对于select来讲,character_set_results正确反映客户端字符集
③数据库字符集取决于咱们要存储的字符类型
④字符集转换最多发生一次,这就要求character_set_client、character_set_connection相同
⑤全部的字符集转换都发生在数据库端
总述:
1)创建数据库的时候注意字符集(gbk、utf8)
2)链接数据库之后,不管是执行dml仍是select,只要涉及到varchar、char列,就须要设置正确的字符集参数:
character_set_client、character_set_connection、character_set_results
五、客户端字符集如何来理解?
取决于客户端工具
shell> mysql -uroot -p123456 -hserver_host -P3306
mysql工具自己没有字符集,所以客户端字符集取决于工具所在的os的字符集(windows:gbk、linux:utf8)
sqlyog工具自己带字符集,此时客户端os字符集就没有意义
六、如何判断字符集出现了问题?
全部设置都正确,可是查询到的仍是乱码,这就是出现问题了
四10、如何识别变量参数、状态参数status var
show variables……
show status……
识别判断都是查看官方文档System Var、Status Var
四11、如何识别动态参数、静态参数
动态参数dynamic:Yes
静态参数dynamic:No
四12、对于动态参数如何设置,如何判断动态参数是否能够在全局级别或者会话级别修改
一、set
二、修改参数文件/etc/my.cnf:弊端是须要重启才能生效(不多用)
判断:参考官方文档Option/Variable Summary,经过Var scope来进行判断动态参数的全局global、both
四十3、对于静态参数如何修改
静态参数,在整个实例声明周期内都不得进行更改,就好似是只读的;
通常静态参数都是在配置文件中修改/etc/my.cnf,固然静态参数可否写入配置文件还要看官方文档对该参数的Option File的描述Yes与否。
四十4、掌握@@、@的区别
一、@@var_name表示的系统变量
根据系统变量的做用域可分:全局变量、会话变量
二、@var_name表示的用户变量
①用户变量和数据库链接有关,链接后声明变量,链接断开后,自动消失;
②select一个没有赋值的用户变量,返回NULL,也就是没有值;
Mysql的变量相似于动态语言,变量的值随所要赋的值的类型而改变。
四十5、set @@session.和set @@global.的生效时间
对于一个新创建的链接,只有全局变量,会话变量还不存在,这个时候会从全局变量拷贝过来。
一、set @@session.:只对当前链接起做用
二、set @@global.:对全局变量的修改会影响到整个服务器
注意:set系统变量时,不带做用域修饰,默认是指会话做用域;
(特别注意,有些系统变量不带做用域修饰,没法设置,所以最好都带上做用域设置系统变量)。
四十6、动态参数最佳实践
一、尽可能先进行会话级别的设置set @@session,确认生效并且效果不错之后,再进行全局设置,若是须要立刻生效,杀掉全部的会话:
mysql> select concat('kill ',conn_id,';') from sys.session;
二、确认没有问题之后,修改参数文件,下次系统启动一直生效。
四十7、select书写技巧
一、确认须要访问数据来自于哪几张表
from来自某张表或者某几张表
join添加某张表
on表链接条件
记住一点:每关联一个表就须要加上对应的on条件(on条件就是主外键条件)
二、经过where条件来过滤数据
三、确认需求里面是否有分组聚合的含义
分组:group by
聚合:聚合函数
聚合条件过滤:having
四、是否须要排序
order by
四十8、MySQL内置函数(将列出的常见的一些函数熟悉过一遍)
一、内置函数的多少是一个数据库是否成熟的标志
二、学会使用help Functions学习和使用函数(重点!!!!!!!!!!!)
三、经常使用函数要过一遍
①日期时间相关的函数
CURDATE、DATEDIFF、DATE_FORMAT、DAYOFWEEK、LAST_DAY、EXTRACT、STR_TO_DATE
②比较操做符要求都过一遍,help Comparison operators;
③流程控制行数help Control flow functions;
④加密函数help Encryption Functions;
只须要看看decode、password两个函数便可
⑤信息获取函数help Information Functions;
经过这些函数能够知道一些信息,过一遍便可
⑥逻辑操做符help Logical operators;
!、and、or,这些经常使用的要过一遍
⑦杂项函数help Miscellaneous Functions;
简单浏览一下里面的函数,对于名字有个印象便可
⑧数值函数help Numeric Functions;
使用数据库来进行数学运算的状况很少,经常使用的加减乘除、TRUNCATE、ROUND
⑨字符串函数help String Functions;
CONCAT、CONCAT_WS、CAST、FORMAT、LIKE、REGEXP、STRCMP、TRIM、SUBSTRING、UPPER,其它函数名字过一遍
四、聚合分组函数的使用了解
①select后面得列或者出如今group by中,或者加上聚合函数
select c1,c2,sum(c3),count(c4) from t1 group by c1,c2;
②help contents;
查看聚合函数help Functions and Modifiers for Use with GROUP BY;
AVG、MAX、MIN、SUM、COUNT、COUNT DISTINCT、GROUP_CONCAT、BIT_AND、BIT_OR、BIT_XOR
四十9、隐式类型转换,要避免隐式类型转换
一、最经常使用的几个数据类型:数字、字符串、日期时间
二、字符串里面能够存放数字和日期,可是在设计表的时候,要注意不要将日期和数字列设计成字符串列
三、对于字符串列的比较,必定要加上引号:
mysql> select * from t where name_phone='1301110001';
五10、limit使用很频繁,注意其使用方法
一、limit使用的场合
从结果集中选取最前面或最后面的几行
二、limit配合order by使用
三、MySQL5.7 doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
五11、in、not in、exists、not exists、left join、distinct join互相转换
一、in和exists能够互相转换
select * from players a where a.teamno in (select teamno from team where teamname='骑士队'); select * from players a where exists (select 1 from team b where a.teamno=b.teamno and b.teamname='骑士队');
二、not in和not exists能够互相转换
三、not in、not exists能够转换成left join
select * from 学生信息 a where a.stuno not in (select stuno from 选课信息表); select * from 学生信息 a left join 选课信息 b on a.stuno=b.stuno where b.成绩 is null;
四、in、exists能够转换成distinct join
select * from 学生信息 a where a.stuno in (select stuno from 选课信息表 b); select * from 学生信息 a where exists (select 1 from 选课信息 b where a.stuno=b.stuno); select distinct a.*
from 学生信息 join 选课信息 b on a.stuno=b.stuno;
五12、链接的具体使用含义
一、理解为何会出现表链接:查询的列来自于多个表
select 列 from .. where 列 group by 列 having 列 order by 列 limit x
二、理解表链接的书写方式
join一个表、on一个条件
三、理解表链接的注意条件
①两个表要链接必定要存在主外键关系(有可能须要第三张表协助关联)
实际上存在外键约束
存在外键列,可是没有外键约束
②防止扇形陷阱(两个表须要关联,可是没有直接主外键,借助第三个表进行关联,可是存在扇形问题,此时不能借助第三个表进行关联)
示例:学院表、专业表、学生表
学院实体和专业实体之间是一对多的联系;
学院实体和学生实体之间也是一对多的联系;
而学生和专业之间没有联系;
若是学生和专业经过学院表进行关联,就会出现扇形问题。
四、外链接:左外链接、右外链接
外链接是为了防止出现某一个表的数据被遗漏
开发人员很是喜欢使用外链接.
五十3、子查询
一、子查询可能出现的位置
①select from之间可能会出现子查询
②from后面
③join后面可能会出现子查询
④where后面可能会出现子查询
⑤having后面可能会出现子查询
二、尽最大程度的不要使用子查询
三、相关子查询、无关子查询
相关子查询特别容易出如今select from之间、where后面
相关子查询不能独立执行,子查询执行次数取决于父查询返回的行数
无关子查询能够独立执行,子查询执行一次
五十4、子查询出现的场合
一、where中出现的子查询,通常可以使用表链接进行改写
①select 列(涉及到A表,没有涉及到B表)
②where 条件(涉及到B表)
二、from后面的子查询
①对于取出来的数据再次进行复杂的处理
例如分组聚合、having条件、where条件等
②对一个结果集再次进行复杂的查询
意味着咱们取数据的这个过程当中,对数据进行处理的力度很复杂
三、select from之间的子查询
对于返回的每一行数据,select和from之间的子查询都要执行一次
select后面的列要进行复杂的处理,若是这个处理涉及到另一个表,若这个表极可能没有出如今from和join里面,则进行子查询:
示例:将每个同窗的成绩列出来,同时计算他的成绩和本组平均成绩的差距
select 学生成绩, 学生成绩-(select avg(成绩) from 选课表 a where a.组ID=b.组ID) from 选课表 b;
五十5、select执行的顺序
select ... from ... join ... on ... where ... group by .. having ... order by ...
一、先从表中取数据,访问innodb buffer pool
from ...
join ...
on ...
where
二、分组、聚合,数据已经进入用户工做空间
group by ...
having ...
三、select ....:取列数据
四、order by:排序输出
五十6、集合操做
union:结果集去重
union all:结果集不去重
五十7、insert增
一、insert values一条数据
表的名字后面最好加上列的名字
二、insert values多条数据
三、insert into select
select能够很是复杂,语法彻底就是select
五十8、update改
基本格式:update 一个表 set 列 where 列条件;
一、必定要带上where条件
二、update分为下面的几个步骤操做
①找到须要update的数据,此操做取决于where条件
where条件能够是一个复杂的where条件,好比是一个子查询
示例:将平均成绩75分以上的学生的级别设置为优等生
update 学生信息表 a set grade=‘优等生’ where a.stuno in (select b.stuno from 成绩表 b group by b.stuno having avg(成绩)>=75);
②set后面的列,也能够很复杂,好比是一个相对子查询
UPDATE players_data pd SET number_mat = ( SELECT count(*) FROM matches m WHERE m.playerno = pd.playerno), sum_penalties = ( SELECT sum(amount) FROM penalties pen WHERE pen.playerno = pd.playerno);
三、update能够改写成一个select语句
把1和2改写成一个select语句,不要对一个update在生产里面直接进行优化
四、update可使用order by,数据按照顺序进行更新
五、update可使用limit,限制每次更新的行数
五十9、replace替代已有的行
使用场合insert+update,两个表数据合并到一块儿
六10、delete删
一、绝大多数状况下须要加上where条件
二、where条件能够很复杂,例如是一个子查询
三、理解delete和truncate的区别
truncate:清空所有数据、速度快、释放空间(不删表)
delete:所有或者部分删除数据、速度慢、不释放空间
六11、临时表
一、只是针对当前会话有效,临时表和数据都存储在用户工做空间
二、临时表的使用很消耗资源
①create、insert、drop,所以在很是频繁的查询环境下,不宜使用临时表;
②临时表须要使用用户工做空间,临时表中存在的数据不易过多,不然容易出现磁盘临时表;
三、临时表的使用场合
须要暂存结果集数据,后面的操做须要访问这些暂存结果集,主要是为了可读性。
四、有一种误区必定要注意,必定不要将普通表做为临时表来使用
缘由:普通表当作临时表来使用,下面的操做须要手工去作
①create、insert、truncate或者drop
②对于普通表的全部操做都会产生redo(事务),很是消耗资源
六12、关于约束
一、非空
二、default约束
三、主键约束
四、外键约束
五、SET、ENUM约束
约束注意点:
①尽可能选择列都为非空
②对于bool、时间列常常会出现default约束
③每个表尽最大程度要有主键
④惟一键能够有多个,惟一键能够有空值
⑤外键列通常会有,可是外键约束不建议使用,在应用层面保证主表和外表的一致性
⑥合理使用set和enum约束,提高数据的质量
⑦外键约束中on delete、update,尽可能不要设置级联删除操做(很危险!!!)
六十3、表的DDL
一、极其严肃的一个动做
二、使用help书写DDL语句
三、ddl动做的后遗症和危险性
①影响I、D、U、S
②长时间锁表、产生海量IO
四、测试DDL的影响范围---优化对象
①锁表时间
②IO状况
③具体测试要求
示例:产生一个500万行的表(写一个存储过程实现),对表进行增长列、删除列、修改列的名字、将列的长度变长、将列的长度变短
mysql> delimiter $$ mysql> create procedure do_big(x int) -> begin -> declare v int; -> set v=x; -> create table test(test_num int auto_increment not null primary key); -> while v>0 do
-> insert into test values(null); -> set v=v-1; -> end while; -> end $$ mysql> delimiter ; mysql> call do_big(5000000); …… mysql> select count(*) from test; +----------+
| count(*) |
+----------+
| 5000000 |
+----------+
看一下上面的这些操做,哪些操做时间长、哪些操做时间短,并对其进行初步的原理分析
mysql> insert into test values(123456789); mysql> delete from test where test_num=123; mysql> alter table test CHANGE COLUMN -> test_num -> test_id int(10) not null auto_increment; mysql> alter table test modify test_id int(100); mysql> alter table test modify test_id int(20);
总结:对于一个大表而言,将列的长度变长时间是最长的,其余的操做处理时间都还挺短。
六十4、视图的最佳实践
一、视图就是select的一个名字
二、不建议使用复杂视图
select语句里面不要带有distinct、group by、聚合函数、union等操做
三、不建议在视图中嵌套视图
四、视图的主要使用场合
统一访问接口(select)---主要的好处
规范访问
隐藏底层表结构、ddl不影响应用访问
五、视图在安全方面的意义
六十5、存储过程(脚本)
一、存储过程使用的场合
①重复性很高的复合操做(dml)
②统一访问接口(dml、事务)
③批量业务(跑批)
二、存储过程结构分析
①存储过程当中嵌入了dml、select
②存储过程有参数,参数的不一样会产生不一样的事务
in、out、inout
③存储过程里面有结构化语句,即流程控制语句:
循环
条件判断
使得在执行dml、select的时候,变得方便
④存储过程能够定义变量
select取出来的结果能够存储到变量中
dml须要的输入值能够经过变量来实现
⑤存储过程里面能够有游标,游标的核心就是能够对一个结果集进行处理
1)定义游标(游标和一个select关联)
2)打开游标(将select的结果赋给游标,能够是N行列)
3)遍历游标(一行行数据获取,每一行数据赋给N个变量)
4)关闭游标
⑥存储过程有异常处理部分
1)异常处理是一个存储过程是否能够产品化、商业化很重要的一个标志
2)异常处理只关心SQL语句的异常
每个存储过程都要对着三类SQLWARNING、NOT FOUND、SQLEXCEPTION进行处理;
存储过程异常处理一般只是进行错误的记录,或者空处理。
⑦存储过程书写过程
1)定义一个结构
存储过程基本结构
参数
异常处理
2)书写涉及到SQL语句
3)考虑使用变量、游标、条件判断、循环将SQL语句组合起来
4)常用begin end来将一组SQL语句或者语句组合起来,做为一个语句来出现
三、存储过程安全方面的意义:防止对底层表直接进行dml
六十6、自定义函数
一、自定义函数和存储过程的区别
①有一个返回值
CREATE FUNCTION SimpleCompare(n INT, m INT) RETURNS VARCHAR(20) ……
②调用的时候必须放在=的右边
set @ax = SimpleCompare(1,2);
二、整理笔记,将函数定义和函数调用整理一个例子出来
六十7、触发器
一、尽可能少使用触发器,不建议使用
二、触发器是一个begin end结构体
三、触发器和存储过程的惟一区别就是在于被执行方式上的区别
存储过程须要手工去执行
触发器被DML自动触发
四、触发器被触发的条件
①for each row(每一行都被触发一次,这就决定了频繁dml的表上面不要有触发器)
②增删改均可以定义触发器
③before、after能够定义触发的时机
五、触发器中常常使用new、old
insert里面能够有new
delete里面能够有old
update里面能够有new、old
六、使用触发器的场合
通常用来进行审计使用:产品价格表里面的价格这个列,只要是有人对这个表的这个列进行更新,就要保存修改前和修改后的值,将这个信息记录到一个单独的表中(审计表)
七、要求你将触发器的例子保存到笔记中
①insert触发器(new)
②delete触发器(old)
③update触发器(new、old)
④before、after
六十8、event
一、周期性执行
①linux里面的at、crontab
②MySQL里面的event
二、event的核心知识点
①执行一次
CREATE EVENT myevent ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE DO begin UPDATE t1 SET mycol = mycol + 1; end
②周期性执行
CREATE EVENT myevent ON SCHEDULE EVERY 1 DAY STARTS STR_TO_DATE(‘2017-05-01 20:00:00’,'yyyy-mm-dd hh24:mi:ss') DO begin UPDATE t1 SET mycol = mycol + 1; end