zoukankan      html  css  js  c++  java
  • Mysql

    目录

    1. Mysql 数据类型... 1

    1. 整数类型... 1

    2.浮点数... 1

    3. 日期时间类型... 1

    4. 字符串类型... 2

    5. ENUM 和SET 类型... 2

    2数据库操作... 2

    1.创建... 2

    2. 存储引擎 SHOW engines; 3

    3. 表的操作... 3

    1. 建表... 3

    2. 查看信息... 4

    3. 表的修改... 4

    4.SQL查询语句... 4

    1. 查询记录... 4

    集合函数... 6

    连接查询... 6

    子查询... 6

    合并查询... 7

    正则表达式... 7

    插入操作... 7

    更改数据... 8

    删除数据... 8

    索引... 8

    创建索引... 8

    删除索引... 8

    视图... 9

    查看视图... 9

    修改视图... 9

    删除视图... 9

    触发器... 10

    查看触发器... 10

    触发器的应用... 10

    删除触发器... 11

    存储过程和函数... 12

    创建存储过程和函数... 13

    1创建存储过程... 13

    2创建存储函数... 13

    3变量的使用... 13

    4定义条件和处理程序... 14

    流程控制语句... 14

    调用存储过程和函数... 15

    查看存储过程和函数... 15

    修改存储过程和函数... 15

    删除存储过程和函数... 16

    MYSQL日志... 16

    数据库备份与还原... 16

    数据库迁移... 17

    表的倒入和导出... 17

    用LOAD DATA INFILE 方式导入文本文件... 19

    用户管理... 20

    账户管理... 21

    权限管理... 22

    PHP 数据库编程... 23

    查询... 23

    1. Mysql 数据类型

    1. 整数类型

    整数类型

    字节数

    TINYINT

    1

    SMALLINT

    2

    MEDIUMINT

    3

    INT

    4

    INTEGER

    4

    BIGINT

    8

    2.浮点数

    整数类型

    字节数

    FLOAT

    4

    DOUBLE

    8

    DECIMAL(M.D)

    M+2

    注:在MYSQL中,定点数以字符串形式存储。因此,其精度比浮点数要高。而且,浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数(DECIMAL)比较安全。

    3. 日期时间类型

    整数类型

    字节数

    YEAR

    1

    DATE

    4

    TIME

    3

    DATETIME

    8

    TIMESTAMP

    4

    4. 字符串类型

    CHAR(M)  VARCHAR(M)  TINYTEXT  TEXT  MEDIUMTEXT  LONGTEXT

    5. ENUM 和SET 类型

    属性名 ENUM(‘值1’,’值2’,…,’值n’);

    属性名 SET(‘值1’,’值2’,…,’值n’);

    注: SET类型和ENUM类型对于取值在一定范围内的离散值很有效。SET类型可以在取值列表内取多个值,ENUM类型只能在取值列表内取一个值。两个类型的数据都不是直接将数据存入数据库,二是将其列表中的编号存入数据库。

    存储JPG图片和MP3音乐

       一般情况下,数据库中不直接存储图片和音频文件,而是存储图片和音频文件的路径。如果实在需要在Mysql数据库存储图片和音频文件,就选择BLOB类型。因为BLOB类型可以用来存储二进制类型的文件。

    2数据库操作

    1.创建

    CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name

             [ create_specification …]

    [ default ] CHARACTER SET chaset_name  (gbk)

    [ default ] LOLLATE collaction_name   (gbk_chinese_ci)

    2. 显示数据库列表

    SHOW DATABASES [LIKE ‘pattern’]

    3. 删除数据库

    DROP { DATABASE | SCHEMA } [IF EXISTS] db_name

    2. 存储引擎 SHOW engines;

             InnoDB 存储引擎的优势在于提供了良好的事务管理,崩溃修复能力和并发控制。缺点是其读写效率稍差,占用的数据空间相对比较大。

             MyISAM 存储引擎的优势在于占用空间小,处理速度快。缺点是不支持事物的完整性和并发性。

    事务的概念源自于数据库管理系统(OBMS)中数据库事务的概念。在数据库管理系统中,事务必须满足ACID性质,即原子性,一致性,隔离性和持久性。原子性指的是事务中的动作要么全部执行要么一个也不执行;一致性指的是任何时刻,数据库必须处于一致性状态,即必须满足某些预先设定的条件;隔离性是指一个事务不能看见其他未提交事务所涉及到的内部状态,而持久性是指一个已提交的事务对数据库系统的改变必须是永久的。

    3. 表的操作

    1. 建表

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tb_name

             ( column_definition … )                       //列定义

    [ CHARACTER SET charset_name]     //字符集

    [ COLLATE collation_name]          //校对规则

    [ COMMENT ‘string’]               //注释

    column_definition :

             col_name type [ NOT NULL | NULL]

             [ DEFAULT default_value]

             [AUTO_INCREMENT] [PRINMARY KEY]

             [ COMMENT ‘string’]

    约束条件

    说明

    PRIMARY KEY

    标识该属性为该表的主键,可以唯一的标识对应的原组

    FOREIGN KEY

    标识该属性为该表的外键,是与之联系的某表的主键

    NOT NULL

    标识该属性不能为空

    UNIQUE

    标识该属性的值是唯一的

    AUTO_INCREMENT

    标识该属性的值自动增加,这是MySQL的SQL 语句特色

    DEFAULT

    为该属性设置默认值

    多字段主键在属性定义完之后统一设置主键。

    PRIMARY KEY(属性名1,属性名2,…,属性名n)

    外键的作用是建立该表与其父表的关联关系,父表中删除某条信息时,子表中与之对应的信息也必须有相应的改变。

             CONSTRAINT 外键别名 FOREIGN KEY ( 属性1.1,属性1.2,…)

                       REFERNCES 表名( 属性2.1,属性2.2,…)

    子表的外键关联的必须是父表的主键,而且,数据类型必须是一致的。

    2. 查看信息

    1查看表信息

    SHOW [FULL] TABLES [FROM db_name] [ LIKE ‘pattern’]

    2查看列信息

    SHOW [ FULL ]COLUMNS FROM tb_name [ FROM db_name] [ LIKE ‘pattern’]

    {DESCRIBE |DESC} tb_name [ col_name|wild]

    3查看表的详细信息

    SHOW CREATE TABLE tb_nameG; display result vertically

    3. 表的修改

    ALTER [IGNORE] TABLE tb_name

             ADD [COLUMN] column_defination [ FIRST|AFTER col_name]

             | ADD [ COLUMN ] (column_definition,…)

    CHANGE(字段名)|MODIGY(字段类型)|DROP(字段名)

    ALTER TABLE 表名 MODIFY 字段名 字段类型

    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [字段属性]

    删除属性

    ALTER TABLE 表名 DROP 字段名

    删除外键

    ALTER TABLE 表名 DROP  FOREIGN KEY  外键别名;

    删除表

    DROP TABLE 表名;

    4. 重命名表

    RENAME TABLE tb_name TO new_tb_name;

    4.SQL查询语句

    1. 查询记录

    //给出一个想要选择的列表清单

             SELECT  select_expr, …

    //指标将选择的行写入一个文件中

             [ INTO OUTFILE ‘file_name’ export_options | INTO DUMPFILE ‘filename’]

    //指标从哪个表或那些表进行选择

              FROM table_references

    //指标被选择的语句满足哪些条件

    [ WHERE where_definition]

    //根据 GROUP BY 列进行分类

    [ GROUP BY { col_name | expr | position } [ ASC | DESC],… ]

    //也用于指定对记录的过滤条件,单通常与 GROUP BY 一起使用

    [HAVING where_definition]

    //如何对检索到的行进行排序

    [ORDER BY { col_name | expr |position } [ASC | DESC],…]

    //限制被 SELECT 语句返回的行数

    [LIMIT {[offset ,] row_count | row_count OFFSET offset}]

    WHERE 语句的查询条件

    查询条件

    符号或关键字

    比较

    =,<,<=,>,>=,!=,<>,!>,!<,

    指定范围

    BETWEEN * AND * ,NOT BETWEEN * AND *

    指定集合

    IN,NOT IN

    匹配字符

    LIKE,NOT LIKE

    是否为空值

    IS NULL , IS NOT NULL

    多个查询条件

    AND , OR

    SQL通配符

    % 替代0个或多个字符

    _ 仅替代一个字符

    [ charlist ] 字符列中的任何单一字符

    [^charlist] 不在字符列中的任何单一字符

    SELECT 语句中可以使用 DISTINCT 关键字来消除重复的记录。

    语法:    SELECT DISTINCT 字段名

    DISTINCT 关键字非常实用,尤其是重复记录非常多的时候。

    GROUP BY 分组查询  分组的关键字不加引号

    GROUP BY 字段名 [ HAVING 条件表达式 ] [ WITH ROLLUP]

    l  与GROUP_CONCAT() 函数一起使用时,每个分组中指定字段值都显示出来。

    SELECT sex , GROUP_CONCAT(name) FROM employee GROUP BY sex;

    l  与集合函数一起使用

    SELECT sex , COUNT(sex) FROM employee GROUP BY sex;

    l  与HAVING 一起使用

    SELECT sex , COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;

    ‘WHERE 条件表达式’ 作用域表或视图,是表和视图的查询条件。

    ‘HAVING 条件表达式’ 作用于分组后的记录,用于选择满足条件的组。

    l  与 WITH ROLLUP 一起使用

    将会在所有的记录最后加上一条记录。这条记录是上面所有记录的总和。

    集合函数

    1. COUNT() 函数统计记录的条数

    2. SUM() 函数可以求出某个字段取值的总和。字段必须为数值型

    3. AVG() 函数求出某个字段取值的平均值

    4. MAX() 函数求出表中某个字段取值的最大值  MIN()

    连接查询

    1内连接查询

    内连接查询可以通过相同意义的字段查询两个或两个以上的表。两个表中表示相同意义的字段可以是指父表的主键和子表的外键。

    只有表中有意义相同的字段时才能进行连接。而且,内连接查询只查询出指定字段取值相同的记录。

    2外连接查询

    外连接查询可以查询两个或以上的表。外连接查询也需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录。而该字段取值不相等的记录也可以查询出来。

             SELECT 属性名列表

                       FROM 表名1 LEFT | RIGHT JOIN 表名2

                       ON 表名1.属性名1=表名2.属性名2;

    子查询

    子查询是将一个查询语句的嵌套在另一个查询语句中,内层查询语句的查询结果,可以作为外层查询语句的查询条件使用。因为在一些情况下,一个查询语句的条件需要另一个查询语句来获取。

    1. IN 关键字查询一个查询语句的条件可能落在另一个查询语句的结果中。

    2. 带比较运算符的子查询。

    =,!=,<,<=,>,>=

    3. EXISTS 关键字表示存在

             EXISTS 关键字与前面的关键字很不一样。使用EXISTS 关键字时,内层查询语句只返回 TRUE 或FALSE 。如果内层语句查询到记录则返回 TRUE ,否则返回 FALSE。只有当返回TRUE

    的时候才可以执行外层查询语句,而 NOT EXISTS 则在内层语句返回 FALSE的时候才执行外层语句。其他关键字,其内层查询语句返回一个结果集。

    4. ANY 关键字

             ANY 关键字表示满足内查询返回的结果中的任何一个条件外查询就可以根据此条件进行查询。 WHERE score>ANY(SELECT score FROM scholarship);

    5. ALL 关键字表示满足所有条件

    合并查询

    使用 UNION关键字时,数据库会将所有的查询结果合并到一起然后删除掉相同的记录。而 UNION ALL 关键字则只是简单的合并到一起。语法如下:

            

    SELECT 语句1

             UNION |UNION ALL

    SELECT 语句2

             UNION |UNION ALL …

    SELECT 语句n;

    正则表达式

    正则表达式是使用某种模式去匹配一类字符串的一个方式。

    在MYSQL中使用 REGEXP 关键字来匹配查询正则表达式。

    属性名 REGEXP ‘匹配方式’

     

    正则表达式的模式字符

    含义

    ^

    匹配字符串开始的部分

    $

    匹配字符串结束的部分

    .

    匹配任意一个字符

    [charlist]

    匹配任意一个字符集里面的字符

    [^charlist]

    匹配任意一个非字符集里面的字符

    S1|S2|S3

    匹配S1,S2,S3任何一个字符

    *

    匹配该符号前的多个字符,包括0,1

    +

    匹配该符号前的多个字符,包括0

    字符串{N}

    字符串出现N次

    字符串{M,N}

    字符串出现的次数大于M 小于N

    通配符与 LIKE 关键字一起使用。而且使用范围有限。而正则表达式是要与 REGEXP 一起使用的。正则表达式的使用非常灵活,可以有很丰富的含义。

    插入操作

             INSERT [ LOW_PRIORITY | DELAY | HIGH_PRIORITY ] [ IGNORE]

             [ INTO ]   tb_name [( col_name , … )]

             VALUES ({ expr | DEFAULT} ,…) , ( … ) , …

             [ ON DUPLICATE KEY UPDATE col_name=expr , … ]

    异表操作

             INSERT [LOW_PRIORITY | DELAY | HIGH_PRIORITY ] [ IGNORE]

             [ INTO ]   tb_name [( col_name , … )]

             SELECT …

             [ ON DUPLICATE KEY UPDATE col_name=expr , … ]

    更改数据

             UPDATE [ LOW_PRIORITY ] [ QUICK] [ IGNORE] tb_name

             SET col_name=expr1, …

             WHERE where_defination

    删除数据

    DELETE [ LOW_PRIORITY] [ QUICK ] [ IGNORE] FROM tb_name

    [ WHERE where_defination ]

    索引

    创建索引

    1. 创建表时创建索引。

             [ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [别名] (字段名 [(字段长度)]) [ ASC | DESC]

    2. 在已经存在的表上创建索引

             CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (属性名 【长度】)[ASC|DESC]

    3. 用ALTER TABLE 来创建索引

            ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX

                       索引名 (属性名[(长度)])[ASC | DESC]

    查看  SHOW INDEX  FROM 表名;

    删除索引

    DROP INDEX 索引名 ON 表名;

    对已经建立了索引的表中插入数据时,插入一条数据就要对该记录按索引排序。因此,导入大量数据的时候速度很慢。解决办法是,在没有任何索引的情况插入数据,然后再建立索引。

    视图

    视图由数据库中的一个表或多个表导出的虚拟表。其作用是方便用户对数据的操作。

    创建视图

             CREATE  [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE }]

                                VIEW 视图名 [ (属性清单)]

                                AS  SELECT 语句

                [ WITH [CASCADED | LOCAL] CHECK OPTION]

    其中 WITH CHECK OPTION 是可选参数,表示更新视图时要保证在该视图的权限范围之内。

    CASCADED 表示更新视图时要满足所有相关视图和表的条件,该参数为默认值。

    查看视图

    DESCRIBE 视图名;

    SHOW TABLE STATUS LIKE `视图名`; 不好

    SHOW CREATE VIEW 视图名;  查看视图的详细信息。

    SELECT * FROM information_schema.views;  在views 表中查看视图详细信息

    修改视图

    在视图存在的时候修改视图不存在的时候建立视图

    CREATE  OR REPLACE [ ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE }]

                                VIEW 视图名 [ (属性清单)]

                                AS  SELECT 语句

                [ WITH [CASCADED | LOCAL] CHECK OPTION]

    删除视图

    DROP VIEW [ IF EXISTS] 视图名列表;

    触发器

             触发器是由 INSERT, UPDATA 和 DELETE 等事件来触发某种特定的操作。

                       CREATE  TRIGGER  触发器名     BEFORE | AFTER 触发事件

                                ON 表名          FOR EACH ROW

                       执行语句

             多个执行语句的触发器

                       CREAT  TRIGGER  触发器名   BEFORE | AFTER  触发事件

                                ON 表名          FOR EACH ROW

                                BEGIN

                                         执行语句列表

                                END

    注: 不同的执行语句之间用 ‘ ; ’ 隔开,这里用到了 DILIMITER 函数

    查看触发器

    查看触发器是指查看数据库中已经存在的触发器的定义,状态和语法等信息。

    1. 查看基本信息

             SHOW DRIGGERS;

    2. 查看详细信息

             SELECT * FROM information.schema.triggers;

             SELECT * FROM information.schema.triggers WHERE trigger_name=’触发器名称’;

    触发器的应用

             触发器执行的顺序是 BEFORE 触发器,表操作 (INSERT , UPDATE 和 DELETE)和 AFTER触发器。

    ‘NEW.column_name’ 或者’OLD.column_name’ 这样在技术上处理 (NEW | OLD .column_name)新和旧的列名属于创建了过渡变量(transiton variables).

    对于INSERT 语句,只有NEW 是合法的;对于DELETE 语句只有OLD是合法的;而对于UPDATE 语句 NEW 和 OLD都是合法的。

    NEW 或OLD 实际上代表触发事件后的 表名。一个是事件后对应的行的信息一个是事件前对应的行的信息。

    删除触发器

             DROP TRIGGERS 触发器名称;

    字符串处理函数

    CHAR_LENGTH(s) , LENGTH(s)

    计算字符串s的字符数

    CONCAT( s1 ,s2 , …)

    CONCAT_WS( x, s1 ,s2)

    将s1 ,s2等多个字符串合并成一个字符串。

    但CONCAT_WS(x,s1,s2)可以将各个字符用参数x连接

    INSERT( s1 ,x,len,s2)

    将字符串s1中x位置开始长度为len的字符串用s2替换

    UPPER(s) ,UCASE(s)

    LOWER(s),LCASE(s)

    字符串大小写转换。

    LEFT(s,n)

    RIGHT(s,n)

    返回字符串s的前n个字符

    返回字符串s的后n个字符

    LPAD(s1,n,s2)

    RPAD(s1,n,s2)

    将字符串s2填充到字符串s1开始处,使字符串s1长度达到n.                    末尾

    LTRIM(s),RTRIM(s),TRIM(s)

    去除字符串两边的空格

    TRIM( s1 FROM s2)

    去掉字符串s2中开始处和末尾处的字符串s1

    REPEAT(s,n)

    将字符串重复n次

    SPACE( n)

    返回n个空格

    REPLACE( s, s1 ,s2)

    用s2替代s中的s1

    STRCMP( s1,s2)

    比较字符串

    SUBSTRING( s,n,len)

    MID( s,n, len)

    从字符串n位置开始获取长度为len的字符串

    LOCATE(s,s1)

    POSITION(s1 IN s)

    INSTR(s,s1)

    从字符串s中获取s1开始的位置

    REVERSE(s)

    将字符串s的顺序反过来

    数学函数

    ABS(x)

    返回x的绝对值

    CEIL(x)

    返回大于或等于x的最小整数

    FLOOR(x)

    返回小于或等于x的最大整数

    RAND()

    返回0-1 的随机数

    ROUND(x)

    返回离x最近的整数

    MOD(x,y)

    返回x除以y以后的余数

    常用日期时间函数

    CURDATE()

    返回当前日期

    CURTIME()

    返回当前时间

    NOW()

    返回当前日期时间

    WEEKOFYEAR()

    返回一年的第几周

    DAYOFYEAR()

    返回一年的第几天

    YEAR(d)

    在日期中提取年份

    QUARTER(d)

    根据日期返回季度1-4

    HOUR(T)

    在时间中返回小时

    MINUTE(t)

    在时间中返回分钟

    SECOND(t)

    在时间中返回秒

    DATEDIFF(d1,d2)

    返回 d1和d2的日期差

    ADDDATE(d,n)

    返回日期d 加上n天后的日期

    加密函数

    加密函数

    PASSWORD(str)

    不可解谜,对密码加密

    MD5(str)

    对普通数据加密,通常做校验码用

    ENCODE(str, pswd_str)

    加密函数

    DECODE(crypt_str,pswd_str)

    解谜函数

    使用字符串 pswd_str 来加密字符串 str 。加密的结果是一个二进制数,必须使用

    BLOB类型的字段来保存它。

    系统信息函数

    VERSION()

    返回数据库的版本号

    CONNECTION_ID()

    返回服务器的连接数

    DATABASE(), SCHEMA()

    返回当前的数据库名

    USER()

    返回当前用户

    CHARSET(str)

    返回字符串str的字符集

    COLLATION(str)

    返回字符串str 的字符排列方式

    LAST_INSERT_ID()

    返回最近生成的AUTO_INCREMENT值

    存储过程和函数

    一个存储过程是可以被存储在服务器中的一组SQL语句。一旦创建存储过程,客户端就不需要在重新发送一个个单独的语句,而是可以通过调用存储过程来代替。使用存储过程可以减少网络流量,因为只有较少的信息需要在服务器与客户端之间传递。使用存储过程也可以实现一种安全机制,因为应用程序和用户不能直接范围数据库表,而只能执行指定的存储过程。

    创建存储过程和函数

    1创建存储过程

                       CREATE  PROCEDURE  sp_name ( [ proc_parameter[ , …]])

                                [ characteristic]  routine_body

    sp_name 是存储过程的名字,proc_parameter 是存储过程的参数列表,

    characteristic 参数指定存储过程的特征,routine_body 参数是SQL 代码内容,

    可以用 BEGIN … END 来标志 SQL代码的开始和结束。

    proc_parameter 中每个参数由 3 部分组成。这三部分分别是输入输出类型,参数名称和参数类型。     [ IN | OUT | INOUT] param_name type

    characteristic参数有多个取值:

    l  LANGUAGE SQL: 说明routine_body 部分是由SQL语句组成,这也是数据库的默认设置。

    l  [ NOT ] DETERMINISTIC : 指明存储过程的执行结果是否确定。

    l  { CONTAINS SQL | NO SQL |READ SQL DATA | MODIFYES SQL DATA}:指明子程序使用SQL语句的限制。

    l  SQL SECURITY { DEFINER | INVORKER}: 指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表名调用者可以执行。默认情况下权限是DEFINER.

    l  COMMENT ‘string’:注释信息。

    2创建存储函数

                       CREATE FUNCTION sp_name ([ func_parameter[ , …]])

                                RETURNS type

                                [ characteristic … ]  routine_body

    参数定义如下   param_name  type

    3变量的使用

    1 定义变量     DECLARE var_name [, …] type  [DEFAULT value]

    2 为变量赋值

                       1SET  var_name=expr [, var_name=expr] …

                       2SELECT col_name [ , …]INTO var_name [ ,…]

                                FROM table_name  WHERE condition

    4定义条件和处理程序

    定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。

    定义条件

    DECLARE  condition_name  CONDITION  FOR  condition_value;

             condition_value:

                       SQLSTATE [ VALUE] sqlstate_value | mysql_error_code

    定义处理程序

    DECLARE  handler_type  HANDLER FOR  condition_value [ , … ] sp_statement

       hanler_type: 指明错误的处理方式

                       CONTINUE | EXIT |UNDO

       condition_value:  指明错误的类型

                       SQLSTATE [ VALUE ] sqlstate_value|condition_name | SQLWARNING

                                |NOT FOUND |SQLEXCEPTION | mysql_error_code

    流程控制语句

    1IF 语句  条件判断

                       IF search_condition THEN statement_list

                                [ ELSEIF search_condition THEN statement_list] …

                                [ ELSE statement_list]

                       END IF

    2CASE 语句  条件判断

                       CASE  case_value

                                WHEN when_value THEN statement_list

                                [ WHEN when_value THEN statement_list] …

                                [ ELSE statement_list]

                       END CASE

                       CASE

                                WHEN search_condition THEN statement_list

                                [WHEN search_condition THEN statement_list] …

                                [ ELSE statement_list]

                       END CASE

    3LOOP 语句 可以使某些特定的语句重复执行,实现一个简单的循环。但是 LOOP语句本身没有停止循环的语句,必须遇到 LEAVE 语句等才能停止循环。

                       [ begin_label :] LOOP

                                statement_list

                       END LOOP [end_label]

    4LEAVE 主要用于跳出循环控制

                       LEAVE label;

    5ITERATE 也是用来跳出循环的,但是ITERATE语句是跳出本次循环,然后直接进行下一次循环。

                       ITERATE label;

    6REPEAT 语句是有条件控制的循环语句,当满足特定条件是,就会跳出循环语句。

                       [begin_label:] REPEAT

                                statement_list

                                UNTIL search_condition

                       END REPEAT [end_label]

    7WHILE 语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。WHILE语句是当满足条件时,执行循环内的语句

                       [begin_label:] WHILE search_condition DO

                                statement_list

                       END WHILE[end_label]

    调用存储过程和函数

    存储过程是通过 CALL语句来调用的,而存储函数的使用方法与MYSQL 的内置函数的使用方法是一样的。

    查看存储过程和函数

    1. SHOW  { PROCEDURE | FUNCTION } STATUS [ LIKE ‘pattern’];

    2. SHOW  CREATE { PROCEDURE | FUNCTION } sp_name;

             SHOW STATUS语句只能查看存储过程或函数是操作哪一个数据库,存储过程或函数的名称,类型,创建和修改时间,字符编码等信息。但是 SHOW CREATE 可以查看存储过程或者函数的详细定义。

    修改存储过程和函数

                       ALTER { PROCEDURE | FUNCTION } sp_name [ characteristic …]

    characteristic:

             { CONTAINS SQL | NO SQL | READS SQL DATA | NODIFIES SQL DATA}

             | SQL SECURITY { DEFINER | INVOKER }

             COMMENT ‘string’

    删除存储过程和函数

             DROP { PROCEDUER| FUNCTION} sp_name;

    存储过程的参数有三类,分别是IN ,OUT, INOUT. 通过 OUT , INOUT 将存储过程的执行结果输出。而且存储过程中可以有多个 OUT , INOUT 类型的变量,可以输出多个值。

    存储函数的参数都是输入参数。函数中的运算结果通过RETURN 语句来返回。 RETURN 语句只能返回一个结果。

    MYSQL日志

    mysql日志是记录mysql数据库的日常操作和错误信息的文件。分析这些日志文件可以了解mysql的出错原因,运行情况和那些地方需要进行优化。

    l  二进制日志: 以二进制的形式记录了数据库中的操作,但不记录查询语句。

    l  错误日志: 记录MySQL服务器的启动,关闭和运行错误等信息。

    l  通用查询日志: 记录用户登录和记录查询的信息。

    l  慢查询日志:记录执行时间超过指定时间的操作。

    数据库备份与还原

    备份数据是数据库管理中最常用的操作。为了保证数据库中数据的安全,数据库管理员需要定期的进行数据库备份。一旦数据库遭到破坏,即通过备份的文件来还原数据库。

    1 使用mysqldump 命令备份

             mysqldump 命令可以将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。工作原理:先查出需要备份的表达结构,生成一个CREATE语句,然后根据表中的数据生成一个INSERT语句。

    备份一个数据库:这个得从 cmd 中退出mysql,结尾无分号。

             mysqldump –u username –p dbname table1 table2 … >BackupName.sql

    备份多个数据库:数据库之间空格隔开

             mysqldump –u username –p --databases dbname1 dbname2 … >BackupName.sql

    备份全部数据库:

             mysqldump –u username –p --all-databases>BackupName.sql

    l  备份带删除表格式,能够让备份覆盖已有数据库而不需要手动删除原有数据库

                       mysqldump --add-drop-table –u username –p dbname >backup.sql

    l  仅备份数据库结构

                       mysqldump --no-data-database -u username -p dbname>backup.sql

    对备份文件进行压缩 

    mysqldump –u username –p databasename|gzip>test.db.sql.gz

    还原备份

    mysql –uroot –p [ dbname ] <backup.sql

    压缩还原:

             gunzip<backup.sql.gz|mysql –uusername –p [dabasename]

    数据库迁移

    数据库迁移就是指将数据库从一个系统移动到另一个系统上。大致分为三种:在相同版本的MySQL数据库之间迁移,迁移到其他版本的MySQL数据库中和迁移到其他类型的数据库中。

    表的倒入和导出

    1 select 的结果记录为一个文件。666的一个命令

                       运行 tee命令。 tee命令 语法   tee  文件路径

    例如  mysql> tee d:/test.txt

    回车后回看到  ‘logging to file ‘d:test.txt’’打开d 盘会看到文件

    2. Mysql 数据库中的表可以导出成文本文件,XML文件或者HTML文件,相应的文件也可以倒入mysql数据库中。

    1SELECT [列名] FROM table [WHERE 语句]

                                INTO OUTFILE ‘目标文件’ [OPTION];

    FIELDS TERMINATED BY ‘字符串’:设置字符串为字段的分隔符,默认值‘ ’;

    FIELDS ENCLOSED BY ‘字符’:设置字符来括上字段的值。默认情况下不使用任何符号;

    FIELDS OPTIONALLY ENCLOSED BY ‘字符’:设置字符来括上CHAR,VARCHAR和TEXT等字符型

    字段。默认情况下不使用任何符号;

    FIELDS ESCAPED BY ‘字符’:设置转义字符,默认值为’’;

    LINES STARTING BY ‘字符串’:设置每行开头的字符,默认情况下没有字符;

    LINES TERMINATED BY ‘字符串’:设置每行的结束符,默认值是‘ ’.

    结果如下图

     

    用mysql命令导出文件

    mysql命令可以用来登陆MYSQL服务器,也可以用来还原备份文件。同时,mysql命令也可以导出文本文件。

    mysql –u root –p –e “SELECT语句” dbname >d:/test.txt

    导出HTML文件

    mysql –u root –p --html|-H–e “SELECT语句” dbname >d:/test.txt

    导出XML 文件

    mysql –u root –p --xml|-X –e “SELECT语句” dbname >d:/test.txt

    导出txt文件

    结果

    导出XML 文件

    结果部分截图

    用LOAD DATA INFILE 方式导入文本文件

    LOAD DATA [LOCAL] INFILE file INTO TABLE table [OPTION];

    [OPTION]选项

    l  FIELDS TERMINATED BY ‘字符串’:设置字符串为字段的分割符,默认值是’ ’;

    l  FIELDS ENCLOSED BY ‘字符’:设置字符来括上字段的值。默认情况下不使用任何符号;

    l  FIELDS OPTIONALLY ENCLOSED BY ‘字符’:设置字符来括上 CHAR , VARCHAR 和TEXT等字符型的字段。默认情况下不使用任何符号。

    l  FIELDS ESCAPED BY ‘字符’: 设置转义字符,默认值为’’;

    l  LINES STARTING BY ‘字符’: 设置每行开头的字符,默认情况下无任何字符;

    l  LINES TERMINATED BY ‘字符串’:设置每行的结束符,默认值是’ ’;

    l  IGNORE n LINES :忽略文件的前n行记录

    l  (字段列表)根据字段列表中的字段和顺序来加载记录;

    l  SET column=expr: 将指定的列 column 进行相应地转换后再加载,使用 expr 表达式来进行转换。

    用户管理

    root 用户的权限包括创建用户,删除用户和修改普通用户的密码等管理权限。而普通用户只拥有创建该用户时赋予它的权限。用户管理包括管理用户的账户,权限等。

    mysql数据库下面存储的是权限表:

    1. user 表39个字段

             用户列包括Host ,User,Password,分别表示主机名,用户名,和密码。

             权限列包括Select_priv , Isert_priv 等以 priv 结尾的字段。其中包括了查询权限 ,修改权限等普通权限,还包括了关闭服务的权限 ,超级权限和加载用户等高级管理权限。普通权限用于操作数据库。高级权限用于对数据库进行管理。

             安全列只有四个字段,分别是 ssl_type ,ssl_cipher ,x509_issuer 和x509_subject.

    ssl 用于加密,x509 标准用于标识用户。

             资源控制列有四个字段分别是 max_questions , max_updates , max_connections 和

    max_user_connections.前两个规定每小时可以允许执行多少次查询和更新,后两个分别表示

    每小时可以建立多少连接和单个 用户同时具有的连接数。

    2. db表和 host 表

             db表中存储了某个用户对一个数据库的权限。

             用户列:db表有3个字段分别是 Host,Db和User。这三个字段分别表示主键名,数据库名和用户名。host表的用户列有两个字段分别为Host 和Db.

             权限列:db表和 host表的权限列几乎一样,只是db表中多了一个Create_routine_priv字段和Alter_voutine_priv字段。这两个字段决定用户是否具有创建和修改存储过程的权限。

    user表中的权限是针对所有数据库的,而db表中的权限是针对每个数据库的。

    3. tables_priv 和 columns_priv表

             tables_priv 表可以对单个的表进行权限设置。columns_priv表可以对单个数据列进行权限设置。

    4. procs_priv 表

             可以对存储过程和存储函数进行权限设置。

    账户管理

    登陆

             mysql –h hostname|hostIP –P port –u username –p Databasename –e ‘SQL语句’

    新建普通用户:

    1 CREATE USER user [ IDENTIFIED BY [PASSWORD] ‘password’] …

    user表示用户名,由账户和主机名组成中间用@连接。

    2 GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] ‘password’]

                                         [ IDENTIFIED BY [PASSWORD] ‘password’ …]

    删除用户:

    1. DROP USER user [, user …]; 

    2. DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;

    root 用户修改自己密码

    1. mysqladmin -u username -p password “newword”;

    这个命令要退出mysql,在cmd登陆界面中使用。语法中 password是关键字,而不是指旧密码。而且新密码必须用双引号括起来,使用单引号会发生意想不到的错误。

    2.  SET PASSWORD=PASSWORD(“new_password”);

             FLUSH PRIVILIGES;

    新密码使用PASSWORD()函数加密。

    root用户修改普通用户的密码

    1. SET PASSWORD FOR ‘username’@’hostname’=PASSWORD(“new_password”);

    2. UPDATE mysql.user SET Password=PASSWORD(“new_password”)

             WHERE User=”username” AND Host=”hostname”;

    普通用户修改自己的密码

             SET PASSWORD=PASSWORT(“new_password”)

    root 用户密码丢失解决办法。

      1.skip-grand-tables 选项使MySQL 服务器停止权限判断,任何用户都有访问数据库的权力。这个选项使跟在MySQL服务的命令后面的。

    net start mysql --skip-grand-tables

    2. 登陆root 用户设置新密码

             通过上述方式启动mysql服务后,可以不输入密码就登陆 root用户。登陆以后可以使用UPDATE 语句修改密码。这里只能用 UPDATE修改密码,使用SET 会出现错误提示。

    mysql –u root

    UPDATE mysql.user SET Password=PASSWORD(“new_password”) WHERE User=”root” AND Host=”hostname”;

    3. 修改完密码以后,必须用 FLUSH PRIVILEGES 语句来加载权限表。加载权限表以后新密码开始有效。

    mysql>FLUSH PRIVILIGES;

    权限管理

    1. 授权

             GRANT priv_type [(column_list) ] ON database.table

                       TO user [IDENTIFIED BY [PASSWORD] ‘password’]

                       [ , user [IDENTIFIED BY [PASSWORD] ‘password’]]

                       [WITH with_option [with_option] …]

    其中priv_type 参数表示权限的类型;column_list参数表示权限作用与那些列上,没有该参数是表示可以作用于所有的列上;user 参数由 用户名和主机名构成,形式是 ’username’@’hostname’ ;IDENTIFIED BY 参数用来为用户设置密码;password参数是用户的新密码。WITH 关键字后面带有一个或多个 with_option 参数。这个参数由5项:

    l  GRANT OPTION :被授权的用户可以将这些权限赋予给别的用户;

    l  MAX_QUERIES_PER_HOUR count ;

    l  MAX_UPDATES_PER_HOUR count;

    l  MAX_CONNECTIONS_PER_HOUR count;

    l  MAX_USER_CONNECTIONS count;

    2. 收回权限

    收回权限就是取消某个用户的某些权限。

             REVOKE priv_type [(column_list)] …

                       ON database.table

                       FOR user [, user] …

    3. 查看权限:SHOW GRANTS FOR  ‘username’@’localhost’;

    CREATE

    ALTER

    SELECT

    CREATE USER

    DROP

    DELETE

    UPDATE

    CREATE ROUTINE

    GRANT OPTION

    INDEX

    CREATE VIEW

    SHUTDOWN

    REFERENCES

    INSERT

    SHOW VIEW

    SUPER

    PHP 数据库编程

    1. php连接数据库

      非持久连接

                       resource mysql_connect ( string server , string username , string password , bool new_link ,int client_flags)

                       成功返回一个 MySQL 连接标识符,失败返回 false.

             持久连接

                       resource mysql_pconnect(string server , string username , string password , bool new_link ,int client_flags)

    2. 选择数据库

                       bool mysql_select_db( string databasename ,resource link_identifier)

                       成功返回 true 失败返回 false

    3. 关闭MySQL 连接

                       bool mysql_close( resource link_identifier)

    查询

    1. resource mysql_query( string query , resource link_identifier)

    其中参数 query指定了要执行的查询语句,该语句不应该以分号结束。

             mysql_query() 函数向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询语句,查询结果会被缓存。当发送SELECT ,SHOW ,EXPLAIN 或DESCRIBE 语句时,mysql_query()函数返回一个资源标识符,如果查询执行不成功返回false。对于其他类型的SQL语句,mysql_query()在执行成功的时候返回true 失败的时候返回false。非false返回值意味着查询是合法的并能够被服务器执行。这并不说明任何有关影响到的或返回的行数,很有可能执行成功了一条查询但并未影响到或并不返回任何行。

             若查询成功可以调用 mysql_num_rows() 函数来查看SELECT 语句返回了多少行;

             调用 mysql_affected_rows()函数来查看对应于 DELETE ,INSERT ,REPLACE,UPDATE语句影响了多少行。

    2. 从结果集中获取行作为枚举数组

                       array mysql_fetch_row(resource  result)

             从结果集中获取行作为关联数组

                       array mysql_fetch_assoc(resource  result)

             从结果集中获取行作为关联数组或索引数组

                       array mysql_fetch_array ( resource result , result_type)

    result_type:

                       MYSQL_ASSOC , MYSQL_ROW , MYSQL_BOTH

    3. 获取列信息

                       object mysql_fetch_field( resource result [ ,int field_offset])

    注意返回的是对象

             对象的属性如下:

                       name: 表示列名。

                       table: 表示该列所在的表名。

                       max_length: 表名该列的最大长度。

                       not_null: 如果该列不能为 null ,则为 -1。

                       primary_key: 如果该列是主键,则为 -1。

                      unique_key: 如果该列是唯一键,则为 -1 。

                       multiple_key: 如果该列是非唯一建,则为 -1 。

                       numeric: 如果该列是 numeric 则为 -1 。

                       type: 该列的类型。

    使用int mysql_num_fields( resource result) 函数可以取得结果集中包含的字段数目。

    4. bool mysql_free_result( resource result) 释放结果集占用的资源。

    MYSQL 优化技术

    优化方法:

    1. 创建适当的索引(主键索引,唯一索引,全文索引,空间索引)。

    2. 对SQL语句优化—定位慢查询。

    3. 使用分表技术(重点水平分表,垂直分表),分区技术。

    表的设计满足 3NF (3范式)

    1. 表的属性具有原子性。(即表的列不能再分了)。

    2. 我们的表中不能有一条完全重复的记录。

    3. 如果列的内容可以(显式或隐式)推倒出来,就不要单独的存放在一列中。

    优化步骤

    1. 先使用索引。 索引要加载到内存中,大约占数据1/3左右的空间,当数据量很大的时候不能解决问题。

    2. 定位慢查询。

    1复合索引起作用要用到最左边的列,在WHERE子句中。

    2LIKE 模式匹配符写在最前边使用索引无效,如 ‘%love’ ‘_love’。

    3or 的所有字段必须要有索引,否则索引不起作用。

    4列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引。

    5能用join 语句的不要使用子查询,会建立临时表。

    6存储引擎为MYISAM 的表要及时整理。碎片在SQL 语句 delete后依然存在,要单独清理。

  • 相关阅读:
    vmware中三种网络连接方式
    【史上最全面经】各岗位汇总目录
    史上最全2019届秋招备战攻略
    程序员常用软件
    经典大数据面试题
    春招实习终于结束啦
    Java程序员自我介绍
    java一些面试题
    收割大厂offer需要具备的条件
    triangular distribution
  • 原文地址:https://www.cnblogs.com/air5215/p/5351796.html
Copyright © 2011-2022 走看看