您的位置:首页 > 博客中心 > 数据库 >

MySQL/MariaDB基础

时间:2022-03-16 11:30

数据库管理系统很早就有了,在最开始时,数据库管理的结构是层次化的,即层次模型,它是一个树形结构,可以通过有限次的查找来定位需要的数据,然而,这种查找还是需要遍历才能实现,所以这种模型应用时间不长久;之后有了网状模型,也就是多个树的集合;层次模型和网状模型都称为非关系型数据库。之后由Edgar Frank Codd提出了一个关系型数据库的模型,从此之后就有了关系模型,其中Oracle公司就是以此为原型开发了Oracle数据库;到现在又提出了反关系模型——No-SQL,它是非关系型的数据库,例如:键值对存储(memcached,redis),HBASE文档数据库等;

大致来讲数据库管理系统发展历程就是:
层次模型 --> 网状模型 --> 关系模型 --> No-SQL

这里我们主要来说说关系型数据库:
1.表
对于关系型数据库而言,最基本的数据管理单位为表,也称为二维表,一个表是由行跟列组成的:
行(row):实例实体,记录,记录数据的特征;(例如:某学生的成绩信息;);
列(column):字段,域;记录数据的某种属性;(例如:默认的身高;)
其中,任何一张RDBMS的表中,可以没有行,但至少要保证要有一列;否则它就不是表,也存储不了数据;
对表的操作是通过关系运算完成的:
选择:从指定表中检索符合条件的行;
SELECT * FROM tbl_name WHERE clause;
投影:从指定的表中检索符合条件的列;
SELECT column1,column2,column3 as column3_alias FROM tbl_name;
可以同时实现选择和投影的关系运算:
SELECT column1,column2,column3 as column3_alias FROM tbl_name WHERE clause;

2.索引
根据主键,外键,联合建,建立成索引,根据索引可以很快查找到数据对应的位置;即提高数据的检索速度;mysql/mariadb由于不同的存储引擎,支持的索引也有不同:B-tree平衡树索引;hash索引;空间索引;

3.视图
view,也叫作虚表;包含已知表中的一部分列,或所有的列;比如员工的×××信息、工资标准等,但是为了安全与保密,这张表不能完全提供给所有人访问,所以就将这张表某些列做成视图,例如:我将表中A的信息做成视图,并将视图授权给A,A可以访问这个视图,获得自己的相关信息,B没有被授权,那B看不了A的信息;

4.SQL接口
提供了一种能够跟数据库管理系统做交互式操作的接口;根据SQL接口来完成编程操作;类似于Linux中的Shell;

5.存储过程、存储函数
SQL也能实现编程功能:实施变量定义,函数,循环,选择等;实现这个功能的叫做存储过程和存储函数:
存储过程,使用call语句来调用
存储函数,使用select语句调用
两个定义不同点在于过程没有返回值,函数可以有返回值;

6.触发器
类似于条件选择,当符合某个条件的时候,执行某个操作,调用某个函数,完成某个过程;可以认为是一个特殊的存储过程或者存储函数;

7.事件调度器

8.调用接口
DDL、DML、DCL

9.约束
即向数据表中插入的数据必须遵守的限制规则(范式);
主键约束:填入主键的数据,不能和已经填写的数据相同,而且不能为空;
外键约束:也称为"引用性约束";一个表中的某个字段能插入的数据,取决于另一个表的主键中包含的数据;即:如果某表中频繁出现冗余信息,应该将此类信息存储于其他的表中,而此表中该字段的数据为另一张表的主键中所包含的值;
唯一键约束:类似主键约束,不能和已经填写的数据相同,但是可以为空;
检查性约束:也称为表达式约束,取决于表达式的书写规范;

SQL的大致组成就是如此,而且不论是关系型或是非关系型数据库都由三层模型构成:视图层;面向最终用户;逻辑层;面向程序员或DBA;物理层;面向系统管理员;
RDBMS的应用实现:
商业版:Oracle,DB2,Sybase,Infomix,SQL Server,MySQL;
开源版:MySQL Community Server,MariaDB,PostgreSQL,SQLlite;

   如今在CentOS中比较流行的数据库管理系统是MySQL/MariaDB,他们拥有属于自己的特性:

插件式的存储引擎:
1.存储引擎于MySQL/MariaDB而言,也被称为"表类型":MyISAM,InnoDB,XtraDB(InnoDB),Aria,BlackHole,...
2.单进程多线程;

在Linux(CentOS)中安装MySQL/MariaDB:
1.rpm包
2.Binary Package:二进制包
3.SourceCode Package:压缩包,然而需要使用cmake工具编译安装;

   当用以上三种方法安装完成以后,MySQL/MariaDB有自己的配置文件,在不同位置有多个配置文件,通常按照一定的顺序来读取其中的配置参数:

Default options are read from the following files in the given order:/etc/mysql/my.cnf /etc/my.cnf /etc/my.cnf.d ~/.my.cnf
注意:已经被指定顺序的配置中如果出现同一配置参数且具有不同的值,最后读取的文件中的参数值将成为最终生效的参数值;

在使用mysqld_safe命令启动mysqld服务进程时,可以通过一些选项来更改或附加配置文件的读取顺序;
-c, --defaults-file=name
Like --config-file, except: if first option, then read this file only, do not read global or per-user config files; should be the first option

如果在命令行中给出此选项,则此选项必须是第一个选项,此时,仅从此选项指定的配置文件中读取参数值,不会再读取任何其他的配置文件,包括全局的和个人的;

-e, --defaults-extra-file=name 
    Read this file after the global config file and before the config file in the users home directory; should be the first option

如果在命令行中给出此选项,则此选项必须是第一个选项,此时,将所有其他的配置文件按照指定顺序读取完成之后,最后再附加读取此选项指定的配置文件中参数值配置,只要有参数配置冲突,则必然以此选项指定的文件中的参数中为最终生效的参数值;

         可以通过ps aux | grep mysql查看是否附加上了上面的选项:

技术分享图片

MySQL/MariaDB配置文件的风格:
ini风格的配置文件;即:分段式配置文件;
为MySQL的各应用程序提供与之对应的配置参数信息:
服务器端应用程序:
[server]
socket=
datadir=
basedir=
[mysqld]
socket=
[mysqld_safe]
socket=
[mysqld_multi]

    客户端应用程序:
        [client]
        user=
        password=
        host=
        [mysql]
        user=
        password=
        host=
        [mysqladmin]
        [mysqldump]

配置文件中各参数的定义方法:
    PARAMETER_NAME = VALUE
    PARAMETER_NAME=VALUE
    PARAMETER_NAME

    innodb_file_per_table = ON
    innodb-file-per-table = ON
    defaults-file=/tmp/my.cnf
    defaults_file=/tmp/my.cnf

    skip_name_resolve=ON
    skip_name_resolve

MySQL/MariaDB的程序环境:
程序文件:
服务器端程序:
mysqld_safe、mysqld_multi
客户端程序:
msyql、mysqladmin、mysqldump、...
服务器端辅助管理工具程序:
myisam*、my_print_defaults、mysql_secure_installation、mysql_install_db、...

mysql命令
交互式命令行工具和非交互式命令行工具;
-u, -h, -p, -P, -D, -S, -e
技术分享图片

交互式模式:
客户端命令:
?(\?,\h), \c, \d, \g, \G, \q, ., !, \s, \u, ...

    服务器端命令:
        SQL语句,需要使用语句结束符;
        help COMMAND

        DDL:
        CREATE、DROP、ALTER、SHOW;
        DML:
        SELECT、INSERT、UPDATE、DELETE;
        DCL:
        GRANT、REVOKE;

mysql命令支持mysql脚本的执行:
mysql [options] [DB_NAME] < /PATH/TO/SOME_SQL_SCRIPT_FILE
技术分享图片
技术分享图片

mysqladmin命令:
mysqladmin - client for administering a MySQL server
常用选项:
-u, -h, -p, -P, -D, -S
各选项功能同mysql命令的选项功能;

常用子命令:
create db_name:创建数据库;
技术分享图片
技术分享图片

drop db_name:删除数据库;

技术分享图片

flush-hosts:清除服务器缓存中所有信息;
flush-logs:清除日志,让日志滚动;
flush-privileges:刷新授权表;
flush-tables:为表加锁;
password new-password:为指定的用户设置新密码;

技术分享图片
技术分享图片
start-slave:在msyql的集群服务中的从节点启动用于实施复制功能的线程;
stop-slave:在msyql的集群服务中的从节点关闭用于实施复制功能的线程;
shutdown:停止服务;

mysqld_safe命令:用于启动mysql服务,定义mysql的工作特性;
格式:/usr/bin/mysqld_safe [OPTIONS]
注意:所有给出的 OPTION(--option)都是一次性生效;如果期望配置参数永久有效,需要将此类配置参数及参数值直接定义在配置文件中即可;

服务器运行时变量/服务器运行时参数:MySQL的运行工作特性;这里特性有两种:
            1.全局特性:
                在全局范围均有效的服务器参数所配置定义的工作特性;将会作为每个mysql的会话连接的默认特性参数;

            2.会话特性:
                仅针对于本次mysql的连接会话生效的特性参数;

            查看已经生效的mysql运行参数(特性,变量)
                SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]

查看所有名字中包含innodb字样的服务器参数及参数值;可以一次显示多个;
技术分享图片

仅查看指定名称的服务器参数的参数值;
技术分享图片

仅查看指定名称的服务器参数的参数值;
技术分享图片

    服务器状态参数/服务器状态变量:MySQL工作时的统计信息;有两种状态参数:
            1.全局
            2.会话

            查看与状态及统计信息相关的参数/变量的值;
                SHOW [GLOBAL | SESSION] STATUS [like_or_where]

查看所有名字中包含innodb字样的服务器状态参数及其值;可以一次显示多个;
技术分享图片

仅查看指定名称的服务器状态参数的值;
技术分享图片

    服务器变量/服务器参数的修改或调整方法:
            1.运行时修改:
                MariaDB [(none)]> SET [GLOBAL|SESSION] system_var_name = expr;
                MariaDB [(none)]> SET @@[GLOBAL.|SESSION.]system_var_name = expr;
    ![](http://i2.51cto.com/images/blog/201807/23/160ba485e1b067c1f87a5392e756c9f1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
    ![](http://i2.51cto.com/images/blog/201807/23/70804904a58b8d1a8fad65e46d4a2c2c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
    2.永久修改:
                通过在配置文件中直接书写服务器参数或变量的赋值语句;重启服务即可生效;
    ![](http://i2.51cto.com/images/blog/201807/23/2253b7ea1a1c1495b67880bfc7144aa3.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

mysql_secure_installation命令:安全初始化脚本;
技术分享图片
按照操作一步步做就行;

SQL_MODE和数据类型详解

SQL:结构化查询语言;在IBM公司发布了一些标准后,之后由ANSI(美国国家标准委员会)又重新定义发布了一些标准:SQL-86,SQL-89,SQL-92,SQL-99,SQL-03

每一个标准内部又有不同的宽松程度的规定(SQL_MODE),在MariaDB/MySQL中有:

ANSI:宽松模式。对于插入的数据进行校验,如果该数据不符合字段定义的数据类型或长度要求,则对数据类型进行调整,也可以对数据进行截取保存,发送warning警告;

TRADITIONAL:严格模式。对于插入的数据进行校验,如果该数据不符合字段定义的数据类型或长度要求,报告Error错误警告,且错误数据不会被写入;
该模式用于事务时,此前可能已经进行了一系列的数据插入和修改操作,而一旦发送上述错误,此前所有的INSERT/UPDATE等操作均会被立即放弃并回滚。
该模式用于非事务时,一旦发送上述错误,则此前所有的INSERT/UPDATE等操作均不会回滚

STRICT_TRANS_TABLES:严格模式。对于插入的数据进行校验,如果该数据不符合字段定义的数据类型或长度要求,报告Error错误警告,且错误数据不会被写入;

STRICT_ALL_TABLES:严格模式。对于事务型操作,与STRICT_TRANS_TABLES模式效果一样;对于非事务操作,与TRADITIONAL模式效果一样。

实时修改sql_mode:
技术分享图片
技术分享图片

永久修改/etc/my.cnf:然后重启服务即可
技术分享图片
注意:
1.没有最好或最差的模式,只有最合适的模式;
2.使用上述SQL命令只能一次性生效,如果想要永久修改,则需要编辑配置文件;

MySQL的数据类型:

字符型:
    CHAR(#),BINARY(#):定长字符类型;CHAR类型不区分字符大小写,BINARY类型区分;
    VARCHAR(#),VARBINARY(#):变长字符类型;
    TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT;
    BLOB:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB;

数值型:
    浮点型:近似值;
        单精度
        双精度
        REAL
        BIT
    整型:精确值;
        INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT;
        BOOLEAN
        DICIMAL
        OCTAL
        HEXIMAL
    日期时间型:
        日期型:DATE 2018/07/19
        时间型:TIME 9:38:42
        日期时间型:DATETIME 2018/07/19 9:38:42
        时间戳:TIMESTAMP,数值型的整型;
    内建类型:
        ENUM:枚举;
        SET:集合;
    数据类型的修饰符:
        字符型:NULL, NOT NULL, DEFAULT ‘STRING‘,CHARACTER SET ‘CHARSET‘, COLLATION "COLLATION";
        整型:NULL, NOT NULL, DEFAULT ‘VALUE‘, AUTO_INCREMENT, UNSIGNED;
        日期时间型:NULL, NOT NULL, DEFAULT ‘DATE/TIME/DATETIME‘

SQL语句使用入门

DDL:数据库对象;
获取DDL相关SQL语句的方法:
MariaDB [testdb]> help data definition

    数据库对象:
    DATABASE, TABLE, VIEW, FUNCTION, preCEDURE, INDEX, ...

DML:数据;
获取DML相关SQL语句的方法:
MariaDB [testdb]> help data manipulation

数据操纵:
    INSERT/REPLACE, DELETE, UPDATE, SELECT, ...

DDL:
创建数据库:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]

修改数据库的字符集或排序规则:
    ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name  | [DEFAULT] COLLATE [=] collation_name]

删除数据库:
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

技术分享图片
技术分享图片
技术分享图片

技术分享图片

表:
创建表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]

        //使用SQL语句全新的定义出一张新表,包括表的名称、字段数量、数据类型、存储引擎的选择等各种属性;
    Or:
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
        [(create_definition,...)]
        [table_options]
        [partition_options]
        select_statement

        //利用SELECT语句的查询结果来填充新表的内容,但是新表的表格式可能与基表不一致,很多的数据类型的修饰符可能会丢失;

    Or:

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
        { LIKE old_tbl_name | (LIKE old_tbl_name) }

        //直接复制基本的表格式到新表上,但新表中没有任何数据,即为空表;

    注意:
        1.对于MySQL或MariaDB的表来说,存储引擎是非常重要的概念,通常需要在创建表的时候来指定;如果没有明确指定,则使用默认的存储引擎;
        2.对于已经创建完成的空表,可以任意调整其存储引擎;
        3.对于非空表,不建议直接修改表的存储引擎;
        良心建议:在创建表之初或者存储数据之前,确定表的存储引擎;

技术分享图片

删除表:
    DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]

    建议:使用修改表名称的方式使指定表不再被继续使用;

技术分享图片

修改表格式:
    ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...]

    可以修改的内容:
        ADD:字段,索引,约束,键(主键,唯一键,外键)
        CHANGE:字段名称,字段定义格式和字段的位置;
        MODIFY:字段定义格式和字段的位置;
        DROP:字段,索引,约束,键;
        RENAME:修改表名称;

查看表结构:
    DESC [db_name.]tbl_name;

技术分享图片

查看表的定义方式:
    SHOW CREATE TABLE tbl_name;

技术分享图片

查看表的状态和属性信息:
    SHOW TABLE STATUS [from | in db_name] like ‘PATTERN‘ | where expr;

技术分享图片

视图:VIEW,虚表;
就是一个SELECT语句的执行结果;

创建视图:
    CREATE VIEW view_name [(column_list)] AS SELECT clause;

技术分享图片

删除视图:
    DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]

技术分享图片

注意:
    能否在视图中实现插入新的数据记录,取决于基表中没有被视图选择的字段是否要求不能为空,如果有此类约束,则结果是无法插入新数据;否则可以插入新数据,没有被视图选择的字段内容,默认都为"NULL";

索引:
索引的类型:
聚集索引、非聚集索引:
聚集索引:索引和数据存放在一起,找到索引即找到数据;
非聚集索引:索引和数据不存放在一起,索引通过索引指针指向数据所在位置;

    稠密索引、稀疏索引:是否索引了每一条数据记录;
        稠密索引:每条数据记录都有一条索引与之对应;
        稀疏索引:并不是每条数据记录都有一条索引与之对应,而是一条索引对应某个或某些数据块;

    主键索引、辅助索引:
        BTree:Balance Tree,B- Tree,BTree,B+Tree
            左前缀索引:

        注意:在使用BTree索引进行检索时,给出的PATTERN的最左侧字符不要出现通配符,否则,无法使用索引进行检索;只能全文遍历;

        Hash索引:

        R Tree:Spacial,空间索引;
        FULLTEXT:全文索引;

    覆盖索引:索引中的内容就是要检索的内容,通过检索索引内容即可立即找到数据,并直接返回检索结果;

    EXPLAIN:分析查询语句的执行路由;

创建索引:
    1.在创建表时,通过指定主键或唯一键,可以自动创建索引;
    2.如果在创建表时,没有指定主键或唯一键,则可以在表成功创建之后添加索引;

    CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ...

技术分享图片

查看索引:
    SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]

技术分享图片

删除索引:
    DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name

技术分享图片

DML:操纵数据;
INSERT/REPLACE、DELETE、UPDATE、SELECE

INSERT:向表中插入新的数据记录;每次可以向表中插入一行或多行数据;
    INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

技术分享图片
技术分享图片

        没有明确的规定字段名称,则意味着为一行中的各个字段添加数据内容:

技术分享图片

技术分享图片

        注意:添加的数据内容,必须要严格的对应每个数据字段,需要保证数据类型的匹配;

    INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...

技术分享图片
技术分享图片

    INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
        将后面SELECT语句的查询结果插入到选中的目标表中;注意下列问题:
            1.SELECT语句的查询结果中包含的字段数量,应该和目标表中的指定字段数量相同;
            2.SELECT语句的查询结果中包含的各字段的数据类型,必须要与目标表中各字段的数据类型保持一致;

        此种插入数据的方法,更多的用于表复制操作;
            此前曾经使用CREATE TABLE命令通过复制表格式的方式创建过一个空的新表,然后再将原表中的数据以方法复制到新表中;

REPLACE命令与INSERT命令的功能几乎完全相同,除了一种特殊情况之外:
    当向表中插入数据时,如果主键位置或唯一键位置出现重复数据时,不会继续插入而是选择替换对应行中各字段的数据;

DELETE:
Single-table syntax:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]

Multiple-table syntax:
    DELETE tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition]

    DELETE FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition]

注意:默认情况下,MySQL或MariaDB都不会阻止不带有WHERE条件子句的删除操作,这将意味着,有可能会因为此操作导致清空整张表中的数据;

限制条件:
    WHERE where_condition
    LIMIT row_count
    ORDER BY ... LIMIT row_count
    WHERE where_condition LIMIT row_count
    WHERE where_condition ORDER BY ... LIMIT row_count

删除正常的查询结果中的前三行数据记录;
技术分享图片

删除Age字段中值小于20的所有数据记录;
技术分享图片

删除Name字段以"H|h"开头的所有数据记录中的前两条记录;
技术分享图片

UPDATE:
Single-table syntax:
UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]

Multiple-table syntax:
    UPDATE table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]

注意:默认情况下,MySQL或MariaDB都不会阻止不带有WHERE条件子句的修改操作,这将意味着,有可能会因为此操作导致整张表中的所有数据记录被同时修改;

限制条件:
    WHERE where_condition
    LIMIT row_count
    ORDER BY ... LIMIT row_count
    WHERE where_condition LIMIT row_count
    WHERE where_condition ORDER BY ... LIMIT row_count

注意:在MySQL或MariaDB中,如果服务器变量sql_safe_updates=ON,则可以阻止不带有限制条件的UPDATE更新操作或DELETE删除操作;

SELECT
Query Cache:MySQL/MariaDB的查询结果缓存;
K/V对存储;
Key:查询语句经过hash之后的hash值;
Value:查询语句的执行结果;

MySQL/MariaDB的查询执行路径:
    1.用户发送请求 --> 查询缓存(命中) --> 响应用户;
    2.用户发送请求 --> 查询缓存(未命中) --> 解析器 --> 预处理器 --> [查询优化器 -->] 查询执行引擎 --> 存储引擎 --> 查询执行引擎 --> [缓存查询结果 -->] 响应用户;

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE ‘file_name‘
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE ‘file_name‘
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

DISTINCT:数据去重;即:重复出现的数据仅显示一次;

SQL_CACHE:
    显式的指出必须将此次的查询语句的执行结果存放至查询缓存;

SQL_NO_CACHE:
    显式的指出绝对不能将此次的查询语句的执行结果存放至查询缓存;

    query_cache_type服务器变量是MySQL的缓存开关,通常有三个取值:
        1.ON:启用缓存功能;
            默认缓存所有符合缓存条件的查询结果;除非使用SQL_NO_CACHE参数明确指出不缓存查询结果;
        2.OFF:关闭缓存功能;
            默认不缓存任何查询结果;仅能缓存使用SQL_CACHE参数明确的指出的查询结果;
        3.DEMAND:按需缓存;
            如果明确指出SQL_CACHE,即缓存查询结果,否则,默认隐式关闭查询缓存;

    query_cache_limit            | 1048576
    query_cache_min_res_unit     | 4096

    select_expr:
        *:表示表中的所有字段(列);
        col1,col2,...coln:普通的列名列表;通常用于执行投影运算;
        col_name1 as col_alias1,col_name2 as col_alias2, ...
            对于查询结果中的各字段名称使用别名进行重定义;

    table_references:
        [db_name.]tbl_name
        db_name.*
        [db_name.]tbl_name1,[db_name.]tbl_name2, ...
        [db_name.]tbl_name1 as tbl_alias1,[db_name.]tbl_name2 as tbl_alais2, ...

单表查询:
    select select_expr1,select_expr2,... from tbl_name where expr group by col_name having expr order by col_name limit

    WHERE条件子句:
        通过指明特定的过滤条件或表达式来实现"选择"运算;过滤条件有下列几种:
            1.算术表达式:Age+10,
                算术操作符:+, -, *, /, %;
            2.比较表达式:Age+10<20;
                比较操作符:=, <=>, <>, !=, >, >=, <, <=;
            3.逻辑表达式:
                逻辑操作符:AND, OR, NOT, XOR;
            4.其他表达式:
                空值判断:IS NULL, IS NOT NULL;
                连续区间判断:BETWEEN ... AND ... 相当于<=100  AND >=50;
                列表从属关系判断:IN (LIST);
                模糊值判断:
                    LIKE:可以支持通配符,%和_;如果想要使用索引实现加速检索,则最左侧字符不能使用通配符;
                    RLIKE或REGEXP:可以支持正则表达式元字符;只要在查询条件中包含正则表达式元字符,则一定无法使用索引进行检索;功能很强大,但检索性能可能变差;

    GROUP BY子句:
        根据指定的字段将查询结果进行分组归类,以方便进行聚合运算;
        常用的聚合运算函数:
            avg():取平均值运算;
            max():取最大值运算;
            min():取最小值运算;
            sum():做和运算;
            count():做次数统计;

统计每个班级里面的人数:
技术分享图片

统计每个班级里面所有人的平均年龄:
技术分享图片

统计所有学生中男生和女生的平均年龄:
技术分享图片

HAVING子句:对于经过分组归类并进行了聚合运算以后的结果进行条件过滤;
其条件表达式的书写格式与WHERE子句相同;

统计人数超过3人的班级及其人数数据:
技术分享图片

ORDER BY子句:根据指定的字段将查询结果进行排序,可以使用升序或降序,默认是升序;
升序:ASC
降序:DESC

技术分享图片

LIMIT子句:
对于查询的结果进行限定行数的输出;
LIMIT {[offset,] row_count | row_count OFFSET offset}

        1.LIMIT [offset,] row_count
            offset:偏移量,在输出结果中,从第一行开始(含)跳过的不显示的行数;
            row_count:要显示的行数

显示查询结果中的第二行和第三行;
技术分享图片

        2.LIMIT row_count OFFSET offset

显示查询结果中的第二行和第三行;
技术分享图片

多表查询:
建议:在生成环境中,能使用单表查询即可得到结果的操作,尽可能使用单表查询;因为多表查询会给服务器造成过大的负载压力;

    所谓多表查询,即指通过对多个表内容的查询,以获得具有一定关联关系的查询结果的查询方式;也称为连接操作,连接操作也就是将多张表关联在一起的方法;

    连接操作:
        交叉连接:
            也称为笛卡尔积连接;

        内连接:
            等值连接:让表和表之间通过某特定字段的等值判断的方式建立的内连接;

            非等值连接:让表和表之间通过某特定字段的不等值判断的方式建立的内连接;在极少的场合中才有应用;

        外连接:以某张为基准表,判断参考表与基准表之间的连接关系;
            左外连接:
                以左表为基准表,右表为参考表,显示出基准表中所有的行,并将参考表中与基准表中有关联关系的行合并输出,如果基准表中的行与参考表中无关,则输出NULL;

                连接操作符:LEFT JOIN

            右外连接:
                以右表为基准表,左表为参考表,显示出基准表中所有的行,并将参考表中与基准表中有关联关系的行合并输出,如果基准表中的行与参考表中无关,则输出NULL;

                连接操作符:RIGHT JOIN

        自然连接:
            通过MySQL的进程自行判断并完成的连接过程。通常MySQL会使用表中的名称相同的字段作为基本的连接条件;

            连接操作符:NATRUAL INNER

            自然外连接:

            自然左外连接:
                连接操作符:NATURAL LEFT JOIN

            自然右外连接:
                连接操作符:NATURAL RIGHT JOIN

        自连接:
            人为的将一张表中的两个字段之间建立的连接关系;

交叉内连接:
每个学生所在的班级名称:
技术分享图片

交叉左外连接:
每个学生所在班级的名称,即使该学生不属于任何班级:
技术分享图片

交叉右外连接:
每个班级的学生姓名,即使该班级中没有任何学生;
技术分享图片

子查询:嵌套查询;
在SELECT查询语句中嵌套另一个SELECT查询语句;等同于从某个视图中获取查询结果;

    SELECT col1,col2,* FROM tbl_name WHERE col OPTS VALUE;

用于WHERE子句中的子查询:
查询学生中年龄大于全班平均年龄的学生的姓名和年龄;
技术分享图片

用于IN子句中的子查询:
查询学生的年龄和老师的年龄相同的学生的名字:
技术分享图片

                查询学生的年龄和老师的年龄相同的学生和老师的名字:

技术分享图片

用于FROM子句的子查询:
查询所有班级的学生对应的班级名称:
技术分享图片

联合查询:
将多张表的内容通过多个SELECT语句查询得到的结果组合输出;

    注意:使用联合查询的前提条件:
        多张表需要有相同数据类型的字段;

        操作符:UNION

技术分享图片

MySQL之用户账户管理详解:
在MySQL上能够实施的用户账户的管理操作:
CREATE USER
DROP USER
GRANT
RENAME USER
REVOKE
SET PASSWORD

MySQL中的权限类别:
    库级别;
    表级别;
    字段级别;
    管理类;
    程序类;

    管理类的权限:
        CREATE USER
        DROP USER
        RELOAD
        LOCK TABLES
        REPLICATION CLIENT
        REPLICATION SLAVE
        SHUTDOWN
        FILE
        SHOW DATABASES
        PROCESS
        SUPER

    程序类的权限:
        FUNCITION
        PROCEDURE
        TRIGGER
        操作:CREATE,ALTER,DROP,EXECUTE

    库级别的权限:
        CREATE
        ALTER
        SHOW
        DROP
        INDEX
        CREATE VIEW
        SHOW VIEW
        GRANT OPTION:能够将管理员自身获得的权限生成一个副本,并转赠给目标用户;

    表级别的权限:
        INSERT
        DELETE
        UPDATE
        SELECT
        REPLACE

    字段级别(列级别)的数据操作的权限:
        SELECT(cil1,col2,...)
        UPDATE(cil1,col2,...)
        INSERT(cil1,col2,...)

    所有的权限:
        ALL
        ALL PRIVILEGES

    MySQL的元数据数据库:mysql
        数据字典数据库:
            host
            db
            user

            column_pric
            procs_priv
            proxies_priv
            tables_priv

            上述元数据数据库中的表统称为"授权表";    

            如果对于授权表的内容进行了修改,MySQL每300秒会自动重读并使新设置生效;

            如果不打算等待,可以手动刷新授权表;
                MariaDB [mysql]> FLUSH PRIVILIGES;

MySQL用户管理:
    ‘Username‘@‘Hostname‘
    Username:任意的字符串组合,只能包含基本意义的字符串;可以包含"_ "、"."、" -";
    Hostname:
        FQDN
        Domain_name
        IP_ADDR
        可以使用MySQL的专用通配符;%,_

    创建用户账户:
        CREATE USER语句;
        CREATE USER user [IDENTIFIED BY [PASSWORD] ‘password‘ | IDENTIFIED WITH auth_plugin [AS ‘auth_string‘]]

技术分享图片

也可以使用DML语句创建用户账户:
INSERT INTO mysql.user SET User=‘USER_NAME‘,Host=‘%‘,Password=‘PASSWORD(password)‘
技术分享图片
技术分享图片

重命名用户账户:
RENAME USER old_user To new_user [,old_user to new_user] ...
技术分享图片
技术分享图片

删除用户账户:
DROP USER;
技术分享图片
技术分享图片

用户账户的密码管理:
1.SET PASSWORD语句:
SET PASSWORD [FOR user] = {PASSWORD(‘cleartext password‘)
技术分享图片
技术分享图片

    2.也可以使用DML语句修改用户账户密码;

技术分享图片
技术分享图片
技术分享图片

    3.mysqladmin工具;
        mysqladmin -uuser_name -hHOSTNAME -p password ‘NEW_PASSWORD‘

        注意:执行此操作的MySQL用户需要对用户进行权限授权;

忘记MySQL管理员的密码的解决方法:
方法一:
1.停止当前的MySQL或MariaDB服务;
2.在/etc/my.cnf文件中加入下列两条服务器参数;
skip-grant-tables=ON
skip-networking=ON
3.启动MySQL或MariaDB服务,使用mysql客户端工具以空密码登录并修改root密码;
4.从/etc/my.cnf文件中添加的两条语句删除;在重启服务;

    方法二:
        1.停止当前的MySQL或MariaDB服务;
        2.使用mysqld_safe --skip-grant-tables --skip-networking在前端启动mysql;
        3.在另一台服务器上使用mysql客户端工具以空密码登录并修改root密码;
        4.kill掉第二步中的任务;

对于已经建立的用户或未建立的用户进行授权:
GRANT语句:
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]

        priv_type:
            GRANT SELECT, INSERT, UPDATE, DELETE,CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER,SHUTDOWN FILE,SHOW DATABASES,PROCESS,SUPER

        object_type:
            TABLE | FUNCTION | PROCEDURE

        priv_level:
            * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name

            *:表示所有的数据库;
            *.*:表示所有库中的所有表对象;
            db_name.*:表示指定数据库中的所有表对象;
            db_name.tb1_name:表示指定数据库中的指定的表对象;
            tbl_name:表示当前正在使用的数据库中的指定的表对象;
            db_name.routine_name:表示指定数据库中的指定存储函数后存储过程对象;通常要使用object_type参数共同决定;

        user_specification:
            user [IDENTIFIED BY [PASSWORD] ‘password‘ | IDENTIFIED WITH auth_plugin [AS ‘auth_string‘]]

        ssl_option:
            SSL | X509 | CIPHER ‘cipher‘ | ISSUER ‘issuer‘ | SUBJECT ‘subject‘

        with_option:
            GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count

技术分享图片
技术分享图片
//因为授权只对该用户授权了hellodb数据库的所有权限,所以除了hellodb其他的数据库看不到;

技术分享图片
技术分享图片
技术分享图片
技术分享图片
//这个设置,使得改用户只能对对应数据库中的特定项查看,其他选项虽然有,但是他没权限查看;

取消授权/收回授权:
REVOKE语句:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...

        REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

注意:取消已经做出的授权时,REVOKE语句所指定的priv_level部分应该和授权时GRANT语句所指定的priv_level保持绝对一致;否则判定此次取消授权的操作失败;

技术分享图片
技术分享图片

技术分享图片
//我授权的时候,是对hellodb.*操作,然后取消授权的时候是hellodb.students,这样是错误的

查看用户的授权:
SHOW GRANTS:
SHOW GRANTS [FOR user]
技术分享图片

MySQL的存储引擎:
存储引擎也称为表类型:表级别的概念;
原则上来说,每张表都可以独立的使用某一个存储引擎;
但是出于稳定性考虑,在同一个数据库中的多张表最好选择同一种存储引擎;

对于MySQL或MariaDB来说,支持插件式存储引擎;
        默认情况下,如果使用RPM包安装的MySQL或MariaDB,插件文件所在的目录为:/usr/lib64/mysql/plugin

查看引擎:
技术分享图片

    安装一个插件:
        INSTALL PLUGIN plugin_name SONAME ‘shared_library_name‘

        plugin_name的响应内容,可以参考官方站点:
            http://dev.mysql.com/doc/refman/5.5/en/plugin-data-structures.html

技术分享图片
技术分享图片

        注意:使用此方法安装插件(存储引擎)之后,会立即自动激活;

    卸载一个插件:
        UNINSTALL PLUGIN plugin_name

技术分享图片

    注意:每张表只能使用一个存储引擎;如果在创建表时没有给出指定的存储引擎;MySQL会将新建表的存储引擎

    使用SHOW ENGINES命令查看时,support字段的值为DEFAULT的即为当前MySQL的默认存储引擎;当前版本的MariaDB中,默认存储引擎为InnoDB;

在创建表时,可以使用的一个选项:
CREATE TABLE tbl_name (...) ENGINE [=] engine_name;

    在表创建之后,插入数据之前,可以修改存储引擎的类型:
        ALTER TABLE tbl_name ENGINE [=] engine_name
        示例:
            MariaDB [xwl]> alter table x2 engine = MyISAM;

        注意:不同的存储引擎对于数据的管理方式会不同,有时可能会有很大区别,因此,对于空表来说,可以任意修改其存储引擎,对于已经存放了数据的表来说,强烈不建议修改表的存储引擎;

当前MySQL系统上可用的存储引擎:
MyISAM:
最经典的MySQL存储引擎;对于MyISAM而言,有一个缺陷——如果MySQL运行时因意外崩溃,再重启时需要对标进行修复,而MyISAM存储引擎无法保证表的安全修复;
Aria:
具有崩溃后安全洗浴表特性的增强版的MyISAM存储引擎;
InnoDB:
CSV:
基于文件存储数据的存储引擎;跨数据库实现数据彼此交换时,比较有用;但CSV中存放的浮点类型的数据一定会损失数据精度;
MRG_MYISAM:
用于实现将多个MyISAM表在逻辑层上连接在一起,用户就像使用一张表一样去使用多张表;
BLAKHOLE:
黑洞存储引擎,在级联复制时比较有用;一般用于记录binlog做复制的中继;
MEMORY:
内存级的存储引擎;无法实现数据持久功能多用于作为临时表(内存表)的存储引擎;MEMORY是唯一的支持用户显示定义hash索引的存储引擎,因此期查询速度是非常快的;
PERFORMANCE_SCHEMA:
显示MySQL运行过程中的状态参数和统计数据;这些统计数据本身是MySQL内部的专有数据结构,但是有时用户需要查询这些信息,因此PERFORMANCE_SCHEMA就将此类数据虚化成一个MySQL认可可以使用的关系型接口;
ARCHIVE:
归档存储引擎,通常用来做数据仓库;这种类型的存储引擎一般仅支持select和insert语句,且本身不支持索引。适合于存放大量独立的作为历史记录的数据。ARCHIVE存储引擎拥有高效的插入速度,查询速度相对较慢,用于日志记录和聚合函数分析较合适;

MyISAM存储引擎:
    优点:
        支持全文索引(FULLTEXT INDEX),可以实现类似于搜索引擎的功能;实施数据的高效检索
        支持R TREE索引(空间函数的支持(GIS))
        支持数据的压缩存储;一旦数据被压缩,使得数据的占用空间更小,但是只能检索;
        支持复杂的行格式定义:
            ROW_FORMAT [=] {DEFAULT|DYnAMIC|FIXED|COMpreSSED|REDUNDANT|COMPACT}

    缺点:
        不支持事务;
        锁粒度粗糙,仅支持表级锁;
        崩溃后无法保证表能够进行安全修复;(Aira)

MyISAM存储引擎的使用场景:
    1.只读或都多写少的场景,
    2.较小的表,以保证崩溃后修复的时间较短,数据丢失较少;

MyISAM存储引擎管理数据表的方式:
    每个由MyISAM存储引擎管理的表,都包含三个文件,直接存储于数据库目录中;
        tbl_name.frm:format,表格式定义的内容;
        tbl_name.MYD:MyISAM Data,表中的数据内容;
        tbl_name.MYI:MyISAM Idenx,表中可用的索引;

总结:
    性能:
        表级锁,并发访问性能相对较差,尤其是写锁,阻塞所有的读操作,串行访问;
        支持非聚集索引,全文索引及空间索引,检索数据时的速度和效率相对较高;
        表压缩,只能读,无法接受写操作请求;
        延迟的索引更新,比较合理的利用磁盘IO的性能;

    数据安全:
        支持手动或自动修复,但可能会导致数据丢失;

InnoDB:
    Sleepycat
    Berkeley DB:

    InnoDB,研发了InnoDB存储引擎,参考了Oracle的主流存储引擎;

    Percona;
        InnoDB --- Percona-XtraDB, Supports transactions, row-level locking, and foreign keys

        ACID:
            AUTOMICITY:原子性;
            CONSISTENCY:一致性;
            ISLATION:隔离性;
            DURABILITY:持久性;

    特点:
        1.InnoDB存储引擎将数据存储于"表空间"中;(Table Space)
            表空间是一个自组织的自管理的文件系统;
            默认的表空间是所有表在同一个表空间中;即所有的表在同一个文件中;

            innodb_file_per_table=OFF
                意味着所有的InnoDB存储引擎所管理的表,包括数据,表格式及索引都在同一个表空间中;

                                            

本类排行

今日推荐

热门手游