MySQLAdvanced第3章-ビューと関数

学習目標:

  1. ビューの役割を理解する
  2. ビューの作成、更新、および削除操作に精通している
  3. カスタム関数の作成と呼び出しに精通している
  4. 機能と手順の違いを理解する

学習内容:

1.表示
2.機能


勉強の時間:

2021/2/12


見る

ビューの概要:
1)ビューを使用する理由
a)3つのパラダイムから、テーブルには1つのタイプのエンティティのデータしか格納されないことがわかりますが、実際には、通常、複数のテーブルのデータは関連付けられて表示され、特定の固定列に頻繁にアクセスされます。表示回避できますこれらの関連するクエリステートメントを頻繁に記述します
。b)一部のユーザーは、テーブル内の一部の列のみを許可し、テーブル全体の列またはデータ行を公開できません。これらの特定のユーザーのビューを作成し、これらのユーザーに権限を付与できます。ベーステーブル内の他の列とデータ行のセキュリティ保護における役割。ビューには、結果セットを返すことができるsqlクエリステートメントが格納されます。from句で使用すると、内部sqlクエリステートメントが実行されます。


2)ビューとは何ですか?

MySQLビューは、コンテンツがクエリによって定義される仮想テーブルです。実際のテーブルと同様に、ビューには一連の名前付きの列と行のデータが含まれています。
ただし、ビューは、格納されたデータ値のセットとしてデータベースに存在しません。行と列のデータは、ビューを定義するクエリによって参照されるテーブルから取得
され、ビューが参照されるときに動的に生成されます。
ビューの利点:

  1. 簡単に言えば、あなたが見るものはあなたが得るものです。
  2. セキュリティ、ユーザーは自分が見ることができるデータのみを照会または変更できます。
  3. ロジックの独立性により、実際のテーブル構造の変更による影響を防ぐことができます。ビューのデメリット:
  4. パフォーマンスは比較的低く、ビューからのデータのクエリは、特にビューが他のビューに基づいて作成されている場合、非常に遅くなる可能性があります。
  5. 変更するのは不便です。特に複雑な集計ビューは変更できません。

MySQLでのビューの使用

1.単一のテーブルに基づいてビューを作成します

学生テーブル作成ステートメント:

DROP TABLE IF EXISTS `studentinfo`;
CREATE TABLE `studentinfo`  (
  `StudentID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学号',
  `StudentName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '姓名',
  `Gender` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '性别 默认值为男',
  `Age` int(11) NULL DEFAULT 0 COMMENT '年龄',
  `Birthday` datetime(0) NOT NULL COMMENT '出生日期',
  `StudentNO` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学员身份证号码唯一约束',
  `ClassID` int(11) NOT NULL DEFAULT 0 COMMENT '班级编号',
  `BeginTime` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '入学时间非空',
  `Phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '电话非空',
  `Province` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '河南' COMMENT '户籍所在省默认值河南',
  `City` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '郑州' COMMENT '户籍所在市',
  `Email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '电子邮件非空',
  `DormitoryNo` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '宿舍号',
  PRIMARY KEY (`StudentID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of studentinfo
-- ----------------------------
INSERT INTO `studentinfo` VALUES ('2011001002', '亡灵战神', '男', 22, '1991-02-21 00:00:00', '410702199102210213', 1, '2011-5-6', '15125741526', '河南', '周口', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001003', '战争女神', '女', 23, '1990-06-21 00:00:00', '410303199006210215', 1, '2011-5-6', '15890172541', '河南', '洛阳', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001004', '黑暗之女', '女', 23, '1990-02-11 00:00:00', '412701199002110618', 1, '2011-5-6', '18637165241', '河南', '周口', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001006', '狂战士', '男', 20, '1990-10-14 00:00:00', '410102199010140317', 1, '2011-5-6', '15569852141', '河南', '郑州', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001008', '正义巨像', '男', 22, '1991-06-21 00:00:00', '410103199106210613', 1, '2011-5-6', '15142153256', '河南', '郑州', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001009', '卡牌大师', '男', 22, '1991-11-15 00:00:00', '410702199111150517', 1, '2011-5-6', '15125741529', '河南', '洛阳', '王[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001010', '德邦总管', '男', 21, '1992-05-06 00:00:00', '410306199205060719', 1, '2011-5-6', '15125471535', '河南', '洛阳', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011001011', '无畏站车', '男', 22, '1991-08-19 00:00:00', '412702199108090103', 1, '2011-5-6', '15125471539', '河南', '周口', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011003001', '诡术妖姬', '女', 22, '1991-11-07 00:00:00', '410106199111070412', 3, '2011-5-6', '18854215874', '河南', '郑州', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011003002', '猩红收割者 ', '女', 18, '1989-06-04 00:00:00', '411303198906040102', 3, '2011-5-6', '17878452365', '河南', '南阳', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011003003', '末日使者', '男', 23, '1990-05-29 00:00:00', '410522199005290213', 3, '2011-5-6', '18878452361', '河南', '安阳', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011003004', '正义天使', '女', 23, '1990-09-16 00:00:00', '410104199009160416', 3, '2011-5-6', '16878452397', '河南', '郑州', '[email protected]', '4102');
INSERT INTO `studentinfo` VALUES ('2011003007', '无极剑圣', '女', 21, '1992-01-07 00:00:00', '410102199201070317', 3, '2011-5-6', '13852417412', '河南', '郑州', '[email protected]', '4102');

  1. 生徒の名前、性別、年齢、クラス番号を表示するビューを作成します
create view v_v1 -- view视图的关键词
as -- as后面跟上sql
select 
studentName,Gender,Age,ClassID 
from studentinfo;-- 视图就是有查询组成的
-- 查询视图
select * from v_v1;

演算結果:
ここに画像の説明を挿入します

  1. エイリアスビューを使用して、生徒の名前、性別、年齢、クラス番号を表示するビューを作成し、中国語で表示します
create view v_v2(姓名,性别,年龄,班级) -- view视图的关键词
as -- as后面跟上sql
select 
studentName,Gender,Age,ClassID 
from studentinfo;
-- 查询视图
select * from v_v2;

ここに画像の説明を挿入します


複数のテーブルに基づいてビューを作成する

クラステーブル(classinfo):

DROP TABLE IF EXISTS `classinfo`;
CREATE TABLE `classinfo`  (
  `cid` int(11) NOT NULL,
  `canme` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of classinfo
-- ----------------------------
INSERT INTO `classinfo` VALUES (1, '网开一班');
INSERT INTO `classinfo` VALUES (2, '网开二班');
INSERT INTO `classinfo` VALUES (3, '网开三班');



生徒の名前、性別、年齢、クラス名を表示するビューを作成します


create view v_v3
as
SELECT
	studentinfo.StudentName,
	studentinfo.Gender,
	studentinfo.Age,
	classinfo.canme
FROM
	classinfo
INNER JOIN studentinfo ON classinfo.cid = studentinfo.ClassID
;

select * from v_v3;-- 视图的数据来源于(基表)

演算結果:
ここに画像の説明を挿入します


ビューを使用してデータを更新します

select * from v_v1;
-- 把v_v1所有的年龄字段都加一
update v_v1 set age=age+1;-- 修改视图、改的是(基表)

変更前:変更後
ここに画像の説明を挿入します

ここに画像の説明を挿入します
注:
MySQLでは、ビューはクエリ可能であるだけでなく、更新可能でもあります。これは、INSERTまたはUPDATEステートメントを使用して、更新可能なビューを介してベーステーブルの行を挿入または更新できることを意味します。さらに、DELETEステートメントを使用して、ビューを介して基になるテーブルから行を削除できます。ただし、更新可能なビューを作成するために、ビューを定義するSELECTステートメントに次の要素を含めることはできません。

  1. 集計関数
  2. 明確な条項;
  3. groupby句;
  4. 条項を持っている;
  5. unionおよびunionall節;
  6. 更新操作に複数のテーブルに基づいて作成されたビューを使用するために、外部結合は
    推奨されません。

#### WITH CHECK OPTION句テーブルデータの一部を表示するために、ビューが作成される場合があります。ただし、単純なビューは更新可能であるため、ビューからは見えないデータを更新できます。この更新により、ビューの一貫性が失われます。ビューの一貫性を確保するために、ビューを作成または変更するときにWITH CHECKOPTION句を使用してください。
create view v_4
as
select * from subject where CreditHour>24;
-- 通过视图查询
select * from v_4;
-- 通过视图添加新课程
insert into v_4 values(null,'java基础 wk22',20,1,1);
-- 查询课程表
select * from v_4;

select * from subject;

実行結果の表示:
ここに画像の説明を挿入します
クエリテーブル構造:
ここに画像の説明を挿入します
ここでは、ビューと制限は成功し、データを追加しませんでしたが、テーブルはデータを追加しました。これは、データが同期されていないことを示しています。ここで、WITH CHECKOPTION句が必要です。

-- 修改视图
alter view v_v4
as
select * from subject where CreditHour>24 with check option;
-- 通过视图添加新课程
insert into v_v4 values(null,'layui',20,1,1);

ここに画像の説明を挿入します
ここでは、実行が失敗したことがわかります。これは、制限が成功したことを示しています。


関数

関数の紹介:
MySQLの関数は、特定のタスクを実行するコードブロックであるJavaScriptの関数に似ています。実際、MySQLで関数を使用した経験はすでにあります。たとえば、now()関数を使用してシステム時刻を取得し、avg()関数を使用して平均値を取得できます。これらのシステム定義関数はシステム関数と呼ばれ、直接使用できますが、特定の関数を完了する必要がある場合は、自分で関数を定義する必要がある場合があります。ユーザー定義関数はカスタム関数と呼ばれます。

MySQLでの関数の使用

関数を作成するための構文

create function 函数名([参数列表]) returns 数据类型
begin
sql 语句;
return;
end;

運動:

1.学生IDが「2011001002」の学生の名前を返す関数を作成します

reate function ff1() returns varchar(20)-- returns 返回值类型
begin-- 相当于花括号{}
	declare n varchar(20);-- 定义一个变量
	select 
	studentName into n-- into 赋值 (n)
	from studentinfo 
	where studentID='2011001002';
	return n;-- 返回值
end;
-- 调用函数
select ff1();

実行結果:
ここに画像の説明を挿入します
2。パラメーターを使用して関数を作成し、学生番号を入力して、学生の名前を返します。

create function ff2(sid varchar(20)) returns varchar(20)
begin
	declare n varchar(20);-- 定义一个变量
	select 
	studentName into n-- into 赋值 (n)
	from studentinfo 
	where studentID=sid;
	return n;-- 返回值
end;
-- 调用函数
select ff2('2011001002');

演算結果:
ここに画像の説明を挿入します


####注:1。関数名の後に括弧のペアがあります。パラメーターは括弧内に入力することも入力しないこともできますが、括弧を省略することはできません。2。括弧の後にreturnsを続ける必要があり、returnsはタイプはMySQLである必要があります関数のタイプ; 3。関数の本体はbegin..endに配置され、endの前に、戻り値はの値と同じです。前の戻り値とそれに続く戻り値;4。selectクエリ結果を使用して変数に値を割り当てることもできますが、intoキーワードが必要です。
## 総括する:

機能と手順の違い:

  1. 戻り値は異なります。関数には戻り値が必要であり、1つの結果値のみを返す必要があります。プロセスには戻り値を含めることはできませんが、結果セットを返すことはできます。
  2. 呼び出しの違い:関数はselectを使用して呼び出され、プロシージャはcallを使用して呼び出されます。
  3. パラメーターの違い:関数のパラメーターはすべてパラメーター内にあり、プロセスはin \ out \ inoutパラメーターを渡すことができます。

ビューの役割:

結果セットを返すことができるSQLクエリステートメントはビューに格納されます。from句で使用すると、内部SQLクエリステートメントが実行されます。

ビューの更新の制限

**ビューを定義するSELECTステートメントには、次の要素を含めることはできません。**

1.集計関数;
2。個別の句;
3。groupby句;
4。持つ句;
5。すべての句の和集合と和集合;
6。外部結合

注:更新操作に複数のテーブルに基づいて作成されたビューを使用することはお勧めしません。

関数に関する注意:

  1. 関数名の後に括弧のペアがあります。括弧内にパラメーターを入力することも、入力しないこともできますが、括弧を省略することはできません。

  2. 括弧の後にはreturnsが続き、returnsの後には戻り値の型が続く必要があります。これはMySQLの型である必要があります。

  3. 関数の本体はbegin ... endに配置され、終了前の戻り値は、前の戻り値の後に戻り値の型が続く値と同じです。

  4. クエリ結果の選択を使用して変数に値を割り当てることもできますが、intoキーワードは必須です。

関数とストアドプロシージャの違い

  1. 戻り値は異なります。関数には戻り値が必要であり、1つの結果値のみを返す必要があります。プロセスには戻り値を含めることはできませんが、結果セットを返すことはできます。

  2. 呼び出しの違い:関数はselectを使用して呼び出され、プロシージャはcallを使用して呼び出されます。

  3. パラメータの違い:関数のパラメータはすべてパラメータ内にあり、プロセスはin \ out \ inoutパラメータを渡すことができます

おすすめ

転載: blog.csdn.net/zhou_yuandong/article/details/114699986