zoukankan      html  css  js  c++  java
  • MySQL学习 --来自官方文档的翻译

    通用知识:

    1.mysql>source path;

    path:要执行的sql路径

    学会使用help content;里面会有详细的说明和例子

    第一篇 字符集

    1.基础知识

    级别:服务器、数据库、表、属性

    character set和collations 的区别

    字符集:一组符号和其编码的集合

    排序规则:符合编码的比较规则,最简单的比较规则是二进制排序规则。

    MySQL可以做的事情:

    使用大量的字符集和排序规则组合来表示字符串,其应用水平可以在数据库、表、属性等级别。

    然而要想知道如何高效利用MySQL这个优势,首先需要了解MySQL支持哪些字符集和相应的排序规则:

    mysql>show character set;   --显示的是默认的排序规则

    mysql>show collation like ‘gb2312%’;  --显示各种排序规则

    collation命名规则:

    以其相关联的字符集名开头结尾_ci (case insensitive), _cs (case sensitive), or _bin (binary).

    常见字符集:

    Charset  | Description                     | Default collation

    ascii    | US ASCII                        | ascii_general_ci

    gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci

    utf8     | UTF-8 Unicode                   | utf8_general_ci

    latin1   | cp1252 West European            | latin1_swedish_ci

    gbk      | GBK Simplified Chinese          | gbk_chinese_ci

    2.指定字符集和排序规则(下面从四个级别说明)

    Server:

    way:

    shell>mysqld   --character-set-server=gb2312  --collation-server=gb2312_chinese_ci

    way:重编译

    shell>cmake . -DDEFAULT_CHARSET=gb2312

    Database:

    Syn:

    1>创建数据库

    CREATE DATABASE db_name

    [[DEFAULT] CHARACTER SET charset_name]

    [[DEFAULT] COLLATE collation_name]

    2>改变数据库

    ALTER DATABASE

    [[DEFAULT] CHARACTER SET charset_name]

    [[DEFAULT] COLLATE collation_name]

    Table:

    CREATE TABLE tb_name(column_list)

    [[DEFAULT] CHARACTER SET charset_name]

    [[DEFAULT] COLLATE collation_name]

    Column:

    每一个字符属性(比如char,varchar,text)都有相应的字符集和排序规则,这个可以在create table和alter table

    的从句中指定如下:

    col_name {char|varchar|text} (col_length)

    [CHARACTER SET charset_name]

    [COLLATE collation_name]

    col_name {set|enum} (val_list)

    [CHARACTER SET charset_name]

    [COLLATE collation_name]

    第二篇 SQL语句语法

    1.数据定义语句

    1.1数据库级别语句

    1.1.1CREATE DATABASE

    For:创建数据库

    Syn:

    CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name    --注意绿色标记的位置和通用性

    [create_specification] …

    create_specification:

    [DEFAULT] CHARACTER SET [=] charset_name |

    [DEFAULT] COLLATE [=] collation_name

    1.1.2 ALTER DATABASE

    For: 改变数据库的默认排序规则和字符集   --for表示语句的目的,后从之

    Syn:                                             --表示语法格式,后从之

    ALTER {DATABASE | SCHEMA} [db_name]  --当数据库为默认时可以忽略数据库名
         alter_specification ...
    ALTER {DATABASE | SCHEMA} db_name
        UPGRADE DATA DIRECTORY NAME
    
    alter_specification:
        [DEFAULT] CHARACTER SET [=] charset_name
      | [DEFAULT] COLLATE [=] collation_name

    1.2 事件相关语句

    注意:在使用事件要先开启,要查看是否开启事件:‘

    mysql>SHOW VARIABLES LIKE 'event_scheduler';

    开启前事件:

    1.动态开启,临时有效,数据库重启后恢复默认

    SET GLOBAL event_scheduler = ON;

    2.修改配置文件

    1.2.1CREATE EVENT

    For:创建事件(计划执行)

    CREATE [DEFINER=username|CURRENT_USER] EVENT   -- username 的格式:'user_name'@'host_name'

    [IF NOT EXISTS]  [shema_name.]event_name   --事件是和数据库相关联的,如果没有指定模式名,那么其数据库是当前使用的数据库

    ON SCHEDULE shedule

    [ON COMPLETION [NOT] PRESERVE]

    [ENABLE|DIABLE|DISABLE ON SLAVE]

    [COMMENT ‘comment’]

    Do event_body;

    注意1:schedule:

    AT timestamp [+INTERVAL interval] |     --常用的时间戳CURRENT_TIMESTAMP/

    EVERY interval

    [STARTS] timestamp [+interval] …  

    [ENDS] timestamp [+interval] …

    注意2:interval:

    quantity {YEAR|QUARTER|MONTH|DAY|HOUR|MINUTE|WEEK|SECOND|

    YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}   --时间单位组合
    事件组合的用法示例:
    INTERVAL '2:10' HOUR_MINUTE 间隔为2小时10分钟
     
    注意3:event_body:
     
    这里是包含的SQL语句,当事件被触发时执行事件。
    其中可以使用begin end组合语句
    示例:
    delimiter |
    
    CREATE EVENT e
        ON SCHEDULE
          EVERY 5 SECOND
        DO
          BEGIN
            DECLARE v INTEGER;
            DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
            SET v = 0;
            WHILE v < 5 DO
              INSERT INTO t1 VALUES (0);
              UPDATE t2 SET s1 = s1 + 1;
              SET v = v + 1;
            END WHILE;
        END |
    
    delimiter ;
     
    注意4:timestamp:
     
    必须是日期+时间的格式:
     
    (1)'2006-02-10 23:59:00'
    (2)内置函数:NOW,CURRENT_TIMESTAMP
    注意5:STARTS AND ENDS
     
    EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
    从当前时间的30分钟后开始,每隔12小时,直到四周之后
    注意6:
    通常情况下,一个事件一旦失效就会被遗弃,可以使用ON COMPLETION PRESERVE
     
     

    1.2.2ALTER EVENT

    For:修改事件

    Syn:

    ALTER [DEFINER ={user|CURRENT_USER}]    --事件的定义者

    EVENT  event_name

    [ON SHEDULE shedule]   

    [RENAME TO new_event_name]

    [ENABLE|DISABLE|DIABLE ON SLAVE]

    [COMMENT ‘comment’]

    [DO event_body]

    1>on shedule 可以使用mysql内建的函数和用户自己使用的变量但是不能够使用存储过程和用户自定义的函数。

    2>rename to 可以使用此语句将一个数据库的事件转移到另一个数据库

    1.3索引相关

    基础知识:mysql如何使用索引

    索引的作用:简单的说就是为了加快定位数据的速度

    索引的种类:

    PRIMARY KEY,UNIQUE,INDEX, and FULLTEXT  : B-tree

    某些特殊数据上使用R-tree,内存表支持hash索引

    1.3.1CREATE INDEX

    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

    [index_type]

    ON  tbl_name  (index_col_name,…)      --。。。表示可以创建多列索引

    [index_option]

    [algorithm_option|lock_option] …

    index_col_name:

         col_name [(length)] [ASC|DESC]   --指定表的哪个列可以使用索引

    index_type:

         USING {BTREE|HASH}     --index的实现方法

    index_option:

       KEY_BLOCK_SIZE [=] value    ---仅在innoDB中受支持

    |index_type

    |WITH PARSER parser_name

    |COMMENT ‘string’

    algorithm_option:

      ALGORITHM [=]  {DEFAULT|INPLACE|COPY}     

      --算法

    lock_option:

      LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}  --并行有关,是共享还是独占还是其他

    注意1:index_col_name

      索引可以仅用每一列列值的主要部分来创建,使用col_name (length)来指定每一列的前length个

      字符(char,varchar,text)或者字节来组成。

    前缀可以给CHAR,VARCHAR,BINARY,VARBINARY来指定,如果要指定BLOB和TEXT必须指定长度

    前缀的长度和前缀支持是和存储引擎相关的。

    注意2:几种索引形式

    1.UNIQUE限定索引上的值必须是不同的,如果是前缀那么前缀必须是不同的。

    2.FULLTEXT所以仅仅被InnoDB和MyISAM支持,并且仅支持CHAR,VARCHAR,TEXT列,不支持前缀

    注意3:index_type:

    Storage Engine Permissible Index Types
    InnoDB BTREE
    MyISAM BTREE
    MEMORY/HEAP
    HASH, BTREE
    NDB HASH, BTREE (see note in text)

    如果没有被显示指明,则默认第一个。


    1.4 创建创建存储过程和函数

    1.4.1 CREATE PROCEDURE  过程

    CREATE

         [DEFINER={user|CURRENT_USER}]

         PROCEDURE sp_name ([proc_parameter[,…]])   --可选的函数参数

         [characteristic …]   routine_body

    1.4.2CREATE FUNCTION  函数

    CREATE

          [DEFINER={user|CURRENT_USER}]

          FUNCTION  sp_name ([func_parameter[,…]])

          RETURNS type

          [characteristic …]   routine_body    

    characteristic:
        COMMENT 'string'
      | LANGUAGE SQL
      | [NOT] DETERMINISTIC
      | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      | SQL SECURITY { DEFINER | INVOKER }
    
    routine_body:
        Valid SQL routine statement

    参数说明:

    1.func_parameter:函数参数

    过程的参数声明:IN,OUT,INOUT

    函数:IN

    IN:如无指定,每一个参数默认为IN,传递值给过程,过程可以修改其值但是对调用者不可见

    OUT:从过程中传递一个值返回给调用者,初始值可以为空

    INTOUT:参数可以被调用者初始化,并且可以被过程修改,返回可见。

      param_name type(任何有效的数据类型)

    2.characteristic:
        COMMENT 'string'
      | LANGUAGE SQL
      | [NOT] DETERMINISTIC     当函数的结果总是不变的,应制定为DETERMINISTIC,
      | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      | SQL SECURITY { DEFINER | INVOKER }
     
    注意1:
    这些存储例程是和数据库相关联的,默认是当前数据库,若要创建某一数据库的例程,指定:db_name.sp_name
    注意2:
    函数可以直接在表达式中使用,而存储过程需使用call来进行调用。
    函数示例:
    mysql> CREATE FUNCTION hello (s CHAR(20))
    mysql> RETURNS CHAR(50) DETERMINISTIC
        -> RETURN CONCAT('Hello, ',s,'!');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT hello('world');
    +----------------+
    | hello('world') |
    +----------------+
    | Hello, world!  |
    +----------------+
    1 row in set (0.00 sec)
    注意3:rontine_body (function and procedure)
    同:可以由有效的sql语句组成,可以是简单的sql语句也可以是多sql语句的组合
    不同:
    1.存储过程可以包含数据定义语言,也可以包含sql事务(commit、rollback),但是存储函数不行
    2.存储过程可以包含带有返回结果集的语句,但函数不可以。如select,show,check table and so on
    3.use皆不被允许
     
    1.5的语法  ***
     
    1.5.1CREATE TABLE
     
    For:创建数据中的表
    Syn:

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
      (create_definition,…)

    [table_option]

    [partition_option]

    or:

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
      [ (create_definition,…) ]

    [table_option]

    [partition_option]

    select_statement

    or:

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

          {LIKE old_tbl_name | (LIKE old_tbl_name)}

    create_definition:

    coL_name column_definition

    |[CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_coL_name,…)

      [index_option]  ….

    |{INDEX|KEY} [index_name] [index_type]  (index_coL_name,…)

     

    | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
          [index_name] [index_type] (index_col_name,...)
          [index_option] ...
      | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
          [index_option] ...
      | [CONSTRAINT [symbol]] FOREIGN KEY
          [index_name] (index_col_name,...) reference_definition
      | CHECK (expr)

    深蓝色部分为对列定义的其他约定。

    reference_definition

    [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (index_col_name, ...)        --index_name 外键ID,如果未明确指外定外键的索引,则使用这个
        REFERENCES tbl_name (index_col_name,...)
        [ON DELETE reference_option]
        [ON UPDATE reference_option]
    
    reference_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION
    CASCADE :当父表有更新或者删除操作时子表也发生相应的改变以保持一致。
    SET NULL:当父表有更新或者删除操作时子表设置为空。
    RESTRICT|NO ACTION:阻止父表的更新或者删除操作。
    SET DEFAULT:当父表有更新或者删除操作时子表设置default value

    CREATE TABLE …SELECT

    For:可以创建来自select选择的所有列(包括数据)

    拷贝或者复制表

    CREATE TABLE new_tbl SELECT * FROM orig_tbl;

    CREATE TABLE new_tbl LIKE orig_tbl;

    1.5.2ALTER TABLE

    修改外键:

    ALTER TABLE tbl_name
        ADD [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (index_col_name, ...)
        REFERENCES tbl_name (index_col_name,...)
        [ON DELETE reference_option]
        [ON UPDATE reference_option]
    注意:与create相比,这里的区别是多了一个add
    启用外键:
    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
    关于fk_symbol,如果在创建表的时候已经指定CONSTRAINT [symbol]那么就可以使用,
    反之则可以通过:’'
    mysql>show CREATE TABLE tb_name ;来显示创建语法寻找fk_symbol
     
    1.6视图相关
     
    1.6.1CREATE 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]     
     
    CREATE VIEW 可以创建视图,或者如果使用 OR REPLACE可以替代已经存在的一个视图。
     
    select_statement 是一个select 语句,也可以包含其他view.
    视图可以“冻结”视图创建的时间,比如说select * from 若以后新的列以后被插入表中,那么视图
    返回后的结果仍然是视图创建哪个时候的结果。
     
    CHECK OPTION:限制被视图引用的表的数据被更新或者插入。
    column_list:指定返回的列名,但是必须和返回的列的总数相等。
     
     
    2.DML数据操作语言
     

    1.CALL

    For:调用存储过程

    Syn:

    CALL sp_name([parameter[,...]])
    CALL sp_name[()]

    2.DELETE

    3.DO

    For:执行不返回任何结果的表达式

    DO expr [, expr] ...

    4.HANDLER

    5.INSERT

    For:

    6.LOAD DATA INFILE  == mysqlimport

    For:以非常高的速度从文本文件中读入行到table。是SELECT … INTO OUTFIEL的补集

    Syn:

    LOAD DATA [LOW_PRIORITY|CONCURRENT]  [LOCAL]  INFILE ‘file_name’

      [REPLACE |IGNORE]

      INTO TABLE tbl_name  

      [PARTITION (partition_name,…)]

       [CHARACTER SET charaset_name]   ---字符集设置

    [{FIELDS | COLUMNS}               ---列级,属性级别                             

                     [TERMINATED BY ‘string’]    ---插入数据到表时

                     [[OPTIONALLY]  ENCOLSED BY ‘char’]

                     [ESCAPED BY ‘char’]                    

      ]                                                                 

    [LINES                    ---行级

          [STARTING BY ‘string’]

          [TERMINATED BY ‘string’]

    ]/mysql5/mysql_local_sql/loaddata.txt' into table goods;
    Query OK, 0 rows affected (0.00 sec)

    注意在windows上使用的是后斜杠

    注意1:

    如果你使用LOW_PRIORITY ,其执行将被搁置直到所有的客户端都读完数据。当然这只有在支持表级别的锁的引擎上才可用。

    如果你执行并发COCURRENT,那么当插入时可以执行读取操作

    注意2:LOCAL

    *local影响期望文件的位置错误的处理。当local被指定的时候,文件应该被客户端的程序在客户端上读取

    并且发送到服务器上。文件位置要指定全路径。如果指定相对路径那么位置,那么这里的位置将是相对于客户端程序的位置。

    *local没有被指定的话,文件这一定是存放在服务器端的,定位规则:

    《1.全路径不必说

    《2.相对路径,如果给出了相对路径的主要部分,那么服务器将在相对于服务器数据目录的位置寻找;

    如果没有给出,那么将在默认数据库的数据库文件位置寻找。

    注意3:replace和ignore(处理冗余键值应该采取的行为)

    如果都没有指定那么这要视有没有local被声明。

    没有local:发生错误,其余部分被忽略。

    有local:默认的行为跟ignore被指定一样

    注意4:LINES和FIELDS在命令上和select … into outfile是一样的

    缺省设置:

    FIELDS TERMINATED BY '	' ENCLOSED BY '' ESCAPED BY '\'
    LINES TERMINATED BY '
    ' STARTING BY ''
    注意5:
    starting by 用法:
    e.
    b.txt

    xxx44,铅笔,1,36
    xxfafa78,88
    hello xxx45,香蕉,6,30

    mysql>load data infile 'D:/b.txt' into table goods fields terminated by ',' lines starting by 'xxx';

    7.LAOD XML

    8.REPLACE

    9.SELECT

    SELECT 语句

    SELECT
        [ALL | DISTINCT | DISTINCTROW ]            --distinct 是distinctrow的同名
        [HIGH_PRIORITY]
        [MAX_STATEMENT_TIME = N]
        [STRAIGHT_JOIN]
        [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]]         --ASC|DESC跟在group by 或者order by后
        [HAVING where_condition]         --在group by 之后,在order by 之前
        [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                ---主要包括FIELDS 和 LINES
           | INTO DUMPFILE 'file_name'
          | INTO var_name [, var_name]]
        [FOR UPDATE | LOCK IN SHARE MODE]]

    注意1:having

    having可以使用聚集函数而where不可以

    注意2:limit

    In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.

    注意3:select into

    (1)  SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;

    (2)The SELECT ... INTO OUTFILE

    statement is intended primarily to let you very quickly dump a table to a text file on the server machine

    如果是远程主机可以使用:shell>mysql  –e “select …” >file_name

    10.UPDATE

    暂时先到这,后续补充~

  • 相关阅读:
    Nginx 对访问量的控制
    Shell入门
    小程序如何处理键盘覆盖输入框
    移动端适配之二:visual viewport、layout viewport和ideal viewport介绍
    javascript-对象
    bind函数作用、应用场景以及模拟实现
    「面试题」如何实现一个圣杯布局?
    一款轮播组件的诞生
    超火js库: Lodash API例子
    js 中的 number 为何很怪异
  • 原文地址:https://www.cnblogs.com/qianzhilan/p/4432752.html
Copyright © 2011-2022 走看看