首页 > 代码库 > MySQL基础实战

MySQL基础实战

 

一.数据库基础:

DBMS:数据库管理系统(Database Management System)

RDBMS:关系数据库管理系统(Relational Database Management System)

        C/S:通过专有协议

         关系模型:表(行,列),二维关系

         范式:第一范式,第二范式,第三范式;

        关系运算:

           选择

           投影

        数据库:表,索引,视图(虚表)

        SQL:结构化查询语言

           DDL:数据定义语言

           DML:数据操作语言

        编程接口

           自行定义存储过程

           自行定义存储函数

           触发器:

           时间调度器:类似Linux中的定时任务

           过程式编程:选择、循环

        三层模型

           物理层:表空间(管理)

            逻辑层:表,索引,视图(DBA)

           视图层:用户角度视图(用户)

        解决方案

           Oracle,Sytbase,Informix,DB2(IBM)

           Mysql,MariaDB,Postgresql,SQLite,

 

二.MySQL基础

   版本:---5.1---5.5---5.6---5.7

   MariaDB:

        插件式存储引擎:

        单进程多线程:

           连接线程:维护用户连接

           守护线程:对应的数据写入到磁盘上

   Mysql配置文件:集中式配置,能够为mysql的多个应用程序提供配置信息

        [mysqld]:mysql的服务器

        [mysqld_safe]:mysql的的启动服务器

        [mysqld_multi]:单机多实例配置,适合集中管理

        [server]:mysql服务端

        [mysql]:mysql数据存放

        [mysqldump]:mysql数据导出

        [client]:mysql客户端

安装方式

           os vendor:rpm

           MySQL:

              rpm

              展开可用

              源码,编译

安装后的设定:

           (1)为所有root用户设定密码:

              mysql>set passwrod

              mysql>update mysql.user SET password=PASSWORD(‘you_passwd‘) WHERE cluase;

              #mysqladmin:命令行设置

            (2)删除所有匿名用户

             mysql>DROP USER ‘‘@‘localhost‘;

          

              上述两步骤可运行命令:mysql_secure_installation即可设置

            (3)建议关闭主机名反解功能:

[mysqld]
skip-name-resolve

   元数据数据库:mysql,user,host等

        获取元数据有三种思路,第一种,各种show,第二种,各种select,第三种,是mysql的命令行下的命令,不是sql语句

1show

[sql] 
show databases; --列出所有数据库  
show create databasedb_name;  --查看数据库的DDL  
show tables; --列出默认数据库的所有表  
show tables from db_name; --列出指定数据库的所有表  
show table status; --查看表的描述性信息  
show table status fromdb_name;  --查看具体表的信息
show create table tbl_name; --查看表的DDL  
show columns from tbl_name; --查看列信息  
show index from tbl_name; --查看索引信息

有几种show语句还可以带有一条like ‘pattern‘字句,用来限制语句的输出范围,其中‘pattern‘允许包含‘%‘和‘_‘通配符,比如下面这条语句返回domaininfo表中以s开头的所有列:

showcolumns from domaininfo like ‘s%‘;

 

2select

像上面这张支持like字句的所有show都可以改写成一条where字句,如:

showcolumns from domaininfo where field=‘sysdomain‘;

:desc tbl_name和explain tbl_name的效果和show columns from tbl_name一致。

 

从INFORMATION_SCHEMA数据库里查询相关表

INFORMATION_SCHEMA是MySQL自带的一个系统数据库,它里面存储了所有的元数据,通过select里面的相关表就可以获取你想要的元数据。和show语句相比,它比较麻烦,但它的好处是标准的SQL语句,更具有可移植性,且更灵活,可以通过各种表达式获取你真正需要的信息。

 

3:从命令行获取元数据

前面两种方法都必须得在MySQL命令行里执行,而mysqlshow和mysqldump提供了从OS命令行获取元数据库的方法,如:

mysqlshow  --列出所有数据库   例:mysqlshow-uroot -p123456

mysqlshow db_name  --列出给定数据库的所有表 

mysqlshow db_name tbl_name  --列出给定数据库表的所有列 

mysqlshow --keys db_name tbl_name  --列出索引信息 

mysqlshow --status db_name  --列出数据库的描述性信息 

mysqldump可以让你看到create table语句(就想show create table语句一样),如:

[sql]

mysqldump --no-data db_name [tbl_name] ...

 

注意:在用mysqldump查看表结构时,一定要加上--no-data,否则你看到的将是数据库表里的数据

 

   mysql--->mysqld    C/S架构

           客户端程序:

              mysql:交互式的client工具

              mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保                      存文本文件中;

              mysqladmin:基于mysql协议管理mysqld;

              mysqlimport:数据导入工具(但并不是mysqldump导出的数据)

           非客户端类的管理工具:

              myisamchk,myisampack 

          

           如何获取程序默认的使用配置:

              mysql --print-defaults:获取mysql客户端程序默认的配置

              mysqld --print-defaults:获取mysql服务端程序的默认配置

           客户端类应用程序的可用选项:

              -u --user=               :用户

              -h --host=               :主机IP

              -p --password=           :密码

              -P --port=               :端口

              --portcol=(tcp|sock)     :协议

              -s --socket=             :Linux默认连接范式,mysql还可以使用TCP进行连接

              -D --database=           :数据库名

              -c --compress             :mysql压缩

             

              mysql -e"SQL"  命令行执行命令,不进入交互式运行

                                       例:mysql -uroot -p123456 -e "show databases;"

 

mysql的使用模式:

           交互式模式:

              可运行命令有两类:

                 Mysql>\h

Mysql>help

                 服务器端命令:

                    SQL,需要语句结束符;

           脚本模式:

                 #mysql -uusername -hHOST -pPASSWORD</path/from/somefile.sql

                 mysql>source/path/from/somefile.sql

 

   服务器端( mysqld):工作特性有多种定义方式

              命令行选项

              配置文件参数

                 获取可用参数列表:mysqld --help --werbose

              获取运行中的mysql进程各参数及其值:

                 mysql>SHOWGLOBAL VARIABLES;      

                 mysql>SHOWSESSION VARIBLES;

                 注意:其中有些参数支持运行时修改,有些参数不支持,且只能通过修改配置文件,并重启服务器程序                      生效。

                       有些参数作用域是全局的,不可改变;有些可以为每个用户单独提供的设置。

                   

              修改服务器变量的值:

                 mysql>help SET      获取语法

             

                 全局:

                    mysql>SET GLOBALsystem_var_name=value;

                    mysql>SET@@global.system_var_name=value;

                 会话:

                    mysql>SET [SESSION]system_var_name=value;

                    mysql>SET@@[session.]system_var_name=value;

              状态变量:用于保存mysql运行中的统计数据的变量;

                    mysql>SHOW GLOBAL STATUS;

                    mysql>SHOW [SESSION]STATUS;

 

 

三.SQL语句基础

SQL标准:ANSI SQL标准

SQL-86,SQL-89,SQL-92,SQL-99,SQL-03

 

mysql 数据类型

字符型

数值型

日期时间型

内建类型:

 

字符型:

    char,binary:定长数据类型

    VARCHAR,VARBINWRY:变长数据类型;需要结束符

    TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT

    BLOB:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB

    MEUM,SET

数值型:

    精确数值型:

       整型:微整形,小整型,中等整型,大整型

       十进制型:十进制

    近似数值型:

       浮点型:单精度,双精度,

    日期时间型:日期(三字节),时间(三字节),日期时间(八字节),时间戳,年份;

    内建型:

字符类型的修饰符:

    NOT NULL:非空约束;

    NULL:空

    DEFAULT ‘STRING‘:指定默认值;

    CHARACTER SET ‘‘:使用字符集

    COLLATION:使用的排序规则

   

    mysql>SHOW CHARACTER SET;

    mysql>SHOW COLLATION;

 

整型修饰符:

    NOT NULL

    NULL

    DEDAULT NUMBER

日期修饰符:

内建类型SET和EMUM的修饰符

 

SQL 模型:定义mysqld对约束等的响应行为:

修改方式:

    mysql>SET GLOBALsql_mode=‘MODE‘;  

    mysql>SET@@GLOBAL.sql_mode=‘MODE‘;

    需要修改权限:仅对修改后新创建的回话有效,对已创建的回话无效

    mysql>SET SESSIONsql_mode=‘MODE‘;

    mysql>SER@@session.sql_mode=‘MODE‘;

常用模型:TRADITIONAL,STRICT_TRANS_TABLES,or STRICT_ALL_TABLES

修改模型之后可以对sqlserver或者oracle兼容

 

SQL语句:DDLDML

      DDL:数据定义语言:主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

 

        CREATE,ALTER,DROP   :创建,添加、删除

        DB组件:数据库、表、索引、视图、用户、存储过程、存储函数、触发器、时间调度器

        CREATE相关的常用命令:(CREATE可以用的,相应的ALTER也可以用)

           CREATE DATABASE     :创建库

           CREATE EVENT      :创建事件

                   CREATE FUNCTION   :创建函数

           CREATE FUNCTION UDF      :

              CREATE INDEX          :创建索引

              CREATE LOGFILE GROUP  :创建测试日志

              CREATE PROCEDURE      :创建程序

              CREATE SERVER         :创建服务

              CREATE TABLE          :创建表

              CREATE TABLESPACE      :创建表空间

              CREATE TRIGGER        :创建触发器

              CREATE USER         :创建用户

              CREATE VIEW         :创建视图

 
    DML:数据操作语言:一般是对数据库里的数据进行操作的语言

 

        INSERT,DELETE,UPDATE,SELECT     :插入、修改、更新、查询

     

      数据库级别:

         CREATE,ALTER,DROP

           {DATABASE|SCHEMA}

           {IF EXISTS}

           {IF NOT EXISTS}

      表级别:二位关系

        设计表:遵循规范;表使用规范,统一规范

        定义:字段,索引

           字段:字段名,字段数据类型,修改符

           约束:索引:应该创建在经常用作查询条件的字段上;

                 索引:实现级别在存储引擎;

                 

              索引分类:

                 稠密索引、稀疏索引

                 B+树索引、hash索引、R树索引、FULLTEXT索引

                 聚集索引、非聚集索引

                 简单索引、组合索引

        创建表:CREATE TABLE

           (1)直接创建

            (2) 通过查询先存的表创建:新表会被直接复制插入查询而来的数据

           (3)通过复制现存的表的表结构创建:不复制数据

          

           注意:Storage Engine是指表的类型,也即在表创建指明其使用的存储引擎

                 同一个库中表要使用同一种存储引擎类型

             

查看表结构:DESCRIBE TABLE_NAME;

       

        修改表:ALERT TABLE

        删除表:DROP TABLE

 

  

四.MYSQL基础架构及SQL语句

 

Mysql架构:

 

1.Connectors

指的是不同语言中与SQL的交互:

     Native C API :调用接口

     JDBC:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API

     ODBC:开放数据库连接(Open Database Connectivity)

2 Management Serveices & Utilities: 

系统管理和控制工具:集群、复制、备份、还原、实例管理控制等信息

 

          

3 Connection Pool: 连接池

连接池,管理缓冲用户连接,线程处理等需要缓存的需求(用户与mysql进行通讯需要走的一座桥)

管理缓冲用户连接,线程处理等需要缓存的需求。

负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,
接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

4 SQL Interface: SQL接口。

接受用户的SQL命令,并且返回用户需要查询的结果。比如selectfrom就是调用SQLInterface

5 Parser: 解析器。

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。
主要功能:
a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b.  如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

6 Optimizer: 查询优化器。

        查询优化器(sql的顺序是:from --> where --> 列名)

SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query语句的结果

他使用的是“选取-投影-联接”策略进行查询。
       用一个例子就可以理解: select uid,name from user where gender =1;
       这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
       这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
       将这两个查询条件联接起来生成最终查询结果

7 Cache和Buffer: 查询缓存。(也就是查询结果缓存在里面)

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集cache 到内存中,与该 query 的一个 hash 值 做
一个对应。该 Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中,Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

8 、存储引擎接口

存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)
现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,NDB
默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术,但是它不支持事务。
InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。
Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。

 

 

Mysql逻辑架构图

 

简略描述:

每个虚线框为一层,总共三层。

第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等。

第二层,核心层:查询解析,分析,优化,缓存,提供内建函数;存储过程,触发器,视图。

第三层,存储引擎层,不光做存储和提取数据,而且针对特殊数据引擎还要做事务处理

 

 

 

 

 

>  在解析查询之前,服务器会“询问”是否进行了查询缓存(只能缓存SELECT语句和相应结果)。缓存过的直接返回结果,未缓存的就需要进行解析查询,优化,重新执行返回结果。

 > 解析查询时会创建一个内部数据结构(树),然后对其进行各种优化。

 > 优化:重写查询,决定查询的读表顺序,选择需使用的索引。

 

 

 

Mysql属于单进程多线程

   用户连接:连接线程

   mysql数据文件类型:

      数据文件、索引文件

      重做日志、撤销日志、二进制日志、磁错误日志、查询日志、慢查询日志、(中继日志)

 

 

五.Msyql的DDL& DML 语句

 

索引:INDEX

   索引管理:

      按特定数据结构存储数据:

   索引类型:

     聚集索引、非聚集索引:数据是否与索引存储在一起;

      主键索引、辅助索引:一一对应的

      稠密索引、稀疏索引:是否索引了每一个数据项

      B+树索引、hash索引、R树索引(空间索引)、全文索引

      简单索引、组合索引

      左前缀索引

      覆盖索引

     

   管理索引的途径:

      创建索引:创建表时指定:CREATE INDEX

      创建或删除索引:修改表的命令

      删除索引:DROP INDEX

      查看表上的索引:

        SHOW{INDEX | INDEXES | KEYS}

            {FROM | IN} tbl_name

            [{FROM | IN} db_name]

            [WHERE expr]

      EXPLAIN:查看执行索引语句的情况

 

视图:VIEW

   虚表:

   创建方法:

      CREATE

          [OR REPLACE]

          [ALGORITHM = {UNDEFINED | MERGE |TEMPTABLE}]

          [DEFINER = { user | CURRENT_USER }]

          [SQL SECURITY { DEFINER | INVOKER }]

          VIEW view_name [(column_list)]

          AS select_statement

          [WITH [CASCADED | LOCAL] CHECK OPTION]

   删除视图:

      DROP VIEW [IF EXISTS]

          view_name [, view_name] ...

          [RESTRICT | CASCADE]

   视图中的数据事实上存储于“基表”中,因此,其修改操作也会针对于基表实现;其修改操作受基表限制

 

 

DML

   INSERT、DELETE、UPDATE、SELECT

 

   INSERT:

      一次插入一行或多行数据:如果一次插入一百行,最好触发一次索引更新

      Syntax:

      INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

          [INTO] tbl_name

          [PARTITION (partition_name,...)]

          [(col_name,...)]

          {VALUES | VALUE} ({expr |DEFAULT},...),(...),...

          [ ON DUPLICATE KEY UPDATE

            col_name=expr

              [, col_name=expr] ... ]

      INSERTtal_name [(col1,...)] VALLUES (vall,...),(val21,...)

 

      Or:

 

      INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

          [INTO] tbl_name

          [PARTITION (partition_name,...)]

          SET col_name={expr | DEFAULT}, ...

          [ ONDUPLICATE KEY UPDATE

            col_name=expr

              [, col_name=expr] ... ]

 

      Or:

 

      INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

          [INTO] tbl_name

          [PARTITION (partition_name,...)]

          [(col_name,...)]

          SELECT ...

          [ ON DUPLICATE KEY UPDATE

            col_name=expr

              [, col_name=expr] ... ]

  

   DELETE:

      DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

          FROM tbl_name[.*] [, tbl_name[.*]] ...

          USING table_references

          [WHERE where_condition]

     

      注意:一定要有限制条件,否则将清空表中的所有数据

      限制条件

        WHERE

        LIMIT

   UPDATE:

      UPDATE [LOW_PRIORITY] [IGNORE] table_reference

          SET col_name1={expr1|DEFAULT} [,col_name2={expr2|DEFAULT}] ...

          [WHERE where_condition]

          [ORDER BY ...]

          [LIMIT row_count]

      注意:一定要有限制条件,否则将修改所有行中的指定字段

      限制条件:

        WHERE

        LIMIT

 

   SELECT:

      重要组件:Query Cache

      查询执行路劲中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎

      SELECT语句的执行流程:

        FROMClause---WHERE Clause---GROUP BY---HAVING Clause--ORDER BY---SELECT--LIMIT

      单表查询:

        SELECT

            [ALL | DISTINCT | DISTINCTROW ]

              [SQL_SMALL_RESULT] [SQL_BIG_RESULT][SQL_BUFFER_RESULT]

              [SQL_CACHE | SQL_NO_CACHE][SQL_CALC_FOUND_ROWS]

            select_expr [, select_expr ...]

            [FROM table_references

              [PARTITION partition_list]

            [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_countOFFSET offset}]

            [FOR UPDATE | LOCK IN SHARE MODE]

 

           DISTINCT:数据去重

           SQL_CACHE:显式指定存储查询结果于缓存中

           SQL_NO_CACHE:显式查询结果不予缓存

           query_cache_type的值为“ON”是,查询缓存功能打开

              SELECT的结果符合缓存条件及会缓存,否则,不予缓存

              显式执行SQL_NO_CACHE,不予缓存;

           query_cache_type的值为“DEMANG”时,查询缓存功能按需进行

              显式指定SQL_CACHE的SELECT语句才会缓存,其它均不予缓存

 

           SHOW GLOBAL VARIABLES LIKE ‘query%‘; 查询缓存是否开启,和缓存空间大小

           SHOW GLOABL STATUS LIKE ‘Qcache%‘;   查询缓存命中次数

                 Qcache_hits缓存命中次数值

           SHOE GLOABL STATUS LIKE ‘Com_se%‘;   查询次数

                 Com_select查询次数值

           使用查询命中次数除以查询次数就是命中率

 

           字段显式可以使用别名:

              col1 AS alias1,col2 AS alias2,...

          

           WHERE字句:指明过滤条件以实现"选择"的功能;

              过滤条件:布尔型表达式

              算术操作符:+,-,*,/

              比较操作符:=,!=,<>,<=>,>,<,>=,<=

              BETWEEN min_num AND max_num

              IN (element1,elemnt2,...)

              IS NULL

              IS NOT NULL

              LIKE:

                 %:任意长度的任意字符

                 _:任意单个字符

              RLIKE:

              REGEXP:匹配字符串可用正则表达式书写模式

 

              逻辑操作符:

                 NOT

                 AND

                 OR

                 XOR

          

           GROUP字句:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算

              avg(),max(),min(),count(),sum()

             

              HAVING字句:对分组聚合运算后的结果指定过滤条件;

           ORDER BY字句:根据指定的字段对查询结果进行排序;

              升序:ASC

              降序:DESC

           LIMIT [offset,]row_count:对查询的结果进行输出行数数量限制;

       

           [FOR UPDATE | LOCK IN SHARE MODE]

              对查询结果中的数据请求施加“锁”;

                 FOR UPDATE:写锁,拍他锁;

                 LOCK IN SHARE MODE:读锁,共享锁

          

           练习:导入helldb.sql生成数据库

           (1)在Students表中,查询年龄大于25岁的,且为男性的同学的名字和年龄;

           (2)以ClassID为分组依据,显示每组的平均年龄;

           (3)显示第2题中的平均年龄大于30的分组及平均年龄

           (4)显示以L开头的名字的同学的信息

           (5)显示TeacherID非空的同学的相关信息;

           (6)以年龄排序后,显示年龄最大的前10位同同学的信息

           (7)查询年龄大于等于20岁,小于等于25岁的同学的信息;用三种方法   

                

          

      多表查询:

        交叉连接:笛卡尔乘积

        内连接:

           等值连接:让表之间的字段以“等值”建立连接关系

           不等值连接

           自然连接

           自连接

        外连接:

           左外连接:

              FORM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col

           右外连接:

              FORM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

       

      子查询:在查询语句嵌套这查询语句

        基于某语句的查询结果再次进行的查询

     

        用WHERE字句中的子查询:

           (1)用于比较表达式中的子查询,子查询仅能返回单个值

              SELECT Name,Age FROM studentsWHERE Age>(SELECT avg(Age) FORM students);

           (2)用于IN中的子查询:子查询应该单键查询并返回一个或多个值从而构成列表;

           (3)用于EXISTS;

        用于FORM字句中的子查询;

           使用格式:SELECT tb_alais.col... FROM (SELECT clause) AS tb_alias WHERE Clause;

      联合查询:UNION

       

 

MySQL基础实战