数据库的 临时表+左右查询+视图+索引+函数+序列+触发器+事务
这些东西我都是知道的
但事实在,我有些用过,有些没有
现在开始。需要精通一切。
每天进步一点
每天进步一点
临时表
实例如下
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
,total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT NOT NULL DEFAULT 0
);
INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
VALUES
('cucumber', 100.25, 90, 2)
;
SELECT * FROM SalesSummary;
DROP TABLE SalesSummary;
左右查询(连接查询)
使用表
内连接 INNER JOIN
SELECT a.s_role, a.id, a.subject, b.name , b.labels
FROM s_naming.t_core_rel a
**INNER JOIN **
s_naming.t_role b ON a.s_role = b.id
以右表为准 排序
左连接 LEFT JOIN
取左边数据表的全部数据,即便右边表无对应数据。
右链接 同上
视图
第一种方式,MySQL会根据视图定义语句创建一个临时表,并在此临时表上执行传入查询
第二种方式,MySQL将传入查询与查询定义为一个查询并执行组合查询。
限制
1.不能在视图上创建索引
2.MySQL不像:Oracle,PostgreSQL等其他数据库系统那样支持物理视图,MySQL是不支持物理视图的
CREATE VIEW ROLE_COle
AS
SELECT a.s_role, a.id, a.subject, b.name , b.labels
FROM s_naming.t_core_rel a
INNER JOIN
s_naming.t_role b ON a.s_role = b.id ;
select * from ROLE_COle;
视图和中间表的区别就是 是视图不会删除,可是连接断开,中间表就没有了
索引
作用:加速从数据库检索数据的特殊查找表
PostgreSQL中有几种索引类型,
如B-tree,Hash,GiST,SP-GiST和GIN等。 默认情况下,CREATE INDEX命令使用B树索引。
索引 CREATE INDEX index_cole
ON s_naming.t_core_rel (s_role, namespace);
唯一索引 它不允许向表中插入重复的值,或者在原来表中有相同记录的列上也不能创建索引
CREATE UNIQUE INDEX index_name
on table_name (column_name);
DROP INDEX index_name;
函数
一组SQL和过程语句(声明,分配,循环,控制流程等) 可以获取当前时间来入库等,可以使用其他函数。
CREATE OR REPLACE FUNCTION cole ()
创建 可以覆盖以前函数的 叫cole的函数
RETURNS integer AS $total$
返回值(们) 为integer类型的total变量
declare
定义一个变量 叫total
total integer;
BEGIN
SELECT count(*) into total FROM s_naming.t_core_rel;
RETURN total;
END;
最后这句一定有 不然执行失败
$total$ LANGUAGE plpgsql;
select cole();
序列 自动自增
由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现
创建自增序列的索引 重新排列数据库(先删序列在加序列)
创建方式
1、使用 AUTO_INCREMENT 来定义列(plpgsql 没有这个约束)
2、创建序列
CREATE SEQUENCE s_naming.seq_core_rel
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1000
CACHE 1
NO CYCLE;
COMMENT ON SEQUENCE seq_core_rel IS '用以定义核心关系表的序列';
COMMENT ON 创建注释
触发器 (一般和函数一起用)
表上执行指定的数据库事件(即,INSERT,UPDATE,DELETE或TRUNCATE语句)时自动运行。
触发器用于验证输入数据,执行业务规则,保持审计跟踪等
触发的函数 返回值+ TRIGGER
触发器+函数 实现 create记录当前时间 updea更新时间
创建表
CREATE TABLE s_naming.t_standard_department (
id bigserial NOT NULL,
department_code varchar(64) NOT NULL,
"name" varchar(255) NOT NULL,
status int2 NOT NULL DEFAULT 0,
created_at timestamptz NULL,
updated_at timestamptz NULL,
deleted_at timestamptz NULL,
CONSTRAINT t_standard_department_pkey PRIMARY KEY (id)
);
创建(创建+更新)触发器 调用函数
create trigger created_at_t_standard_department before
insert
on
s_naming.t_standard_department for each row execute function s_naming.created_at_function();
-- DROP TRIGGER updated_at_t_standard_department ON s_naming.t_standard_department;
create trigger updated_at_t_standard_department before
update
on
s_naming.t_standard_department for each row execute function s_naming.updated_at_function();
创建函数
CREATE OR REPLACE FUNCTION s_naming.created_at_function()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
t timestamptz;
BEGIN
t := now();
NEW.created_at = t;
NEW.updated_at = t;
RETURN NEW;
END;
$function$
;
更新函数
CREATE OR REPLACE FUNCTION s_naming.updated_at_function()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
transaction.
NEW.updated_at = clock_timestamp();
RETURN NEW;
END;
$function$
;
解析
clock_timestamp()【实时时钟的当前时间戳】和 now()【等同于current_timestamp】 都是系统函数
**clock_timestamp和current_timestamp区别 **
当开启一个事务后,current_timestamp是不变的表示事务的开启时间
而clock_timestamp()表示时钟时间,所以在一个sql语句中的clock时间也有可能是不同的.
实现记录日志
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$function$
;
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
INSERT INTO COMPANY VALUES(2, '京东中科', 6, '广州市天河区', 8999);