[詳細]セクション
1.ビュー
ビューとは何か、
仮想テーブルは、本質的に、それが表示されているが、実際には存在しません。
なぜ我々は、仮想テーブルが必要なのですか????
利用シナリオ
シナリオ1:
私たちは、あなたがビューを使用することができ、クエリの一部のみがテーブル内のレコードを表示することができますことを願っています
シナリオ2:
記述されたSQL文を簡素化
どのように使用するには:
语法:
create [or replace] view view_name as 查询语句;
or replace 如果视图已经存在了 就替换里面的查询语句;
# 修改视图
alter view view_name as 新的语句;
# 删除视图
drop view view_name;
# 查看
desc view_name;
show create view view_name;
# 限制可以查看的记录
create table salarys(id int,name char(10),money float);
insert into salarys values(1,"张三丰",50000),(2,"张无忌",40000);
# 创建视图 限制只能查看张无忌的工资
create view zwj_view as select *from salarys where name = "张无忌";
# 简化sql编写
create table student(
s_id int(3),
name varchar(20),
math float,
chinese float
);
insert into student values(1,'tom',80,70),(2,'jack',80,80),(3,'rose',60,75);
create table stu_info(
s_id int(3),
class varchar(50),
addr varchar(100)
);
insert into stu_info values(1,'二班','安徽'),(2,'二班','湖南'),(3,'三班','黑龙江');
# 查询班级和学员的对应关系做成一个视图 方便后续的查询
create view class_info as select student.s_id,name,class from student join stu_info on student.s_id = stu_info.s_id;
select *from class_info;
注意:また、元の表の変化を引き起こす可能性がありますビューを変更し、我々はクエリに対してのみ、ビューをこれをしません
2.トリガー
トリガは、SQL文の期間は、テーブルに関連付けられている、それは、ある時点での状態が実行後に自動的にトリガ満たすためになります
二つの重要な要因:
時間
事件後の後|イベントが発生する前の前に
イベント
削除、挿入を更新
その後、自動的にトリガは、2つのオブジェクトを含み、
古い更新、利用可能削除
新しいアップデート、利用可能挿入
実行するために使用します。
使用することができます:データテーブルが変更されたときに、自動的にいくつかのデータを記録し、いくつかのSQL文を実行します
構文:
create trigger t_name t_time t_event on table_name for each row
begin
#sql语句。。。。。:
end
ケース:
#准备数据
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
#错误日志表
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
#需求: 当插入cmd表 的时候 如果执行状态时失败的 那么将信息插入到errlog中
# 将结束符设置为|
delimiter |
create trigger cmd_insert after insert on cmd for each row
begin
if new.success = "no" then
insert into errlog values(null,new.cmd,new.sub_time);
end if;
end|
# 在还原之前的结束符
delimiter ;
# 创建一个触发器 叫cmd_insert
# 触发器会在 插入数据到cmd表后执行
# 当插入的记录的success为no时 自动插入记录到errlog中
# 错误原因 遇到分号自动提交了 , 需要重定义 行结束符
delimiter |
# 删除触发器
drop trigger cmd_insert;
#查看 所有触发器
show triggers;
# 查看某个触发器的语句
show create trigger t_name;
3.トランザクションが非常に重要
トランザクションとは何ですか
トランザクションは、全体として、SQL文のシリーズの組み合わせです
トランザクション機能:
アトミックは、実行するか、すべて失敗のどちらか、それは分割できない全体として、このトランザクションのSQL文を参照します
一貫性は、トランザクションの実行が終了した後に、関連するテーブルは、データの混乱を送信しない、正しくなければなりません
分離、トランザクション間の分離は、データが同じテーブルの動作は、基本的にロック粒度をロックした場合でも、お互いに影響を与えないが、いくつかの異なる分離レベルに分割されています
永続的には、トランザクションデータの成功の実装が永続的に保存されます後、復元することはできません
シナリオ取引:
操作1.口座の残高に転送転送マイナス2の転送アカウントは、オペレーティングを増加させません
お金(名前、お金)
お金設定お金を更新=お金 - 100名=「李寻欢」。
お金設定お金=金+ 100場所名を更新=「步惊云」。
注意:トランザクションは自動的に提出されるよう、取引の終了時に、公式でのMySQLクライアントcmdをされるオープンでのデフォルトは、SQL文になります
構文:
#开启事务
start transaction
#sql 语句......
#sql 语句......
rollback #回滚操作 即撤销没有提交之前的所有操作
#sql 语句......
commit #提交事务 一旦提交就持久化了
CREATE TABLE `account` (
`name` char(10),
`money` float
);
start transaction;
update account set money = money - 100 where name = "一只穿云箭";
update account set money = money + 100 where name = "千军万马";
commit;
# 何时应该回滚 当一个事务执行过程中出现了异常时
# 何时提交 当事务中所有语句都执行成功时
# 保存点 可以在rollback指定回滚到某一个savepoint ,也就是回滚一部分
start transaction;
update account set money = money - 100 where name = "一只穿云箭";
savepoint a;
update account set money = money - 100 where name = "一只穿云箭";
savepoint b;
update account set money = money - 100 where name = "一只穿云箭";
savepoint c;
select * from account;
# 回滚至某个保存点
rollback to 保存点名称
read committed
他の人が中に挿入と削除のためのマジック読書です
人々は、更新よりもやるので、再現性がありません
分離レベルを変更します。
修改全局的
set global transaction isolation level read committed;
或者:
set @@tx_isolation = "asasasasas-read";
修改局部
set session transaction isolation level read committed;
@@系统内置变量
@表示用户自定义的变量
4.ストアドプロシージャ優先制御
ストアドプロシージャとは何ですか、
任意の組合せのSQLステートメント、1つのストアドプロシージャ、関数、同様の機能を配置され、パラメータ、または機能体が存在します
実行するために使用します。
これは、任意のSQL文で、論理処理、トランザクション処理を含むことができ、すべての我々が学んだのSQL文を内部に置くことができます
三つのデータの取り扱い
1.アプリケーションは、唯一のビジネスロジックに関係し、mysqlのにロジックパッケージに関連付けられているすべてのデータ
長所:アプリケーション処理する事が少なくなり、あなたはネットワークトラフィックを削減することができます
短所:増加した人件費、通信費、全体の開発効率を低下させます
2.アプリケーションは、ビジネス・ロジックに対処するために、だけでなく、独自のSQLステートメントを記述する必要があります
利点:、通信コストを削減人件費
短所:、ネットワーク伝送を増加させたSQL文が非常に面倒である書き込み、エラーを起こしやすいです
3. SQL文が自動的に生成され、オブジェクトリレーショナルマッピングORMフレームワークによって実行されます
長所:SQLステートメントは、書面で行う必要があり、大幅に開発のスピードを高めていません
短所:十分に柔軟ではない、完全に分離されたアプリケーション開発者とデータベースは、上層のみの開発に注力につながることができますが、基本的な原則を知りません
ストアドプロシージャを使用して
構文:
create procedure p_name(p_type p_name p_date_type)
begin
sql.......
end
p_type 参数的类型 in输入 out输出 inout即可输出也可输入
p_name 参数的名字
p_data_type 参数的数据类型 如 int float
#注意:out参数必须是一个变量 不能是值
#案例:
delimiter |
create procedure add1(in a float,in b float,out c float)
begin
set c = a + b;
end|
delimiter;
#调用
set @res = 0;
call add1(100,10,@res);
# 删除
drop procedure 名称;
# 查看
show create procedure 名称;
# 查看全部 db02库下的所有过程
select name from mysql.proc where db = 'day41' and type = 'PROCEDURE';
delimiter |
create procedure transfer2(in aid int,in bid int,in m float,out res int)
begin
declare exit handler for sqlexception
begin
# 异常处理代码
set res = 99;
rollback;
end;
start transaction;
update account set money = money - m where id = aid;
update account set money = moneys + m where id = bid;
commit;
set res = 1;
end|
delimiter ;
5.機能
カスタム機能
create function func_name(参数 类型)
函数体
returns 返回值的类
return 返回值
delimiter |
create function add2(a int,b int)
returns int
return a + b|
delimiter ;
#查看创建语句
show create function name;
#查看所有函数的状态
show function status;
#查看某个库下所有函数
select name from mysql.proc where db = "库名称" and type = "FUNCTION";
# 删除
drop function name;
6.バックアップとリカバリ
# 备份
mysqldump.exe
mysqldump -u用户名 -p密码 数据库 表名1 表名2 .... > 文件路径....
# 注意 第一个表示数据库 后面全都是表名
mysqldump -uroot -p day41 student >
#备份多个数据库
mysqldump -uroot -p111 --databases day41 day40 > x3x.sql
#指定 --databases 后导出的文件包含 创建库的语句 而上面的方式不包含
#备份所有数据
mysqldump -uroot -p111 --all-databases > all.sql
#自动备份
linux crontab 指令可以定时执行某一个指令
# 恢复数据:
没有登录mysql
mysql < 文件的路径
已经登录了MySQL
source 文件路径
注意: 如果导出的sql中没有包含选择数据库的语句 需要手动加上
7.プロセス制御
delimiter |
create procedure showjishu()
begin
declare i int default 0;
aloop: loop
set i = i + 1;
if i >= 101 then leave aloop; end if;
if i % 2 = 0 then iterate aloop; end if;
select i;
end loop aloop;
end|
delimiter ;
定期的な試合
语法:
select *from table where 字段名 regexp "表达式!";
create table info(name char(20));
insert into info values("jack sbaro"),("jack rose"),("jerry sbaro"),("sbaro jerry"),("jerry");
# 注意: 不能使用类似 \w 这样的符号 需要找其他符号来代替