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

本文详细介绍MySQL的基础使用,包括存储引擎的选择、锁机制的理解、数据类型的使用、基本的SQL语句操作,以及存储过程、触发器等功能的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/panda_AJ/article/details/70570923


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值