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