zoukankan      html  css  js  c++  java
  • MySQL学习基础

    MySQL是被Sun公司收购了,所以也有热咖啡图标,不过MySQL的作者后来又做了一个MariaDB,小海豚图标,也很好用。

    MySQL学习:

    《MySQL网络数据库设计与开发》(电子工业出版社)

    数据库的基本的概念都是一样的,而且都是用的标准的SQL语法。
    学习了SQLServer之后,看MySQL感觉很熟悉,好像在复习一样。

    概念模型:

    域,domain,属性的取值范围。

    数据模型:

    层级模型,IBM开发的数据库,IMS就是的。
    网状模型,数据库任务组(DBTG)
    关系模型,最常见的数据库的形式,oracle,sybase,informix,MS SQL Server,visual FoxPro。
    面向对象的数据模型,CAD,每个对象都要唯一标识(object identifier,OID),最具活力。

    为了完整数据库设计任务,需要从6个方面来:

    需求分析设计;
    概念结构设计(画E-R图,最后将所有单个的E-R图拼接,形成全局模式的E-R图);
    逻辑结构设计;
    数据库物理结构设计;
    数据库实施;
    数据库运行和维护。

    建立索引3思:

    一个属性经常在查询中出现;
    一个属性经常作为聚集函数的参数;
    一个属性经常在连接操作的连接条件中出现,这些情况请建立索引;

    dos窗口登录mysql

    定位到MySQL目录,输入:mysql -h 127.0.0.1 -u root -p

    管理系权限:

    授权myuser用户student表的select权限:
    USE 学生管理
    GRANT SELECT ON student
    TO myuser@localhost;

    收回权限:
    REVOKE SELECT ON student
    FROM myuser@localhost

    查看权限:
    SHOW GRANTS FOR myuser@localhost

    备份数据mysqldump

    备份学生管理数据库的student表和scores表到d:/data/路径:
    mysqldump -h localhost -u root -p 123456 学生管理 student scores>d:/data/twotables.sql

    数据还原:
    mysql -u root -p 123456 学生管理<d:/data/twotables.sql

    修改mysql配置(端口,字符集):
    修改安装目录下的my.ini文件的[client],[mysqld]

    mysql常用的图形管理工具:

    MySQL GUI tools:MySQL官方的图形化管理工具。
    phpMyAdmin:最常用的MySQL维护工具,一个用PHP开发的基于web方式架构在网站主机上的MySQL图形管理工具,可以使用XAMPP来集成化安装,很方便。
    Navicat:支持大部分MySQL功能,包括触发器,存储过程,函数,事件,视图,管理用户,和微软的sqlserver很类似,有免费版本。
    SQLyog:完全免费,通过网络来维护远端的mysql数据库,著名的Webyog公司出品。

    不过对比phpmyadmin和navicat,我觉得还是navicat的界面比较美观,而phpmyadmin的界面有点太老了。

    操作数据库对象:

    创建数据库(并设置字符集为utf-8):
    CREATE DATABASE [IF NOT EXISTS] 学生管理;
    DEFAULT CHARACTER SET UTF-8;

    查看数据库(显示所有的数据库,注意是DATABASE+S):
    SHOW DATABASES;

    删除数据库:
    DROP DATABASE [IF EXISTS] 学生管理;

    数据库引擎:

    InnoDB存储引擎(默认),支持事务,外键,自增长主键,并发,创建表的表结构存储在.frm文件,但是读写效率稍差,占用数据空间相对较大。可以最大存储64TB。

    MyISAM存储引擎,不支持事务,外键,完整性约束,并发,但是处理速度快,占用空间小。大小受限制。

    MEMORY存储引擎,不支持事务,外键,所有数据放在内存中,处理速度非常快,但是内存数据断电就没有了(你懂得),数据处理默认使用hash索引,速度比使用B型树索引快。大小受限制。

    查看数据库引擎:

    SHOW ENGINES;

     

    数据表的基本操作

    创建表:

    USE `学生管理`;
    
    CREATE TABLE student3(
    	id char(9) NOT NULL COMMENT '学号',
    	name varchar(50) NOT NULL COMMENT '姓名',
    	sex char(2) default NULL COMMENT '性别',
    	PRIMARY KEY(id)
    )ENGINE=INNODB DEFAULT CHARSET=gbk;
    

      

    查看表:

    DESCRIBE student

    或者DESC student

    修改表:

    重命名:

    将表studen 重命名 student

    ALTER TABLE studen RENAME student;

    增加字段:

    ALTER TABLE student ADD age int;

    删除字段:

    ALTER TABLE student DROP age;

    更改表的存储引擎:

    ALTER TABLE student ENGINE=MyISAM;

    创建索引:

    ALTER TABLE student ADD UNIQUE INDEX index_no(sno);

    删除索引:

    DROP INDEX index_no ON student;

    创建视图:

    CREATE VIEW 视图

    AS

    SELECT * FROM student;

    查看视图:

    DESCRIBE 视图;

    删除视图:

    DROP VIEW 视图;

    触发器

    触发器是有insert ,update , delete 等事件触发的操作,满足触发条件,自动执行触发器定义的语句。

    创建触发器:

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

    ON 表名 FOR EACH ROW 执行语句

    比如

    CREATE TRIGGER 触发器3 AFTER INSERT
    ON student3 FOR EACH ROW
    INSERT INTO student4 VALUES('1','TRIGGER','BOY');
    

      

     查看触发器:

    SHOW TRIGGERS;

    删除触发器:

    DROP TRIGGER 触发器;

     数据表操作

    然后对数据表的增删改查和SQLServer差不多,因为都是SQL语句,所以几乎都是大同小异:

    限制查询:

    就是限制查询条数的语法不同,在MySQL的限制查询语句:

    SELECT * FROM student LIMIT 2;

    SELECT * FROM student LIMIT 2;
    

    查询student表的第2到第3条数据。

    多表查询:

    SELECT student.id,name, scores.score
    FROM student,scores 
    WHERE student.id=scores.sid;
    

     合并查询结果:

    使用UNION合并查询结果,并且去除重复的数据

    使用UNION ALL合并查询结果不去重

    SELECT id,name,SEX FROM student
    union all
    SELECT id,score,SID FROM scores;
    

    插入一条数据:

    INSERT INTO student
    
    VALUES(1,'david','boy');
    

      

     插入多条数据:

    INSERT INTO student
    
    VALUES
    
    (1,'david','boy'),
    
    (2,'MERRY','GIRL');
    

      

    存储过程:

    所有的SQL语句,大小写都是不敏感的

    定义变量:

    DECLARE my_sql VARCHAR(6);

    赋值:SET my_sql='hello';

    创建存储过程:

    和sqlserver(使用go)不同的是,MySQL使用;分号作为结束标志,那么如果一个存储过程由多个sql语句组成怎么办?

    这里使用DELIMITER $$ 或者DELIMITER ##

    这样就是即将是使用 自定义的字符作为结束标志,要想恢复使用分号,作为结束符号,运行DELIMITER ;(分号)即可

    DELIMITER ##
    CREATE PROCEDURE DELETE_STU(IN BH INT)
    BEGIN
    	DELETE FROM student WHERE id=BH;
    END##
    DELIMITER;
    

    存储过程调用

    使用CALL 存储过程

    CALL DELETE_STU(3)
    

    流程控制语句:

    IF ...THEN...ELSEIF...THEN...ELSE......END IF;

    DELIMITER $$
    CREATE PROCEDURE COMPAR(IN K1 INT,
    	IN K2 INT,OUT K3 CHAR(6))
    BEGIN
    	IF K1>K2 THEN
    		SET K3='大于';
    	ELSEIF K1=K2 THEN
    		SET K3='等于';
    	ELSE
    		SET K3='小于';
    	END IF;
    END $$
    DELIMITER;
    

     CASE条件语句

    一个小CASE可以充当一个IF-THEN-ELSE语句

    delimIter ##
    	CREATE PROCEDURE sexName(IN str VARCHAR(6),OUT sex VARCHAR(6))
    BEGIN
    	CASE str
    	WHEN 'M' THEN SET sex='男';
    	WHEN 'F' THEN SET sex='女';
    	ELSE SET sex='无';
    	END case;
    END ##
    delimiter;
    

      

    循环语句

    while

    while 条件 DO
               循环体;
    end while;
    delimIter ##
    	CREATE PROCEDURE dowhile()
    BEGIN
    	declare v1 int default 5;
    	while v1>0 DO
    		set v1=v1-1;
    	end while;
    END ##
    delimiter;

     计算1到n的和

    create PROCEDURE sum2(a int)
    BEGIN
    	DECLARE sum int DEFAULT 0;	
    	DECLARE i int default 1;
    while i<=a do 
    	set sum=sum+i;
    	set i=i+1;
    end while;	
    SELECT sum; 
    END

     repeat

    repeat
        循环体;
    until 条件 end repeat;
    create PROCEDURE sum2(a int)
    BEGIN
    	DECLARE sum int DEFAULT 0;	
    	DECLARE i int default 1;
    	REPEAT 
    		set sum=sum+i;
    		set i=i+1;
    	until i>a end REPEAT;	
    	SELECT sum; 
    END

    loop

    loop_name:loop
            if 条件 THEN -- 满足条件时离开循环
                    leave loop_name;  -- 和 break 差不多都是结束训话
            end if;
    end loop;
    create PROCEDURE sum2(a int)
    BEGIN
    	DECLARE sum int DEFAULT 0;	
    	DECLARE i int default 1;
    	loop_name:loop 
    		if i>a THEN
    			LEAVE loop_name;
    		end if;
    		set sum=sum+i;
    		set i=i+1;
    	end LOOP;	
    	SELECT sum; 
    END
    

      

    执行存储过程:

    call sum2(10);
    

      

    结果:55

    删除存储过程:

    drop PROCEDURE sum2;
    

      

    存储函数

    存储函数也是过程对象之一,和存储过程很像,但是存储函数没有输出参数,不用call调用,必须包含return语句(返回一行一列的数据)

    与存储过程不同,您可以在SQL语句中使用存储的函数,也可以在表达式中使用。 这有助于提高程序代码的可读性和可维护性。

    创建存储函数

    #定义函数
    delimiter $$
    create function getGameName(gameid int) returns VARCHAR(45)
    DETERMINISTIC
    begin
       return (select name from student where id=gameid);
    end $$
    delimiter;
    

      

    执行存储函数:

    select getGameName(2);
    

      

    删除存储函数:

    drop FUNCTION getGameName
    

      

    定义条件和处理程序

      定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。本小节中将详细讲解如何定义条件和处理程序。

    1.定义条件

      MySQL中可以使用DECLARE关键字来定义条件。其基本语法如下:

    DECLARE  condition_name  CONDITION  FOR  condition_value  
    condition_value:  
          SQLSTATE [VALUE] sqlstate_value | mysql_error_code 

      其中,condition_name参数表示条件的名称;condition_value参数表示条件的类型;sqlstate_value参数和mysql_error_code参数都可以表示MySQL的错误。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。

    【示例6】 下面定义"ERROR 1146 (42S02)"这个错误,名称为can_not_find。可以用两种不同的方法来定义,代码如下:

    //方法一:使用sqlstate_value  
    DECLARE  can_not_find  CONDITION  FOR  SQLSTATE  '42S02' ;  
    //方法二:使用mysql_error_code  
    DECLARE  can_not_find  CONDITION  FOR  1146 ; 

    2.定义处理程序

    MySQL中可以使用DECLARE关键字来定义处理程序。其基本语法如下:

    复制代码
    DECLARE handler_type HANDLER FOR 
    condition_value[,...] sp_statement  
    handler_type:  
        CONTINUE | EXIT | UNDO  
    condition_value:  
        SQLSTATE [VALUE] sqlstate_value |
    condition_name  | SQLWARNING  
           | NOT FOUND  | SQLEXCEPTION  | mysql_error_code 
    复制代码

      其中,handler_type参数指明错误的处理方式,该参数有3个取值。这3个取值分别是CONTINUE、EXIT和UNDO。CONTINUE表示遇到错误不进行处理,继续向下执行;EXIT表示遇到错误后马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时还不支持这种处理方式。

      注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL中现在还不能支持UNDO操作。因此,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行CONTINUE操作。

      condition_value参数指明错误类型,该参数有6个取值。sqlstate_value和mysql_error_code与条件定义中的是同一个意思。condition_name是DECLARE定义的条件名称。SQLWARNING表示所有以01开头的sqlstate_value值。NOT FOUND表示所有以02开头的sqlstate_value值。SQLEXCEPTION表示所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值。sp_statement表示一些存储过程或函数的执行语句。

    【示例7】 下面是定义处理程序的几种方式。代码如下:

    复制代码
    //方法一:捕获sqlstate_value  
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
    SET @info='CAN NOT FIND';  
    //方法二:捕获mysql_error_code  
    DECLARE CONTINUE HANDLER FOR 1146 SET @info='CAN NOT FIND';  
    //方法三:先定义条件,然后调用  
    DECLARE  can_not_find  CONDITION  FOR  1146 ;  
    DECLARE CONTINUE HANDLER FOR can_not_find SET 
    @info='CAN NOT FIND';  
    //方法四:使用SQLWARNING  
    DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';  
    //方法五:使用NOT FOUND  
    DECLARE EXIT HANDLER FOR NOT FOUND SET @info='CAN NOT FIND';  
    //方法六:使用SQLEXCEPTION  
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR'; 
    复制代码

      上述代码是6种定义处理程序的方法。

      第一种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为42S02,执行CONTINUE操作,并且输出"CAN NOT FIND"信息。

      第二种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并且输出"CAN NOT FIND"信息。

      第三种方法是先定义条件,然后再调用条件。这里先定义can_not_find条件,遇到1146错误就执行CONTINUE操作。

      第四种方法是使用SQLWARNING。SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出"ERROR"信息。

      第五种方法是使用NOT FOUND。NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出"CAN NOT FIND"信息。

      第六种方法是使用SQLEXCEPTION。SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出"ERROR"信息。

    MySQL用户安全性管理

    安装mysql之后会自动安装一个mysql数据库,里面的user表记录了多数的权限信息,包括ssl加密信息。

    root密码丢失的解决办法:

    1、停止权限判断:

    mysqld --skip -grant -tables

    2、登录用户修改密码:

    mysql -u root;

    UPDATE mysql.user set Password=PASSWORD('root') where User='root' and Host='localhost';

    3、加载权限列表:

    flush privileges;

  • 相关阅读:
    Unity3d for beginners
    iOS 8 swift 键盘不出来 ios 8 uitextfield keyboard not appearing
    关于Cookie跨域的问题
    45种Javascript技巧大全
    新.Net架构必备工具列表
    .NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
    ASP.NET 大文件下载的实现思路及代码
    理解 .NET 2015
    转:我是否该放弃VB.Net?
    .net中的一般处理程序实例
  • 原文地址:https://www.cnblogs.com/1906859953Lucas/p/9569496.html
Copyright © 2011-2022 走看看