mysql 的基础使用包括存储过程,触发器,游标等

mysql 的基础使用包括存储过程,触发器,游标等

首先介绍一下:

        mysql的数据存储引擎:

常用的两种引擎:

    InnoDB存储引擎:

        a,支持ACID,简单地说就是支持事务完整性、一致性;
        b,支持行锁,以及类似ORACLE的一致性读,多用户并发;
        c,独有的聚集索引主键设计方式,可大幅提升并发读写性能;
        d,支持外键;
        e,支持崩溃数据自修复

     MyISAM
        a,不支持 每次查询具有原子性
        b,只支持表锁
        c,强调的是性能,其执行数 度比InnoDB类型更快,但是不提供事务支持

        d,如果执行大量的SELECT,MyISAM是更好的选择

mysql的锁:


开销、加锁速度、死锁、粒度、并发性能

        表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低,(常理来说,就知道表锁的加锁快

        行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

        页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

首先对于BDB存储引擎来说,已经被取代,那么我们只讨论表锁和行锁。(现在比较火的就是去IOE(这个可以自查(这个技术点, 太高了)))。

        表锁 更适用于以查询为主,只有少量按索引条件更新数据的应用

        行锁 更适用于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用

我们怎么理解并发度的高低呢?

        我们可以联想到对于Java的synchronized这个关键字来说,对于直接在类名上加synchronized,那么方法过多的话,并发度肯定低,那么,我们的解决办法就是对每个方法单独加锁。


现在,进入mysql的基础操作:

        安装数据库(具体就不讲了)。

 介绍一下数据类型:

整数类型                  字节数             无符号( unsigned ) 范围       有符号( signed ) 范围( 默认)
TINYINT                       1                      0~255                                       -128~127
SMALLINT                   2                     0~65535                             -32768~32767
MEDIUMINT                3                   0~16777215                       -8388608~8388607
INT                              4                  0~4294967295                  -2147483648~2147483647
INTEGER                     4                  0~4294967295                 -2147483648~2147483647

BIGINT                        8       0~18446744073709551615      -9223372036854775808~9223372036854775807

FLOAT                        4    
DOUBLE                    8 

DECIMAL(M,D)        M+2

YEAR                        1                        1910~2155                                 0000
DATE                         4                       1000-01-01~9999-12-31                 0000:00:00
TIME                         3                         -838:59:59~838:59:59                     00:00:00
DATETIME                 8                         1000-01-01                                     00:00:00

TIMESTAMP             4                         19700101080001~20380119111407     00000000000000

CHAR                 固定长度字符串
VARCHAR             可变长度字符串
TEXT                    大文本(TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT )
ENUM                 枚举类型(只能取一个元素)

SET                     集合类型(能取多个元素)

BINARY(M)             字节数为 M ,允许长度为 0~M 的定长二进制字符串
VARBINARY(M)     允许长度为 0~M 的变长二进制字符串,字节数为值的长度加 1
BIT(M)                     M 位二进制数据,最多 255 个字节
TINYBLOB             可变长二进制数据,最多 255 个字节
BLOB                     可变长二进制数据,最多(2 16 -1 )个字节
MEDIUMBLOB       可变长二进制数据,最多(2 24 -1 )个字节

LONGBLOB             可变长二进制数据,最多(2 32 -1)

显示所有数据库:

        show databases;

创建数据库:

      create database 数据库名;

删除数据库:

    drop    database 数据库名;

创建表:

  

约束条件 说明
    PRIMARYKEY  标识该属性为该表的主键,可以唯一的标识对应的记录
    FOREIGN KEY 标识该属性为该表的外键,与某表的主键关联
    NOT NULL      标识该属性不能为空
    UNIQUE          标识该属性的值是唯一的
    AUTO_INCREMENT 标识该属性的值自动增加

    DEFAULT 为该属性设置默认值

单表查询:

select * from book;

select * from  book where id='1';

select * from book where name (not in) /in ('zs','w5');              

select * from book where name (not between)between 'zs 'and 'w5';  

select * from book where name not like (like) name='z*';

select * from book where name is not null (null);

select * from book where name='zs' and(or) id=2;

去重查询

select distinct name from book;

排序查询

select * from book order by asc /desc;

GROUP BY 分组查询

select sum(count) as count1 from book group by name having count1<10;

分页查询

select id,name from book limit  2,4;    //数据库是从0开始,那么2就是从第三行开始,读取4行

连接查询

        内连接

SELECT A.name, B.address FROM A inner JOIN B ON A.id = B.A_id;

      左连接

SELECT A.name, B.address FROM A LEFT JOIN B ON A.id = B.A_id; 

 可以查询出“表名 1”的所有记录,而“表名 2”中,只能查询出匹配的记录;

      右连接

SELECT A.name, B.address FROM A right JOIN B ON A.id = B.A_id;

可以查询出“表名 2”的所有记录,而“表名 1”中,只能查询出匹配的记录


子查询

    in关键字

    select * form book where id in(select id form returnbook where id < 20);


    带比较运算符


    带 Exists 关键字的子查询

    假如子查询查询到记录,则进行外层查询,否则,不执行外层查询;


    带 Any 关键字的子查询

    ANY 关键字表示满足其中任一条件;

  

     带 All 关键字的子查询

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


合并查询的结果

   union        // 去掉相同的结果

   union all   //不去掉相同的结果


插入数据

insert into book (id ,name ) values (1,'你好');

更新数据

updata book set name ='您好dd' where id=1;

删除数据

delete from book where id =1;


触发器

           触发器(TRIGGER)是由事件来触发某个操作。这些事件包括 INSERT 语句、UPDATE 语句和 DELETE 语句。
当数据库系统执行这些事件时,就会激活触发器执行相应的操作。

create  trigger 触发器名 after/before insert on book(表名) for each row 执行语句


CREATE TRIGGER trig_book AFTER INSERT 
     ON t_book FOR EACH ROW

        UPDATE t_bookType SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id;

create  trigger 触发器名 after/before  delete on book  for each row begin  执行语句 end

CREATE TRIGGER trig_book2 AFTER DELETE 
    ON t_book FOR EACH ROW
    BEGIN
       UPDATE t_bookType SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id;
       INSERT INTO t_log VALUES(NULL,NOW(),'在book表里删除了一条数据');
       DELETE FROM t_test WHERE old.bookTypeId=t_test.id;

    END

1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示:


2.当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说就是old,如图所示:

3.当使用update语句的时候,当修改原表数据的时候相对于修改数据后表的数据来说原表中修改的那条数据就是old,而修改数据后表被修改的那条数据就是new,如图所示:


    查看触发器

          SHOW TRIGGERS 语句查看触发器信息

          在 triggers 表中查看触发器信息

 删除触发器

        drop  触发器名

存储过程与函数

        存储过程和函数是在数据库中定义一些 SQL 语句的集合,然后直接调用这些存储过程和函数来执行已经定义好
的 SQL 语句。存储过程和函数可以避免开发人员重复的编写相同的 SQL 语句。而且,存储过程和函数是在 MySQL
服务器中存储和执行的,可以减少客户端和服务器端的数据传输

create procedure  存储过程名 (in id int,out name char,inout count int)

        begin

           执行语句

        end

存储函数
    create function 存储函数名()
    returns 返回类型(char(20))
    return  (sql 语句)
变量
    declare name1 char(20);
    declare name2,name3 int;
    set name2=10,name3=20;
    set name4=name2+name3;

select into 的使用

    declare name,name1 int;
    select n,a into name name1 from table;

光标的使用(当有大量数据读取时,光标就来了)
    declare 光标名称 cursor for sql语句;
    打开光标
    open 光标名称;
    使用光标
    fetch 光标名称 into name; //name 必须之前定义好
    关闭光标
    close 光标名称;

流程的使用

    if var is null
    then select "no"
    else select "yes"
    end if

case var
   when 1 select "1";
   when 2 select "2";
   else select "no 1 or 2";
end case

循环名:loop
      iterate 循环名 继续循环
      leave 循环名   退出循环
end loop 循环名

repeat 
  set id=id+1;
  until id>=10;
end repeat

while id<10 do
    set i=i+1
end while;

调用存储过程
    call 存储过程名(101,@num);
调用存储函数
    select 存储函数名 (101);

我觉得这个网站写的比较好:

      https://blog.csdn.net/panda_AJ/article/details/70570923


### 回答1: Mysql和Postgresql在使用游标时有一些差异。 Mysql存储过程使用游标时,需要手动打开和关闭游标,并使用FETCH语句来获取游标指向的数据。 而Postgresql在存储过程使用游标时,不需要手动打开和关闭游标,在执行查询语句时会自动生成游标,并使用FETCH语句来获取游标指向的数据。 另外, Postgresql还支持通过FOR语句来遍历游标中的数据,而Mysql则不支持。 ### 回答2: MySQL和PostgreSQL在存储过程游标使用上存在一些差异。 首先,在游标创建使用方面,MySQL和PostgreSQL使用了不同的语法。 - MySQL中,游标创建通常在DECLARE语句中定义游标名和SELECT语句,而使用游标可以在OPEN语句中声明一个游标变量,然后使用FETCH语句获取结果。 - PostgreSQL中,游标创建是通过DECLARE语句定义游标名和SELECT语句,并且可以直接使用游标名获取结果。 其次,在游标的遍历和关闭方面,MySQL和PostgreSQL也有所不同。 - MySQL中,可以使用LOOP语句循环遍历游标结果,通过FETCH INTO语句获取每一行的值,当游标结果为空时可以使用LEAVE语句退出循环。游标遍历结束后需要使用CLOSE语句关闭游标。 - PostgreSQL中,可以使用FOR循环遍历游标结果集,通过FETCH语句获取每一行数据。游标遍历结束后无需显式关闭游标,PostgreSQL会自动关闭游标。 另外,还有一些其他的差异: - MySQL不支持游标参数传递,而PostgreSQL支持将游标作为函数存储过程的参数进行传递。 - MySQL支持使用游标进行数据更新和删除操作,而PostgreSQL只支持游标的读取操作。 总结来说,MySQL和PostgreSQL在存储过程游标使用上存在一些差异,包括创建、遍历和关闭游标的语法不同,以及是否支持游标参数传递和数据更新等操作的差异。因此,在使用存储过程中需要根据具体数据库的特性进行相应的调整和处理。 ### 回答3: MySQL和PostgreSQL是两个常见的关系型数据库管理系统,它们在存储过程游标使用上存在一些差异。 首先,MySQL存储过程游标使用上与PostgreSQL有明显的差异。MySQL游标使用相对简单,使用DECLARE关键字声明一个游标,然后使用OPEN、FETCH和CLOSE语句分别打开、获取和关闭游标。另外,在MySQL中,游标只能在存储过程函数使用,而不能在触发器使用。 相比之下,PostgreSQL在存储过程游标使用更加灵活和强大。首先,PostgreSQL支持两种类型的游标:无名游标和命名游标。无名游标是默认类型,其在声明时不需要指定游标名。而命名游标则需要使用DECLARE语句指定游标名。其次,PostgreSQL支持FOR循环语句来遍历游标结果集,该语句能够自动打开、获取和关闭游标,简化了游标的操作过程。此外,PostgreSQL还支持游标的参数传递、动态游标使用以及游标的返回等高级功能。 总结来说,MySQL和PostgreSQL在存储过程游标使用上存在差异。MySQL游标使用相对简单,只能在存储过程函数使用,并且没有提供FOR循环语句和其他高级功能。而PostgreSQL的游标使用更加灵活和强大,支持无名和命名游标、FOR循环语句以及其他高级功能,使得游标操作更加方便和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值