zoukankan      html  css  js  c++  java
  • mysql 快速入门

    一.入门基础

    1.连接MYSQL:

    格式: mysql -h主机地址 -u用户名 -p用户密码
    1.1、例1:连接到本机上的MYSQL。
    首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>
    1.2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
    mysql -h110.110.110.110 -uroot -pabcd123
    (注:u与root可以不用加空格,其它也一样)
    1.3、退出MYSQL命令: exit (回车)

    2.修改密码

    格式:mysqladmin -u用户名 -p旧密码 password 新密码
    2.1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令
    mysqladmin -uroot -password ab12
    注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
    2.2、例2:再将root的密码改为djg345。
    mysqladmin -uroot -pab12 password djg345

    3.增加新用户

    格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

    3.1 例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
    grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

    3.2 例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法:

    例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
    grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
    如果你不想test2有密码,可以再打一个命令将密码消掉。
    grant select,insert,update,delete on mydb.* to test2@localhost identified by "";

    4.查阅版本

    1 mysql> select version(),current_date();
    2 +----------------+-----------------+
    3 | version() | current_date() |
    4 +----------------+-----------------+
    5 | 3.23.25a-debug | 2001-05-17 |
    6 +----------------+-----------------+
    7 1 row in set (0.01 sec)
    8 mysql>

    此命令要求mysql服务器告诉你它的版本号和当前日期。尝试用不同大小写操作上述命令,看结果如何。
    结果说明mysql命令的大小写结果是一致的。
    练习如下操作:

    1 mysql>Select (20+5)*4;
    2 mysql>Select (20+5)*4,sin(pi()/3);
    3 mysql>Select (20+5)*4 AS Result,sin(pi()/3); (AS: 指定假名为Result)

    5.一条命令可以分成多行输入,直到出现分号“;”为止:

     1 mysql> select
     2 -> USER()
     3 -> ,
     4 -> now()
     5 ->;
     6 +--------------------+---------------------+
     7 | USER() | now() |
     8 +--------------------+---------------------+
     9 | ODBC@localhost | 2001-05-17 2215 |
    10 +--------------------+---------------------+
    11 1 row in set (0.06 sec)
    12 mysql>
    13 注意中间的逗号和最后的分号的使用方法。

    6.一行多条命令

     1 输入如下命令:
     2 mysql> Select USER(); Select NOW();
     3 +------------------+
     4 | USER() |
     5 +------------------+
     6 | ODBC@localhost |
     7 +------------------+
     8 1 row in set (0.00 sec)
     9 
    10 +---------------------+
    11 | NOW() |
    12 +---------------------+
    13 | 2001-05-17 23:06:15 |
    14 +---------------------+
    15 1 row in set (0.00 sec)
    16 mysql>
    17 注意中间的分号,命令之间用分号隔开。

    7.显示当前存在的数据库

    使用SHOW语句找出在服务器上当前存在什么数据库:

    1 mysql> show databases;
    2 +----------+
    3 | Database |
    4 +----------+
    5 | mysql|
    6 | test |
    7 +----------+
    8 2 row in set (0.06 sec)
    9 mysql>

    7.选择数据库并显示当前选择的数据库

     1 mysql> USE mysql
     2 Database changed
     3 mysql>
     4 (USE 和 QUIT 命令不需要分号结束。)
     5 mysql> select database();
     6 +---------------+
     7 | database()|
     8 +---------------+
     9 | mysql |
    10 +---------------+
    11 1 row in set (0.00 sec)

    8.显示当前数据库中存在的表

    1 mysql> SHOW TABLES;

    9.显示表(db)的内容

    1 mysql>select * from db;

    10.命令的取消

    当命令输入错误而又无法改变(多行语句情形)时,只要在分号出现前就可以用 c来取消该条命令

    1 mysql> select
    2 -> user()
    3 -> c
    4 mysql>

    11.创建一个数据库abccs

    1 mysql> Create DATABASE abccs;
    2 注意不同操作系统对大小写的敏感。

    12.显示表的结构:

     1 mysql> DESCRIBE mytable;
     2 +-------------+-------------+------+-----+---------+-------+
     3 | Field | Type| Null | Key | Default | Extra |
     4 +-------------+-------------+------+-----+---------+-------+
     5 | name| varchar(20) | YES | | NULL| |
     6 | sex | char(1) | YES | | NULL| |
     7 | birth | date| YES | | NULL| |
     8 | deathaddr | varchar(20) | YES | | NULL| |
     9 +-------------+-------------+------+-----+---------+-------+
    10 4 rows in set (0.00 sec)

    二 .基本操作

    1.创建,删除和最基本查询:

    1 显示数据库     mysql->show databases;
    2 创建数据库     mysql->create database db;
    3 删除数据库  mysql->drop database db;
    4 选择数据库     mysql->use db;        此时你已经进入你刚才所建立的数据库db
    5 创建表         mysql->create table mytable(name varchar(20),sex(char(1),birth date);
    6 删除表    mysql->drop table mytable;
    7 显示表的内容   mysql->show tables;
    8 显示表的结构   mysql->describe mytable;

    2.对列的操作

    1 在一个表中增加一条字段 mysql->alter table yourtable add  name varchar(20)not null;
    2 删除一个字段  mysql->alter table yourtable drop name ;
    3.选择特定列
    假如你想查看表中的所有人的姓名,则可以这样操作:
    mysql> Select name FROM mytable;
    +----------+
    | name |
    +----------+
    | abccs |
    | mary |
    | tom |
    +----------+
    3 row in set (0.00 sec)
    如果想列出姓名和性别两列,则可以用逗号将关键词name和birth分开:
    myaql> select name,birth from mytable;

    3.对行的操作

    1 插入一条记录   mysql->insert into mytable values('summer','m','1983-08-24');
    2 删除一条记录  mysql->delete from mytable where name='summer';
    3 修改一条记录  mysql->update mytable set sex='vm' where name='summer';
    4 插入多条记录   mysql->insert into mytable  select *from yourtable;( 这种形式的INSERT 语句中,新行的数据值不是在语句正文中明确地指定的.而是语句中指定的一个数据库查询. 该查询的逻辑限制: »查询不能含有ORDER BY子句. »查询结果应含有与INSERT语句中列数目相同的列,且数据类型必须逐列兼容. )

    4.在查询结果中显示列名

    1 用as关键字:select name as '姓名'   from students order by age
    2 直接表示:select name '姓名'   from students order by age

    5.精确查找

    1 用in限定范围:select * from students where native in ('湖南', '四川')
    2 用between...andselect * from students where age between 20 and 30
    3 用 比较测试符:(包括=,<>,<,<=,>,>=select * from students where name = '李山'
    4 用like:select * from students where name  like  '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'% 李%';若是第二个字为李,则应为'_李%''_李''_李_'。)
    5[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%')注:关于这个字符我在mysql里用的时候mysql把它当两个普通自符处理的。
    6 [^]stockname like '[^F-M]%' --------- (^排除指定范围)

    6.

    1 count()求总数,如:select count(*)  from students (求学生总人数)
    2 avg(列)求平均,如:select avg(mark)  from grades where cno=’B2’
    3 max(列)和min(列),求最大与最小

    7.用文本方式将数据装入一个数据库表

    如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。
    创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在
    Create TABLE语句中列出的列次序给出,例如:

    abccs f 1977-07-07 china  
    mary f 1978-12-12 usa
    tom m 1970-09-02 usa

    使用下面命令将文本文件“mytable.txt”装载到mytable表中:

    1 mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;

    再使用如下命令看看是否已将数据输入到数据库表中:

    1 mysql> select * from mytable;

    8.对行进行排序

     1 我们可以对表中的记录按生日大小进行排序:
     2 mysql> Select name, birth FROM mytable orDER BY birth;
     3 +----------+------------+
     4 | name | birth |
     5 +----------+------------+
     6 | tom | 1973-09-02 |
     7 | abccs| 1977-07-07 |
     8 | mary | 1978-12-12 |
     9 +----------+------------+
    10 3 row in set (0.00 sec)
    11 
    12 我们可以用DESC来进行逆序排序:
    13 mysql> Select name, birth FROM mytable orDER BY birth DESC;
    14 +----------+------------+
    15 | name | birth |
    16 +----------+------------+
    17 | mary | 1978-12-12 |
    18 | abccs| 1977-07-07 |
    19 | tom | 1973-09-02 |
    20 +----------+------------+
    21 3 row in set (0.00 sec)

    9.行计数

     1 数据库经常要统计一些数据,如表中员工的数目,我们就要用到行计数函数COUNT()。
     2 COUNT()函数用于对非NULL结果的记录进行计数:
     3 mysql> Select COUNT(*) FROM mytable;
     4 +----------+
     5 | COUNT(*) |
     6 +----------+
     7 |3 |
     8 +----------+
     9 1 row in set (0.06 sec)
    10 
    11 员工中男女数量:
    12 mysql> Select sex, COUNT(*) FROM mytable GROUP BY sex;
    13 +------+----------+
    14 | sex | COUNT(*) |
    15 +------+----------+
    16 | f|2 |
    17 | m|1 |
    18 +------+----------+
    19 2 row in set (0.00 sec)
    20 
    21 注意我们使用了GROUP BY对SEX进行了分组。

    10.多表查询

     1 假如我们有两个表: mytable 和 title。利用这两个表我们可以进行组合查询:
     2 例如我们要查询作者abccs的姓名、性别、文章:
     3 mysql> Select name,sex,title FROM mytable,title
     4 -> Where name=writer AND name='abccs';
     5 +-------+------+-------+
     6 | name | sex | title |
     7 +-------+------+-------+
     8 | abccs | f| a1|
     9 | abccs | f| a2|
    10 +-------+------+-------+
    11 
    12 上面例子中,由于作者姓名、性别、文章记录在两个不同表内,因此必须使用组合来进行查询。必须要指定一个表中的记录如何与其它表中的记录进行匹配。
    13 注意:如果第二个表title中的writer列也取名为name(与mytable表中的name列相同)而不是writer时,就必须用mytable.name和title.name表示,以示区别。
    14 
    15 再举一个例子,用于查询文章a2的作者、出生地和出生日期:
    16 mysql> select title,writer,birthaddr,birth from mytable,title
    17 -> where mytable.name=title.writer and title='a2';
    18 +-------+--------+-----------+------------+
    19 | title | writer | birthaddr | birth |
    20 +-------+--------+-----------+------------+
    21 | a2| abccs | china | 1977-07-07 |
    22 +-------+--------+-----------+------------+

    11.数据库的备份:
    退回到DOS:

    1 mysql> quit
    2 d:mysqlbin
    3 使用如下命令对数据库abccs进行备份:
    4 mysqldump --opt abccs>abccs.dbb
    5 abccs.dbb就是你的数据库abccs的备份文件。

    12.用批处理方式使用MySQL:

     1 首先建立一个批处理文件mytest.sql,内容如下:
     2 use abccs;
     3 select * from mytable;
     4 select name,sex from mytable where name='abccs';
     5 
     6 在DOS下运行如下命令:
     7 d:mysqlbin mysql < mytest.sql
     8 在屏幕上会显示执行结果。
     9 
    10 如果想看结果,而输出结果很多,则可以用这样的命令:
    11 mysql < mytest.sql | more
    12 
    13 我们还可以将结果输出到一个文件中:
    14 mysql < mytest.sql > mytest.out

    三. Mysql存储过程

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

    一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

    1.MySQL存储过程的创建

    MySQL存储过程创建的格式:CREATE PROCEDURE 过程名 ([过程参数[,...]]) [特性 ...] 过程体
    如:

    1 mysql> DELIMITER //  
    2 mysql> CREATE PROCEDURE proc1(OUT s int)  
    3     -> BEGIN 
    4     -> SELECT COUNT(*) INTO s FROM user;  
    5     -> END 
    6     -> //  
    7 mysql> DELIMITER ; 

    注:

    (1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

    (2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。

    (3)过程体的开始与结束使用BEGIN与END进行标识。

    这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。

    2.

    参数

    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

    CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

    IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

    OUT 输出参数:该值可在存储过程内部被改变,并可返回

    INOUT 输入输出参数:调用时指定,并且可被改变和返回

      1 Ⅰ. IN参数例子
      2 创建:
      3 mysql > DELIMITER //  
      4 mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  
      5 -> BEGIN   
      6 -> SELECT p_in;   
      7 -> SET p_in=2;   
      8 -> SELECT p_in;   
      9 -> END;   
     10 -> //  
     11 mysql > DELIMITER ; 
     12 
     13 执行结果:
     14 mysql > SET @p_in=1;  
     15 mysql > CALL demo_in_parameter(@p_in);  
     16 +------+  
     17 | p_in |  
     18 +------+  
     19 |   1  |   
     20 +------+  
     21  
     22 +------+  
     23 | p_in |  
     24 +------+  
     25 |   2  |   
     26 +------+  
     27  
     28 mysql> SELECT @p_in;  
     29 +-------+  
     30 | @p_in |  
     31 +-------+  
     32 |  1    |  
     33 +-------+  
     34 
     35 以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值
     36  
     37 Ⅱ.OUT参数例子
     38 创建:
     39 mysql > DELIMITER //  
     40 mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)  
     41 -> BEGIN 
     42 -> SELECT p_out;  
     43 -> SET p_out=2;  
     44 -> SELECT p_out;  
     45 -> END;  
     46 -> //  
     47 mysql > DELIMITER ; 
     48 
     49 执行结果:
     50 mysql > SET @p_out=1;  
     51 mysql > CALL sp_demo_out_parameter(@p_out);  
     52 +-------+  
     53 | p_out |   
     54 +-------+  
     55 | NULL  |   
     56 +-------+  
     57  
     58 +-------+  
     59 | p_out |  
     60 +-------+  
     61 |   2   |   
     62 +-------+  
     63  
     64 mysql> SELECT @p_out;  
     65 +-------+  
     66 | p_out |  
     67 +-------+  
     68 |   2   |  
     69 +-------+  
     70 
     71 Ⅲ. INOUT参数例子
     72 创建:
     73 mysql > DELIMITER //   
     74 mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)   
     75 -> BEGIN 
     76 -> SELECT p_inout;  
     77 -> SET p_inout=2;  
     78 -> SELECT p_inout;   
     79 -> END;  
     80 -> //   
     81 mysql > DELIMITER ; 
     82  
     83  
     84 执行结果:
     85 mysql > SET @p_inout=1;  
     86 mysql > CALL demo_inout_parameter(@p_inout) ;  
     87 +---------+  
     88 | p_inout |  
     89 +---------+  
     90 |    1    |  
     91 +---------+  
     92  
     93 +---------+  
     94 | p_inout |   
     95 +---------+  
     96 |    2    |  
     97 +---------+  
     98  
     99 mysql > SELECT @p_inout;  
    100 +----------+  
    101 | @p_inout |   
    102 +----------+  
    103 |    2     |  
    104 +----------+ 

    2.变量

     1 Ⅰ. 变量定义
     2 DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
     3 其中,datatype为MySQL的数据类型,如:int, float, date, varchar(length)
     4 例如:
     5 DECLARE l_int int unsigned default 4000000;  
     6 DECLARE l_numeric number(8,2) DEFAULT 9.95;  
     7 DECLARE l_date date DEFAULT '1999-12-31';  
     8 DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  
     9 DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';   
    10  
    11  
    12 Ⅱ. 变量赋值
    13  SET 变量名 = 表达式值 [,variable_name = expression ...]
    14  
    15 Ⅲ. 用户变量
    16  
    17 ⅰ. 在MySQL客户端使用用户变量
    18 mysql > SELECT 'Hello World' into @x;  
    19 mysql > SELECT @x;  
    20 +-------------+  
    21 |   @x        |  
    22 +-------------+  
    23 | Hello World |  
    24 +-------------+  
    25 mysql > SET @y='Goodbye Cruel World';  
    26 mysql > SELECT @y;  
    27 +---------------------+  
    28 |     @y              |  
    29 +---------------------+  
    30 | Goodbye Cruel World |  
    31 +---------------------+  
    32  
    33 mysql > SET @z=1+2+3;  
    34 mysql > SELECT @z;  
    35 +------+  
    36 | @z   |  
    37 +------+  
    38 |  6   |  
    39 +------+  
    40 ⅱ. 在存储过程中使用用户变量
    41 mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
    42 mysql > SET @greeting='Hello';  
    43 mysql > CALL GreetWorld( );  
    44 +----------------------------+  
    45 | CONCAT(@greeting,' World') |  
    46 +----------------------------+  
    47 |  Hello World               |  
    48 +----------------------------+  
    49  
    50 ⅲ. 在存储过程间传递全局范围的用户变量
    51 mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  
    52 mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);  
    53 mysql> CALL p1( );  
    54 mysql> CALL p2( );  
    55 +-----------------------------------------------+  
    56 | CONCAT('Last procedure was ',@last_proc  |  
    57 +-----------------------------------------------+  
    58 | Last procedure was p1                         |  
    59 +-----------------------------------------------+  
    60  
    61  
    62 注意:
    63 ①用户变量名一般以@开头
    64 ②滥用用户变量会导致程序难以理解及管理

    3.注释

    MySQL存储过程可使用两种风格的注释

    双模杠:--

    该风格一般用于单行注释

    c风格: 一般用于多行注释

    例如:

     1 mysql > DELIMITER //  
     2 mysql > CREATE PROCEDURE proc1 --name存储过程名  
     3 -> (IN parameter1 INTEGER)   
     4 -> BEGIN   
     5 -> DECLARE variable1 CHAR(10);   
     6 -> IF parameter1 = 17 THEN   
     7 -> SET variable1 = 'birds';   
     8 -> ELSE 
     9 -> SET variable1 = 'beasts';   
    10 -> END IF;   
    11 -> INSERT INTO table1 VALUES (variable1);  
    12 -> END   
    13 -> //  
    14 mysql > DELIMITER ;  
    15  

    4.

     MySQL存储过程的调用

    用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

    5.

     MySQL存储过程的查询

    我们像知道一个数据库下面有那些表,我们一般采用show tables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。

    我们可以用

    select name from mysql.proc where db=’数据库名’;

    或者

    select routine_name from information_schema.routines where routine_schema='数据库名';

    或者

    show procedure status where db='数据库名';

    进行查询。

    如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?

    答案是:我们可以查看存储过程的详细,但是需要用另一种方法:

    SHOW CREATE PROCEDURE 数据库.存储过程名;

    就可以查看当前存储过程的详细。

    6.

    MySQL存储过程的修改

    ALTER PROCEDURE

    更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

    7.      MySQL存储过程的删除

    删除一个存储过程比较简单,和删除表一样:

    DROP PROCEDURE

    从MySQL的表格中删除一个或多个存储过程。

    8.      MySQL存储过程的控制语句

      1 (1). 变量作用域
      2 内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
      3 过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
      4 给会话变量来保存其值。
      5  
      6  
      7 mysql > DELIMITER //  
      8 mysql > CREATE PROCEDURE proc3()  
      9      -> begin 
     10      -> declare x1 varchar(5) default 'outer';  
     11      -> begin 
     12      -> declare x1 varchar(5) default 'inner';  
     13      -> select x1;  
     14      -> end;  
     15      -> select x1;  
     16      -> end;  
     17      -> //  
     18 mysql > DELIMITER ;  
     19  
     20  (2). 条件语句
     21 Ⅰ. if-then -else语句
     22  
     23  
     24  
     25 mysql > DELIMITER //  
     26 mysql > CREATE PROCEDURE proc2(IN parameter int)  
     27      -> begin 
     28      -> declare var int;  
     29      -> set var=parameter+1;  
     30      -> if var=0 then 
     31      -> insert into t values(17);  
     32      -> end if;  
     33      -> if parameter=0 then 
     34      -> update t set s1=s1+1;  
     35      -> else 
     36      -> update t set s1=s1+2;  
     37      -> end if;  
     38      -> end;  
     39      -> //  
     40 mysql > DELIMITER ;  
     41 
     42 Ⅱ. case语句: 
     43 mysql > DELIMITER //  
     44 mysql > CREATE PROCEDURE proc3 (in parameter int)  
     45      -> begin 
     46      -> declare var int;  
     47      -> set var=parameter+1;  
     48      -> case var  
     49      -> when 0 then   
     50      -> insert into t values(17);  
     51      -> when 1 then   
     52      -> insert into t values(18);  
     53      -> else   
     54      -> insert into t values(19);  
     55      -> end case;  
     56      -> end;  
     57      -> //  
     58 mysql > DELIMITER ; 
     59  
     60 (3). 循环语句
     61 Ⅰ. while ···· end while 62 mysql > DELIMITER //  
     63 mysql > CREATE PROCEDURE proc4()  
     64      -> begin 
     65      -> declare var int;  
     66      -> set var=0;  
     67      -> while var<6 do  
     68      -> insert into t values(var);  
     69      -> set var=var+1;  
     70      -> end while;  
     71      -> end;  
     72      -> //  
     73 mysql > DELIMITER ; 
     74  
     75  
     76 Ⅱ. repeat···· end repeat:
     77 它在执行操作后检查结果,而while则是执行前进行检查。
     78 mysql > DELIMITER //  
     79 mysql > CREATE PROCEDURE proc5 ()  
     80      -> begin   
     81      -> declare v int;  
     82      -> set v=0;  
     83      -> repeat  
     84      -> insert into t values(v);  
     85      -> set v=v+1;  
     86      -> until v>=5  
     87      -> end repeat;  
     88      -> end;  
     89      -> //  
     90 mysql > DELIMITER ;  
     91  
     92 
     93 Ⅲ. loop ·····end loop:
     94 loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
     95 mysql > DELIMITER //  
     96 mysql > CREATE PROCEDURE proc6 ()  
     97      -> begin 
     98      -> declare v int;  
     99      -> set v=0;  
    100      -> LOOP_LABLE:loop  
    101      -> insert into t values(v);  
    102      -> set v=v+1;  
    103      -> if v >=5 then 
    104      -> leave LOOP_LABLE;  
    105      -> end if;  
    106      -> end loop;  
    107      -> end;  
    108      -> //  
    109 mysql > DELIMITER ;  
    110  
    111  
    112 Ⅳ. LABLES 标号:
    113 标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
    114  
    115 (4). ITERATE迭代
    116 Ⅰ. ITERATE:
    117 通过引用复合语句的标号,来从新开始复合语句
    118 mysql > DELIMITER //  
    119 mysql > CREATE PROCEDURE proc10 ()  
    120      -> begin 
    121      -> declare v int;  
    122      -> set v=0;  
    123      -> LOOP_LABLE:loop  
    124      -> if v=3 then   
    125      -> set v=v+1;  
    126      -> ITERATE LOOP_LABLE;  
    127      -> end if;  
    128      -> insert into t values(v);  
    129      -> set v=v+1;  
    130      -> if v>=5 then 
    131      -> leave LOOP_LABLE;  
    132      -> end if;  
    133      -> end loop;  
    134      -> end;  
    135      -> //  
    136 mysql > DELIMITER ; 
    137  

    9.MySQL存储过程的基本函数

      1 (1).字符串类
      2 CHARSET(str) //返回字串字符集
      3 CONCAT (string2 [,... ]) //连接字串
      4 INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0
      5 LCASE (string2 ) //转换成小写
      6 LEFT (string2 ,length ) //从string2中的左边起取length个字符
      7 LENGTH (string ) //string长度
      8 LOAD_FILE (file_name ) //从文件读取内容
      9 LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置
     10 LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
     11 LTRIM (string2 ) //去除前端空格
     12 REPEAT (string2 ,count ) //重复count次
     13 REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
     14 RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
     15 RTRIM (string2 ) //去除后端空格
     16 STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
     17 SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
     18 注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1 
     19  
     20 mysql> select substring('abcd',0,2);  
     21 +-----------------------+  
     22 | substring('abcd',0,2) |  
     23 +-----------------------+  
     24 |                       |  
     25 +-----------------------+  
     26 1 row in set (0.00 sec)  
     27  
     28 mysql> select substring('abcd',1,2);  
     29 +-----------------------+  
     30 | substring('abcd',1,2) |  
     31 +-----------------------+  
     32 |     ab                |  
     33 +-----------------------+  
     34 1 row in set (0.02 sec)  
     35 TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
     36 UCASE (string2 ) //转换成大写
     37 RIGHT(string2,length) //取string2最后length个字符
     38 SPACE(count) //生成count个空格
     39 (2).数学类
     40 ABS (number2 ) //绝对值
     41 BIN (decimal_number ) //十进制转二进制
     42 CEILING (number2 ) //向上取整
     43 CONV(number2,from_base,to_base) //进制转换
     44 FLOOR (number2 ) //向下取整
     45 FORMAT (number,decimal_places ) //保留小数位数
     46 HEX (DecimalNumber ) //转十六进制
     47 注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143
     48 也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
     49 LEAST (number , number2 [,..]) //求最小值
     50 MOD (numerator ,denominator ) //求余
     51 POWER (number ,power ) //求指数
     52 RAND([seed]) //随机数
     53 ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]
     54 注:返回类型并非均为整数,如:
     55 (1)默认变为整形值
     56 mysql> select round(1.23);  
     57 +-------------+  
     58 | round(1.23) |  
     59 +-------------+  
     60 |           1 |  
     61 +-------------+  
     62 1 row in set (0.00 sec)  
     63  
     64 mysql> select round(1.56);  
     65 +-------------+  
     66 | round(1.56) |  
     67 +-------------+  
     68 |           2 |  
     69 +-------------+  
     70 1 row in set (0.00 sec) 
     71 
     72 
     73 (2)可以设定小数位数,返回浮点型数据
     74 mysql> select round(1.567,2);  
     75 +----------------+  
     76 | round(1.567,2) |  
     77 +----------------+  
     78 |           1.57 |  
     79 +----------------+  
     80 1 row in set (0.00 sec) 
     81 SIGN (number2 ) //
     82  
     83 (3).日期时间类
     84 ADDTIME (date2 ,time_interval ) //将time_interval加到date2
     85 CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
     86 CURRENT_DATE ( ) //当前日期
     87 CURRENT_TIME ( ) //当前时间
     88 CURRENT_TIMESTAMP ( ) //当前时间戳
     89 DATE (datetime ) //返回datetime的日期部分
     90 DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
     91 DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
     92 DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
     93 DATEDIFF (date1 ,date2 ) //两个日期差
     94 DAY (date ) //返回日期的天
     95 DAYNAME (date ) //英文星期
     96 DAYOFWEEK (date ) //星期(1-7) ,1为星期天
     97 DAYOFYEAR (date ) //一年中的第几天
     98 EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
     99 MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
    100 MAKETIME (hour ,minute ,second ) //生成时间串
    101 MONTHNAME (date ) //英文月份名
    102 NOW ( ) //当前时间
    103 SEC_TO_TIME (seconds ) //秒数转成时间
    104 STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
    105 TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
    106 TIME_TO_SEC (time ) //时间转秒数]
    107 WEEK (date_time [,start_of_week ]) //第几周
    108 YEAR (datetime ) //年份
    109 DAYOFMONTH(datetime) //月的第几天
    110 HOUR(datetime) //小时
    111 LAST_DAY(date) //date的月的最后日期
    112 MICROSECOND(datetime) //微秒
    113 MONTH(datetime) //114 MINUTE(datetime) //分返回符号,正负或0
    115 SQRT(number2) //开平方

    四.mysql索引

    假如我们创建了一个 testIndex 表:
      CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);
      我们随机向里面插入了 1000 条记录,其中有一条 i_testID vc_Name 555 erquan
      在查找 vc_Name="erquan" 的记录 SELECT * FROM testIndex WHERE vc_Name='erquan'; 时,如果在vc_Name 上已经建立了索引,MySql 无须任何扫描,即准确可找到该记录!相反,MySql 会扫描所有记录,即要查询 1000。
     
    假如:原始表student字段:
     1 mysql> select column_name,data_type
     2     -> from information_schema.columns
     3     -> where table_name = 'student';
     4 +-------------+-----------+
     5 | column_name | data_type |
     6 +-------------+-----------+
     7 | stu_id      | int       |
     8 | stu_name    | varchar   |
     9 | stu_tel     | int       |
    10 | stu_score   | int       |
    11 +-------------+-----------+
    12 4 rows in set (0.01 sec)

    表中原始数据:

     1 mysql> select * from student;
     2 +--------+----------+---------+-----------+
     3 | stu_id | stu_name | stu_tel | stu_score |
     4 +--------+----------+---------+-----------+
     5 |      1 | a        |     151 |        60 |
     6 |      2 | b        |     152 |        61 |
     7 |      3 | c        |     153 |        62 |
     8 |      4 | d        |     154 |        63 |
     9 +--------+----------+---------+-----------+
    10 4 rows in set (0.00 sec)

    索引创建格式:

    1 create [ <index type> ] index <index name> [ using {btree | hash} ] on table specification ( <column in index> [,<column in index> ] )
     <index type> := unique | fulltext | spatial <column in index>:=<column name> [asc | desc]

    创建一个最简单的索引:

    这里创建立一个非唯一性的索引,其中默认使用asc升序排列。

    如果没有指定using声明的话,mysql自动创建一个B树。

    1 mysql> create index stu_index 
    2     -> on student(stu_id);
    3 Query OK, 0 rows affected (0.36 sec)
    4 Records: 0  Duplicates: 0  Warnings: 0

    所以上面的索引其实是这样子的:

    1 mysql> create index stu_index using btree 
    2     -> on student(stu_id asc);
    3 Query OK, 0 rows affected (0.19 sec)
    4 Records: 0  Duplicates: 0  Warnings: 0

    当然,btree索引可以换成哈希索引。

    1 mysql> create unique index stu_index using hash 
    2     -> on student(stu_id,stu_name);
    3 Query OK, 0 rows affected (0.19 sec)
    4 Records: 0  Duplicates: 0  Warnings: 0

    添加索引:

    1 mysql> alter table student
    2     -> add unique index stu_index2
    3     -> using hash (stu_tel);
    4 Query OK, 0 rows affected (0.36 sec)
    5 Records: 0  Duplicates: 0  Warnings: 0

    删除索引:

    1 mysql> drop index stu_index on student;
    2 Query OK, 0 rows affected (0.22 sec)
    3 Records: 0  Duplicates: 0  Warnings: 0

    创建表时定义索引:

    1 mysql> create table student(
    2     -> stu_id          int primary key,
    3     -> stu_name        varchar(5) not null,
    4     -> stu_tel         int(5) unique,
    5     -> stu_score       int(2),
    6     -> index stu_index(stu_id)
    7     -> );

    五 .Mysql视图

    视图是数据库中的虚拟表,它存储的不是自己的内容,而是经过select从其他表整合而来的。当其他表的内容改变是,视图内的内容跟着改变。在一定条件下,对视图的更新也将改变源表。

    创建视图:

    1 create [ or replace ] view <view name> [<column list>] as <table expression> [with [ cascaded |local ] check option ]
    2 mysql> create view view1 as
    3     -> (select * from student);
    4 Query OK, 0 rows affected (0.16 sec)
     1 mysql> select * from view1;
     2 +--------+----------+---------+-----------+
     3 | stu_id | stu_name | stu_tel | stu_score |
     4 +--------+----------+---------+-----------+
     5 |      1 | a        |     151 |        60 |
     6 |      2 | b        |     152 |        61 |
     7 |      3 | c        |     153 |        62 |
     8 |      4 | d        |     154 |        63 |
     9 +--------+----------+---------+-----------+
    10 4 rows in set (0.00 sec)

    建视图时,如果视图已存在,可用replace重新覆盖创建。创建视图时还可以更改原始列名

     1 mysql> create or replace view view1(id,name,tel,score) as
     2     -> (select * from student);
     3 Query OK, 0 rows affected (0.03 sec)
     4 
     5 mysql> select * from view1;
     6 +----+------+------+-------+
     7 | id | name | tel  | score |
     8 +----+------+------+-------+
     9 |  1 | a    |  151 |    60 |
    10 |  2 | b    |  152 |    61 |
    11 |  3 | c    |  153 |    62 |
    12 |  4 | d    |  154 |    63 |
    13 +----+------+------+-------+
    14 4 rows in set (0.00 sec)

    删除视图:

    1 drop view view1;

    学习参考:

    http://blog.sina.com.cn/s/blog_603c27140100hqvh.html

    http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html

    http://www.2cto.com/database/201403/286731.html

    http://laozhao.blog.51cto.com/blog/25213/7644

  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/kunhu/p/3726676.html
Copyright © 2011-2022 走看看