1.0 저장 프로시저 및 함수 생성
저장 프로시저 및 함수를 생성한다는 것은 자주 사용되는 SQL 문 세트를 결합하여 이러한 SQL 문을 전체적으로 MySQL 서버에 저장하는 것입니다
1 저장 프로시저 생성
CREATE PROCEDURE procedure_name ([proc_param[,...]]) [characteristic ...] routine_body
procedure_name은 다음을 나타냅니다. 생성할 저장 프로시저의 이름
proc_param은 저장 프로시저의 매개변수를 나타냅니다.
characteristic은 저장 프로시저의 특성을 나타냅니다.
routine_body는 저장 프로시저의 SQL 문을 나타냅니다.
Procedure_name은 무겁게 나타날 수 없습니다.
proc_param 이름에 포함된 각 매개변수의 구문 형식은 다음과 같습니다. 각 매개변수는 입력/출력 유형, 매개변수 이름, 매개변수 유형의 세 부분으로 구성됩니다. IN, OUT, INOUT의 세 가지 입력 및 출력 유형이 있습니다. param_name은 매개변수 이름을 나타내고, type은 매개변수 유형을 나타냅니다.
[ IN | OUT | INOUT ] param_name type
characteristic은 다음 값을 사용하여 저장 프로시저의 특성을 지정합니다.
LANGUAGE SQL: 저장 프로시저가 SQL 언어로 작성되었음을 나타냅니다.
[ NOT] DETERMINISTIC : 저장 프로시저 실행 결과가 올바른지 여부를 나타냅니다. DETERMINISTIC은 결과가 확실하다는 것을 의미합니다. 즉, 저장 프로시저가 실행될 때마다 동일한 입력이 동일한 출력을 얻는다는 것을 의미합니다. 불확실하며 동일한 입력이 다른 출력을 얻을 수 있습니다. 기본값은 NOT DETERMINISTIC
{CONTAINS SQL | NO SQL READS SQL DATA | . CONTAINS SQL은 서브프로그램에 데이터 읽기 또는 쓰기를 위한 명령문이 없음을 의미하고, NO SQL은 서브루틴에 SQL이 포함되어 있지 않음을 나타내며, READS SQL DATA는 서브루틴에 데이터 읽기를 위한 명령문이 포함되어 있지만 데이터 쓰기를 위한 명령문은 포함되지 않음을 나타냅니다. MODIFIES SQL DATA는 서브루틴에 데이터 쓰기를 위한 명령문이 포함되어 있음을 나타냅니다. SQL SECURITY {DEFINER | INVOKER}: 실행 권한이 있는 사용자를 나타냅니다. DEFINER는 정의자만 실행할 수 있음을 의미합니다. 기본값은 DEFINER
COMMENT 'string': 저장 프로시저 또는 함수를 설명하는 데 사용할 수 있는 주석 정보
-
예: t_employee
DELIMITER $$ CREATE PROCEDURE proc_employee() COMMENT '查询员工薪水' BEGIN SELECT salary FROM t_employee END; $$ DELIMITER ;
테이블에 있는 모든 직원의 급여를 쿼리하는 저장 프로시저를 만듭니다. MySQL은 기본적으로 세미콜론을 명령문 종결자로 사용합니다. 충돌을 방지하려면 먼저 DELIMITER $$를 사용하여 MySQL의 끝 문자를 $$로 설정한 다음 저장 프로시저의 SQL 문을 사용해야 합니다. DELIMITER ;를 사용하여 끝 문자를 세미콜론으로 복원합니다.
2. 저장된 함수를 만듭니다.
CREATE FUNCTION fun_name([func_param,[,...]]) [characteristic ...] routine_body
fun_name은 함수 이름을 나타냅니다.
func_param은 함수 매개변수를 나타냅니다. value는 저장 프로시저의 값과 동일합니다.
routine_body는 함수의 SQL 문을 나타냅니다.
func_param의 각 매개 변수의 구문 형식은 다음과 같으며 각각 매개 변수 이름과 매개 변수 유형입니다
- param_type type 아직 이전 예입니다
DELIMITER $$ CREATE FUNCTION func_employee(id INT(4)) RETURNS INT(6) COMMENT '查询员工薪水' BEGIN SELECT salary FROM t_employee END; $$ DELIMITER ;
2|0변수
MySQL에서는 변수를 정의하고 사용할 수 있으며, 이러한 변수의 범위는 BEGIN...END 프로그램 세그먼트1에 있습니다. 변수
DECLARE var_name[,...] type [DEFAULT value]
키워드 DECLARE는 변수를 선언하는 데 사용됩니다
매개변수 var_name은 변수의 이름이며, 여러 변수를 동시에 정의할 수 있습니다
매개변수 유형은 변수의 유형을 지정하는 데 사용됩니다. 변수
DEFAULT 값 절은 변수를 변경합니다. 기본값은 value로 설정됩니다. DEFAULT 절을 사용하지 않으면 기본값은 NULL입니다.
-
예: sql_test 변수를 정의하고 데이터 유형은 INT입니다. , 기본값은 10
DECLARE test_sql INT DEFAULT 10;
2입니다. 변수 할당 SET var_name=expr[,var_name=expr]...
키 SET이라는 단어는 변수에 값을 할당하는 데 사용됩니다
매개변수 var_name은 변수의 이름입니다
매개변수 expr은 할당 표현식
-
예: sql_test 변수를 30
SET test_sql = 30;
3|0에 할당합니다. 조건 및 핸들러 정의 조건 및 핸들러를 정의한다는 것은 프로그램 실행 중에 발생할 수 있는 문제를 미리 정의하는 것이며, 이러한 문제를 해결하는 기능은 핸들러
1에서 정의할 수 있습니다. 조건 정의
DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE[VALUE] sqlstate_value|mysql_error_code
condition_name 매개변수는 조건 이름을 나타냅니다
condition_value 매개변수는 조건 유형을 나타냅니다
변수 sqlstate_value와 매개변수 mysql_error_code는 MySQL 오류를 나타낼 수 있습니다
-
예: 두 가지 다른 방법으로 정의할 수 있는 can_not_find라는 ERROR 1146(42S02) 오류를 정의합니다.
// 方法一:使用sqlstate_value DECLARE can_not_find CONDITION FOR SQLSTATE '42S02'; // 方法二:使用mysql_error_code DECLARE can_not_find CONDITION FOR 1146;
2 핸들러 정의
DECLARE handler_type HANDLER FOR condition_value[,...] proc_statement handler_type: CONTINUE|EXIT|UNDO condition_value: SQLSTATE[VALUE]sqlstate_value|condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code
CONTINUE: 오류가 처리되지 않고 실행이 계속됨을 나타냅니다.
EXIT: 오류 발생 후 즉시 종료됨을 나타냅니다.
- UNDO: 다음을 나타냅니다. 오류
condition_value는 다음 값을 가질 수 있는 오류 유형을 나타냅니다.
- SQLSTATE[VALUE] sqlstate_value에는 5가 포함됩니다. 문자
-
condition_name의 문자열 오류 값입니다. DECLARE CONDITION
에 정의된 오류 조건 이름을 나타냅니다. SQLWARNING 匹配所有 01 开头的 SQLSTATE 错误代码
NOT FOUND 匹配所有 02 开头的 SQLSTATE 错误代码
SQLEXCEPTION 匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE 错误代码
mysql_error_code 匹配数值类型错误代码
proc_statement 匹配数值类型错误代码
下面是定义处理程序的几种示例方式:
// 方法一:捕获sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NOT FOUND'; // 方法二:使用mysql_error_code DECLARE CONTINUE HANDLER FOR 1146 SET @info='NOT FOUND'; // 方法三:先定义条件,然后调用 ECLARE can_not_find CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR can_not_find SET @info='NOT FOUND'; // 方法四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'; // 方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NOT FOUND'; // 方法六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR 使用SQLEXCEPTION SET @info='ERROR';
4|0光标
在存储过程和函数中,可以使用光标逐条读取查询结果集中可能出现的多条记录。光标必须声明在处理程序之前,声明在变量和条件之后
1. 声明光标
DECLARE cursor_name CURSOR FOR select_statement;
参数 cursor_name 表示光标名称
参数 select_statement 表示 SELECT 语句
下面声明一个名为 cur_employee 的光标
DECLARE cur_employee CURSOR FOR SELECT name,age FROM t_employee;
2. 打开光标
OPEN cursor_name;
参数 cursor_name 表示光标的名称
下面打开一个名为 cur_employee 的光标
OPEN cur_employee;
3. 使用光标
FETCH cursor_name INTO var_name[,var_name...]
cursor_name 表示光标的名称
var_name 表示将光标中的 SELECT 语句查询出来的信息存入该参数,该参数必须在声明光标之前就定义好
下面打开一个名为 cur_employee 的光标,将查询的数据存入 emp_name 和 emp_age 这两个变量中
FETCH cur_employee INTO emp_name,emp_age;
4. 关闭光标
CLOSE cursor_name
cursor_name 表示光标的名称
5|0流程控制
1. IF 语句
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list]... [ELSE statement_list] END IF
参数 search_condition 表示条件判断语句
参数 statement_list 表示不同条件的执行语句
下面是一个 IF 语句的示例
IF age>20 THEN SET @count1=@conut1+1; ELSEIF age=20 THEN @count2=@conut2+1; ELSE @count3=@count3+1; END IF;
2. CASE 语句
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list]... [ELSE statement_list] END CASE
参数 case_value 表示条件判断的变量
参数 when_value 表示变量的取值
参数 statement_list 表示不同 when_value 的执行语句
下面的是一个 CASE 语句的示例
CASE age WHEN 20 THEN SET @count1=@count1+1; ELSE SET @count2=@count2+1; END CASE;
3. LOOP 语句
[begin_label:]LOOP statement_list END LOOP [end_label]
参数 begin_label 和参数 end_label 分别表示循环开始和结束的标志,必须相同,而且都可以省略
参数 statement_list 表示需要循环执行的语句
下面是一个 LOOP 语句的示例
add_num:LOOP SELECT @count1=@count1+1; END LOOP add_num
4. LEAVE 语句
主要用于跳出循环
LEAVE label
参数 label 表示循环的标志
下面是一个 LEAVE 语句的示例
add_num:LOOP SELECT @count1=@count1+1; IF @count1=100 THEN LEAVE add_num; END LOOP add_num
5. ITERATE 语句
也是用于跳出循环,不过是跳出本次循环,直接进入下次循环,类似 Java 的 continue
ITERATE label
ITERATE label
参数 label 表示循环的标志
下面是一个 ITERATE 语句的示例
add_num:LOOP SELECT @count1=@count1+1; IF @count1=100 THEN LEAVE add_num; ELSE IF MOD(@count1,3)=0 THEN ITERATE add_num; SELECT * FROM employee; END LOOP add_num
6. REPEAT 语句
REPEAT 语句是由条件的控制循环语句,当满足特定条件就会退出循环语句
[begin_label:]REPEAT statement_list UNTIL search_condition END REPEAT [end_label]
参数 statement_list 表示需要循环执行的语句
参数 search_condition 表示结束循环的条件,满足该条件即结束循环
下面是一个 REPEAT 语句的示例
add_num:REPEAT SELECT @count1=@count1+1; UNTIL @count1=100 END REPEAT add_num
7. WHILE 语句
WHILE 语句也是有条件控制的循环语句,与 REPEAT 语句不同的是,WHILE 语句是当满足条件时执行循环内的语句
[begin_label:]WHILE search_condition DO statement_list END WHILE [end_label]
参数 statement_list 表示需要循环执行的语句
参数 search_condition 表示结束循环的条件,满足该条件即结束循环
下面是一个 WHILE 语句的示例
WHILE @count<100 DO SET @count=@count+1; END WHILE;
6|0操作存储过程和函数
1. 调用存储过程
在 MySQL 中,使用 CALL 语句来调用存储过程
CALL proc_name([parameter[,...]])
proc_name 是存储过程的名称
paramter 是指存储过程的参数
2. 调用存储函数
在 MySQL 中,存储函数的使用方法和 MySQL 内部函数是一样的
3. 使用 SHOW STATUS 语句查看存储过程和函数的状态
SHOW {PROCEDURE|FUNCTION} STATUS{LIKE 'pattern'}
参数 PROCEDURE 表示查询存储过程,FUNCTION 表示存储函数
参数 LIKE 'pattern' 用来匹配存储过程或函数的名称
4. 使用 SHOW CREATE 语句查看存储过程和函数的定义
SHOW CREATE {PROCEDURE|FUNCTION} proc_name
5. 从 information_schema.Routine 表中查看存储过程和函数的信息
SELECT * FROM information_schema.Routine WHERE ROUTINE_NAME='proc_name'
6. 修改存储过程和函数
ALTER {PROCEDURE|FUNCTION} proc_name[characteristic...]; characteristic: {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} |SQL SECURITY{DEFINER|INVOKER} |COMMENT 'string'
参数 proc_name 表示存储过程或函数的名称
参数 characteristic 指定存储过程的特性:
CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句
NO SQL 表示子程序不包含 SQL 语句
READS SQL DATA 表示子程序中包含读数据的语句
MODIFIES SQL DATA 表示子程序中包含写数据的语句
SQL SECURITY{DEFINER|INVOKER} 指明谁有权限执行:
DEFINER 表示只有定义者才能执行
INVOKER 表示调用者可以执行
COMMENT 'string' 是注释信息
7. 删除存储过程和函数
通过 DROP 语句删除存储过程
DROP PROCEDURE proc_name;
通过 DROP FUNCTION 语句删除存储函数
DROP FUNCTION func_name;
위 내용은 MySQL 저장 프로시저 및 함수를 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

MySQL은 GPL 라이센스를 사용합니다. 1) GPL 라이센스는 MySQL의 무료 사용, 수정 및 분포를 허용하지만 수정 된 분포는 GPL을 준수해야합니다. 2) 상업용 라이센스는 공개 수정을 피할 수 있으며 기밀이 필요한 상업용 응용 프로그램에 적합합니다.

MyISAM 대신 InnoDB를 선택할 때의 상황에는 다음이 포함됩니다. 1) 거래 지원, 2) 높은 동시성 환경, 3) 높은 데이터 일관성; 반대로, MyISAM을 선택할 때의 상황에는 다음이 포함됩니다. 1) 주로 읽기 작업, 2) 거래 지원이 필요하지 않습니다. InnoDB는 전자 상거래 플랫폼과 같은 높은 데이터 일관성 및 트랜잭션 처리가 필요한 응용 프로그램에 적합하지만 MyISAM은 블로그 시스템과 같은 읽기 집약적 및 트랜잭션이없는 애플리케이션에 적합합니다.

MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

MySQL에는 B-Tree Index, Hash Index, Full-Text Index 및 공간 인덱스의 네 가지 주요 인덱스 유형이 있습니다. 1.B- 트리 색인은 범위 쿼리, 정렬 및 그룹화에 적합하며 직원 테이블의 이름 열에서 생성에 적합합니다. 2. HASH 인덱스는 동등한 쿼리에 적합하며 메모리 저장 엔진의 HASH_Table 테이블의 ID 열에서 생성에 적합합니다. 3. 전체 텍스트 색인은 기사 테이블의 내용 열에서 생성에 적합한 텍스트 검색에 사용됩니다. 4. 공간 지수는 지리 공간 쿼리에 사용되며 위치 테이블의 Geom 열에서 생성에 적합합니다.

toreateanindexinmysql, usethecreateindexstatement.1) forasinglecolumn, "createindexidx_lastnameonemployees (lastname);"2) foracompositeIndex를 사용하고 "createDexIdx_nameonemployees (forstName, FirstName);"3)을 사용하십시오

MySQL과 Sqlite의 주요 차이점은 설계 개념 및 사용 시나리오입니다. 1. MySQL은 대규모 응용 프로그램 및 엔터프라이즈 수준의 솔루션에 적합하며 고성능 및 동시성을 지원합니다. 2. SQLITE는 모바일 애플리케이션 및 데스크탑 소프트웨어에 적합하며 가볍고 내부질이 쉽습니다.

MySQL의 인덱스는 데이터 검색 속도를 높이는 데 사용되는 데이터베이스 테이블에서 하나 이상의 열의 주문 구조입니다. 1) 인덱스는 스캔 한 데이터의 양을 줄임으로써 쿼리 속도를 향상시킵니다. 2) B-Tree Index는 균형 잡힌 트리 구조를 사용하여 범위 쿼리 및 정렬에 적합합니다. 3) CreateIndex 문을 사용하여 CreateIndexIdx_customer_idonorders (customer_id)와 같은 인덱스를 작성하십시오. 4) Composite Indexes는 CreateIndexIdx_customer_orderOders (Customer_id, Order_Date)와 같은 다중 열 쿼리를 최적화 할 수 있습니다. 5) 설명을 사용하여 쿼리 계획을 분석하고 피하십시오

MySQL에서 트랜잭션을 사용하면 데이터 일관성이 보장됩니다. 1) STARTTRANSACTION을 통해 트랜잭션을 시작한 다음 SQL 작업을 실행하고 커밋 또는 롤백으로 제출하십시오. 2) SavePoint를 사용하여 부분 롤백을 허용하는 저장 지점을 설정하십시오. 3) 성능 최적화 제안에는 트랜잭션 시간 단축, 대규모 쿼리 방지 및 격리 수준을 합리적으로 사용하는 것이 포함됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

드림위버 CS6
시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
