菜鸟的MySQL学习笔记(五)

7、自定义函数

用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。包含了两个必要条件,参数与返回值。没有必然内在联系。

函数可以返回任意类型的值,同样可以接收这些类型的参数;

创建自定义函数:

CREATE FUNCTION function_name             #函数名

RETURNS

{STRING | INTEGER | REAL | DECIMAL}        #返回值类型

routine_body                                                 #函数体

函数体可以包含合法的SQL语句;也可以是简单的SELECT或INSERT语句;

函数体如果是复合结构则可以使用BEGIN  ... END 语句;

复合结构可以包含声明,循环,控制结构。

创建不带参数的函数

#SELECT DATE_FORMAT(NOW(),‘%Y年%m月%d日   %H点:%i分:%s秒‘);  #将时间显示为年月日,时分秒, 函数要实现的功能

#CREATE  FUNCTION  f1()  RETURNS  VARCHAR(30)

RETURN DATE_FORMAT(NOW(),‘%Y年%m月%d日   %H点:%i分:%s秒‘); #此时使用select f1() 即可获得上面的结果

创建带参数的函数

#CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)

RETURNS FLOAT(10,2) UNSIGED

RETURN (num1 + num2)/2;     #计算两个值的平均值

创建带多个参数的函数

CREATE FUNCTION adduser(username VARCHAR(20))

RETURNS INT UNSIGNED

BEGIN                                                        #由于使用了两个语句所以需要使用BEGIN 。。END语句

INSERT test(username) VALUES(username);   #将username值插入

RETURN  LAST_INSERT_ID();                         #返回插入的ID

END

//     #修改后的分隔符 如果不修改会报错,需要将默认分隔符分号修改为//或其他的符号,命令为DELIMITER //

删除函数

DROP FUNCTION [IF EXISTS] function_name;

#DROP FUNCTION f2;

8、存储过程

MySQL的执行过程:

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。

优点:

增强SQL语句的功能和灵活性

实现了较快的执行速度

减少了网络流量

创建存储过程:

CREATE

[DEFINER = { user | CURRENT_USER } ]                 #指向创建者

PROCEDURE sp_name ([proc_parameter [,...] ])    #带0个或多个参数

[characteristic ...] routine_body                              #特性

proc_parameter:     #参数的写法

[IN | OUT | INOUT ] param_name type   #IN,表示该参数的值必须在调用存储过程时指定;OUT,表示该参数的值可以被存储过程改变,并且可以返回 ; INOUT,表示该参数的调用时指定,并且可以被改变和返回。

特性:

characteristic ‘string‘

| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

#COMMENT:               注释

CONTAINS SQL :            包含SQL语句,但不包含读或写数据的语句

NO SQL:                      不包含SQL语句

READS SQL DATA :        包含读数据的语句

MODIFIES SQL DATA :     包含写数据的语句

SQL SECURITY { DEFINER | INVOKER }     指明谁有权限来执行

过程体

过程体由合法的SQL语句构成,可以是任意(对记录的增删改查,多表的链接操作)SQL语句;

过程体如果为复合结构则使用BEGIN ... END语句;复合结构可包含声明,循环,控制结构;

创建没有参数的过程:

CREATE PROCEDURE sp1()  SELECT VERSION();

调用存储过程

CALL sp_name ([parameter [, ... ] ])

CALL sp_name [ ( ) ]   #带参数 小括号不可以省略

创建一个带有IN类型参数的过程:

CREATE PROCEDURE removeUserById (IN p_id INT UNSIGNED )  #创建过程,为删除userID

BEGIN

DELETE FROM users WHERE id = p_id;  #第一个ID是数据表的字段,第二个为过程传递的参数

END

//      #需要将该过程分隔符修改为//

创建过程需要将字段和参数的名称分别开来,不然会认为两个均为字段,将过程传参修改为p_id

创建一个带有OUT类型的过程

CREATE PROCEDURE removeUserAndRetrunUserNums (IN p_id INT UNSIGNED , OUT userNums INT UNSIGNED)  #创建过程,删除user 返回userID

BEGIN

DELETE FROM users WHERE id = p_id;

SELECT count(id) FROM users INTO userNums;

END

//

调用该过程

CALL removeUserAndRetrunUserNums (24,@Nums); # @Nums 为局部变量,只在BEGIN。。END之间声明

SELECT @Nums ;

创建一个带有INOUT类型的过程

CREATE PROCEDURE removeUserByAgeAndRrturnInfos( IN p_age SMALLINT UNSIGNED ,OUT deleteUsers SMALLINT UNSIGNEND, OUT userCounts SMALLINT UNSIGNED)

BEGIN

DELETE FROM users WHERE age = p_age;

SELECT ROW_COUNT( ) INTO deleteUsers; # ROW_COUNT( )用来统计最近受影响的行数,结果为数值 几行

SELECT COUNT( id ) FROM users  INTO userCounts;

END

//  #此处需要修改分隔符

CALL  removeUserByAgeAndRrturnInfos(23,@a,@b); #此处@a,@b为局部变量

存储过程与自定义函数的区别

1、存储过程实现的功能要复杂一些;而函数的针对性更强

2、存储过程可以返回多个值,函数只有一个返回值;

3、存储过程一般独立的来执行,而函数可以作为其他SQL语句的组成部分来实现。

9、存储引擎

MyISAM

InnoDB

Memory

CSV

Archive

并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性。

共享锁(读锁):同一时间段内,多个用户可以读取同一个资源,读取过程中任何数据不会发生变化。

排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或写锁操作。

锁策略

表锁,是一种开销最小的锁策略。锁表

行锁,是一种开销最大的锁策略。锁行

事物:用于保证数据库的完整性。

外键:是保证数据一致性的策略。

索引:是对数据表中的一列或者多列的值进行排序的一种结构。

修改存储引擎的方法:

1、通过修改MySQL的配置文件实现

- default-storage-engine = engine

2、通过创建数据表的命令实现

-CREATE TABLE tbl_name( ...) ENGINE = engine

10、MySQL的管理工具

PHPMyAdmin

Navicat

MySQL Workbench

时间: 2024-10-27 13:39:44

菜鸟的MySQL学习笔记(五)的相关文章

MySQL学习笔记(五):MySQL表级锁和行级锁

一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL主要的两种锁的特性可大致归纳如下:? 表级锁: 开销小,加锁快:不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁):锁定粒度大,发生锁冲突的概率最高,并发度最

菜鸟的MySQL学习笔记(三)

4-1插入记录INSERT INSERT [INTO] tbl_name [(col_name)] {VALUES|VALUE} ({expr|DEFAULT},...), (...), ...   #可以一次性插入多条记录 INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...  #可以使用子查询 INSERT [INTO] tbl_name [(col_name,...)] SELECT ... #可以将查询的结果插入到指定的表

菜鸟的MySQL学习笔记(二)

3-1约束: 1.约束保证数据的完整性和一致性: 2.约束分表级约束(两个或两个个以上字段的约束)和列级约束(一个字段约束): 3.NOT NULL       非空: PRIMARY KEY       主键约束: UNIQUE KEY         唯一约束: DEFAULT               默认约束: FOREIGN KEY        外键约束. 空值与非空值: NULL 与 NOT NULL 自动编号: AUTO_INCREMENT 自动编号,必须与主键组合使用,默认情

菜鸟的MySQL学习笔记(四)

MySQL中的运算符和函数: 1.字符函数: 2.数值运算符与函数: 3.比较运算符与函数: 4.日期时间函数: 5.信息函数: 6.聚合函数: 7.加密函数等: 6-1.字符函数: CONCAT()                     字符连接 #SELECT  CONCAT(first_name,last_name) AS fullname FROM name_test;   从name表中 连接显示 first last CONCAT_WS()              使用指定的分隔

MySQL学习笔记五:数据类型

MySQL支持多种数据类型,大致可以分为数值,日期/时间和字符类型. 数值类型 MySQL支持所有标准SQL数值数据类型,包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOUBLE PRECISION),除了这些还支持TINYINT.MEDIUMINT和BIGINT.这些类型的占用字节和范围如下所示. 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,25

mysql学习笔记 第五天

使用分区数据表: 分区数据表和merge数据表具有相似的作用,但是分区数据表确确实实是一个数据表 ,不像merge是列出数据表的逻辑关系,并且分区数据表可以包括像myisam以外的 的数据表.创建分区数据表: create table 里给出数据列和索引,然后用partition by 定义一个用来把数据行分配 到各个分区的分区函数:[将数据表分成四个区] create table log_partition( dt datetime not null, info varchar(100) no

Mysql学习笔记(五)数学与日期时间函数

原文:Mysql学习笔记(五)数学与日期时间函数 学习内容: 1.数学函数 2.日期时间函数 这些函数都是很常用的函数...在这里进行简单的介绍... 数学函数: mysql> SELECT ABS(-32); //取绝对值函数 -> 32 这个函数可安全地使用于 BIGINT 值. mysql> SELECT SIGN(-32);//判断一个数是正数,负数,还是0..根据实际情况返回指定的数值.. -> -1 mysql> SELECT MOD(234, 10);//取模函

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

MySQL学习笔记之五 有关数据表操作

MySQL在创建表的时候,创建一个.frm文件保存表和列定义.索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中.   一.用SHOW/ DESCRIBE语句显示数据表的信息 语法: SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM