記事のディレクトリ
1つは、データベース機能です。
- MySQLデータベース関数は、さまざまな関数を実装するためのメソッドを提供するため、レコードを照会するときに、より効率的に出力できます。
- MySQLには多くの組み込み関数があり、一般的に使用される関数には、数学関数、集計関数、文字列関数、日付と時刻の関数が含まれます。
1.1数学関数
データベースに格納されているレコードは、多くの場合、一連の算術演算を必要とするため、MySQLは多くの数学関数をサポートしています。一般的に使用される数学関数を次の表に示します。
数学関数 | 説明 |
---|---|
abs(x) | xの絶対値を返します |
rand() | 0から1までのランダムな浮動小数点数を返します |
mod(x、y) | xの余りをyで割った値を返します |
パワー(x、y) | xをyの累乗に戻します |
round(x) | xに最も近い整数を返します |
round(x、y) | 小数点以下y桁に丸めた後、xの値を保持します |
sqrt(x) | xの平方根を返します |
truncate(x、y) | 小数点以下y桁に切り捨てられた数値xの値を返します |
ceil(x) | x以上の最小の整数を返します |
床(x) | x以下の最大の整数を返します |
最大(x1、x2…) | コレクション内の最大値を返します |
最小(x1、x2…) | セット内の最小値を返します |
1.2集計関数
- MySQLデータベース関数には、ライブラリ内のレコードの合計またはテーブル内のデータの集中要約用に特別に設計された特別な関数セットがあります。これらの関数は、集約関数と呼ばれます。(集計関数)
集計関数 | 説明 |
---|---|
avg() | 指定された列の平均値を返します(平均) |
カウント() | 指定された列のNULL以外の値の数を返します |
分() | 指定された列の最小値を返します |
max() | 指定された列の最大値を返します |
sum(x) | 指定された列のすべての値の合計を返します |
1.3文字列関数
文字列関数 | 説明 |
---|---|
長さ(x) | 文字列xの長さを返します |
トリム() | 指定された形式なしで値を返します |
concat(x、y) | 提供されたパラメーターxおよびyを文字列に連結します |
アッパー(x) | 文字列xのすべての文字を大文字に変更します |
lower(x) | 文字列xのすべての文字を小文字に変更します |
left(x、y) | 文字列xの最初のy文字を返します |
right(x、y) | 文字列xの最後のy文字を返します |
繰り返し(x、y) | 文字列をxy回繰り返します |
スペース(x) | Xスペースが返されます |
replace(x、y、z) | 文字列xの文字列zを文字列yに置き換えます |
strcmp(x、y) | xとyを比較すると、戻り値は-1,0,1になります。 |
substring(x、y、z) | 文字列xのy番目の位置から始まる長さzの文字列を取得します |
reverse(x) | 逆文字列x |
トリム関数は、指定された文字列をフィルタリングできます。
完整格式:TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)
简化格式:TRIM([remstr FROM] str)
すべてのremstrプレフィックスまたはサフィックスが削除された文字列strを返します。BOTH、LEADING、またはTRAILINGのいずれの指定子も指定されていない場合、両方が想定されます。remstrはオプションであり、指定されていない場合、スペースは削除されます。
コードは次のように表示されます。
mysql> SELECT TRIM(' bar '); //默认删除前后空格
-> 'bar'
mysql> SELECT TRIM(LEADING ',' FROM ',,barxxx'); //删除指定首字符 如',‘
-> 'barxxx'
mysql> SELECT TRIM(BOTH ',' FROM ',,bar,,,'); //删除指定首尾字符
-> 'bar'
mysql> SELECT TRIM(TRAILING ',' FROM 'barxxyz,,');
-> 'barxxyz'
1。4日付と時刻の関数
- MySQLは日付と時刻の処理もサポートしており、日付と時刻を処理するための多くの関数を提供します。
文字列関数 | 説明 |
---|---|
curdate() | 現在の時刻の年、月、日を返します |
カータイム() | 現在の時刻の時、分、秒を返します |
now() | 現在の時刻の日付と時刻を返します |
月(x) | 日付xの月の値を返します |
週(x) | 返品日xは、その年の最初の数週間です。 |
時間(x) | 時間の値をxで返します |
分(x) | xの分の値を返します |
second(x) | xの秒値を返します |
曜日(x) | 戻り値xは、曜日、1日曜日、2月曜日です。 |
dayofmonth(x) | 計算日xは月の日です |
dayofyear(x) | 計算日xはその年の日です |
例1:
mysql> select month(curdate());
+------------------+
| month(curdate()) |
+------------------+
| 12 |
+------------------+
1 row in set (0.00 sec)
例2:
mysql> select week(now());
+-------------+
| week(now()) |
+-------------+
| 52 |
+-------------+
1 row in set (0.00 sec)
例3:
mysql> select dayofmonth(now());
+-------------------+
| dayofmonth(now()) |
+-------------------+
| 28 |
+-------------------+
1 row in set (0.01 sec)
1.5ストアドプロシージャ
-
実際のデータベースアプリケーションでは、一部のデータベース操作が非常に複雑で、完了するために複数のSQLステートメントを一緒に処理する必要がある場合があります。現時点では、ストアドプロシージャを使用して、この要件を簡単かつ効率的に完了することができます。
-
MySQL 数据库存储过程是一组为了完成特定功能的 SQL 语句的集合。存储过程这个功能是从 5.0 版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。
-
存储过程在使用过程中是将常用或者复杂的工作预先使用 SQL 语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。
-
当需要使用该存 储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。
-
存储过程在数据库中创建并保存,它不仅仅是 SQL 语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。
-
存储过程的应用范围很广,例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。如果了解一些编程语言,可能会发现存储过程更像是面向对象方法的模拟。
1.5.1 存储过程的优点
- 存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将 直接调用二进制代码,使得存储过程的执行效率和性能得到大幅提升。
- 存储过程是 SQL 语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。
- 存储过程存储在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调 用语句,从而可以降低网络负载。
- 存储过程被创建后,可以多次重复调用,它将多条 SQL 封装到了一起,可随时针对 SQL语句进行修改,不影响调用它的客户端.
- 存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权 限。
1.5.2 创建存储过程
使用 CREATE PROCEDURE 语句创建存储过程,其语法格式如下所示。
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名><类型>
- 存储过程名称
存储过程的名称应该尽量避免选取与 MySQL 内置的函数或者字段相同的名称,否则会发生错误。
存储过程可以添加参数,具有自己的参数列表。参数包括参数名和其对应的类型。 存在多个参数时,参数列表之间用逗号进行分隔。创建存储过程的时候可以不使用参数,但是括号要存在,也可以有一个或多个参数。
- MySQL参数:
MySQL 的参数分为:输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字表示。其中,输入参数可以传递给一个存储过程;输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。
此外,存储过程的主体部分,被称为过程体,包含了在调用时必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。
in、out、inout参数
mysql> use school;
mysql> set @num1=1,@num2=2,@num3=3;
mysql> delimiter $$
mysql> create procedure test(in num1 int,out num2 int,inout num3 int)
-> begin
-> select num1,num2,num3;
-> set num1=10,num2=20,num3=30;
-> select num1,num2,num3;
-> end $$
mysql> delimiter ;
mysql> call test(@num1,@num2,@num3);
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 1 | NULL | 3 |
+------+------+------+
1 row in set (0.00 sec)
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 10 | 20 | 30 |
+------+------+------+
1 row in set (0.00 sec)
总计1: in和inout参数会将全局变量的值传入存储过程中,而out参数不会将全局变量的值传入存储过程中。在存储过程使用过程中,参数值in、out、inout都会发生改变。
mysql> select @num1,@num2,@num3;
+-------+-------+-------+
| @num1 | @num2 | @num3 |
+-------+-------+-------+
| 1 | 20 | 30 |
+-------+-------+-------+
1 row in set (0.00 sec)
总结2: 调用完存储过程后,发现in参数不会使全局变量值发生改变,而out和inout参数调用完存储过程后,会使全局变量的值改变。
- DELIMITER
在存储过程的创建过程中,会用到 DELIMITER 命令。因为在 MySQL 中,服务器处理SQL 语句默认是以分号作为语句结束标志的,过程体中由多条 SQL 语句构成,每条 SQL 后面都是分号结尾,那么 MySQL 服务器在处理时遇到第一条 SQL 语句就会结束整个过程, 不再去处理后面的 SQL 语句。为了解决这个问题,在创建存储过程时,使用 DELIMITER 命令。
- 定义存储过程
delimiter $$
create procedure 存储过程名(in 参数名 参数类型)
begin
#定义变量
declare变量名变量类型
#变量赋值
set 变量名 = 值
sql语句1;
sql语句2;
..
sql语句n;
end $$
delimiter ;
- 调用存储过程
call存储过程名(实际参数);
- 查询存储过程
show procedure status where db='数据库";
mysql> show procedure status where db='school';
+--------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+--------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| school | test | PROCEDURE | root@localhost | 2020-12-28 20:46:41 | 2020-12-28 20:46:41 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+--------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
- 删除存储过程
drop procedure存储过程名;
1.5.3 修改、删除存储过程
修改:
- 存储过程的修改分为特征的修改和业务 内容的修改。特征的修改可以使用 ALTER PROCEDURE 来实现
ALTER PROCEDURE <过程名> [ <特征> … ]
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
删除:
- 使用 DROP PROCEDURE 语句即可删除存储过程
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>
在删除时存储过程的名字是放到最后的,前面可以添加 IF EXISTS 这个关键字,其主要作用是防止因删除不存在的存储过程而引发的错误。删除存储过程的具体操作如下所示。
mysql> drop procedure myupdate;
Query OK, 0 rows affected (0.00 sec)
mysql> call myupdate;
ERROR 1305 (42000): PROCEDURE school.myupdate does not exist
需要注意的是:存储过程名称后面没有参数列表,也没有括号。在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致与之关联的存储过程无法运行。
二、视图
特点
- 安全性高
- 简化sql操作
- 可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)
2.1 概念
- 视图是一张虚拟的表,数据不存在视图中,视图是真实表的映射数据。例如:水中捞月是典型的视图
- 利用条件筛选,分组,排序等产生出一个结果集(结果集保存在内存中),并且做成持久化保存(保存映射)
- 视图占用资源小,真实表中数据产生变化,会影响到视图。
2.2 创建视图
- 创建视图
create view <视图名称>
create view info_view as select id,name,age from info 条件
多表相连的条件是on
单表相连的条件是where
- 创建多表相连查询视图
create view info_hob_view as select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; '//将刚刚的多表相连查询创建名为info_hob_view的视图'
select * from info_hob_view; '//查看视图'
2.3 查询视图
- 查询视图
select * from info_view;
select name,age from info_view;
- 查询多表相连
select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; '//从info表和hob表中选择info.id,info.name,info.age,info,score,info.addr,hob.hobname且info表中的hobby=hob表中的id'
'//inner join:内部相连'