这些东西我都是知道的

但事实在,我有些用过,有些没有

现在开始。需要精通一切。

每天进步一点

每天进步一点

临时表

实例如下

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;

019e63a2b427fdc424710c7d0eff114e.png

左右查询(连接查询)

使用表

内连接 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

取左边数据表的全部数据,即便右边表无对应数据。

右链接 同上

09aed7644fd53a43f4bf2308c2c7703b.png

视图

第一种方式,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;

1662d14f17cb61a4c66d66e7fcbd6cb7.png

函数

一组SQL和过程语句(声明,分配,循环,控制流程等) 可以获取当前时间来入库等,可以使用其他函数。

18109f2aaa45d511b26ae36698bdb4b8.png

3f6330c4a3e56c281a7e66f3eb8c143c.png

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();

5d4871825656881ae23c7a059b30d1d8.png

由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用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语句)时自动运行。

触发器用于验证输入数据,执行业务规则,保持审计跟踪等

6c7ef5c0e03a7a3398c8dcde195b4aad.png

触发的函数 返回值+ TRIGGER

2d03305a329479444dc538b5e081ebce.png

触发器+函数 实现 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);

事务

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐