资料库介绍(Day10)

在上一篇内容中提到一个服务器需要以怎麽样的规格跟方式来跟用户沟通,来让他们找寻/新增他们需要的服务,但接下来的问题是,那我们该把用户需要的资料放到哪里呢?

这时候资料库就派得上用场了

在现在比较常见的资料库分成sql/nosql/new sql,有兴趣的话可以到网路上找找相关的资源,在这边我会以sql当作这次的主要描述对象

资料库是什麽

资料库就是可以方便让使用者透过规范好的语法,来让你更有效率的读取,写入,更新,删除,计算的系统

而sql最大的特点就在,他可以将资料化成一个表格,每张表格就叫一张table,而这些table会放在一个叫做database里面,而在每个table中会有一个一个的属性和名称(一个属性加名称就是一个栏位),而这些栏位都要预先决定好,可以来分别储存相对应的资料

接下来的内容会有举例,而以下用postgresql作为举例的sql类型

接着如果需要将资料做变更,就会需要下列几种语法

  • 建立table
    CREATE TABLE <table名称> (
    属性名称 属性类别 其他属性
    );

这个属性类别有很多种,在他的文件内都会有说明
而这边举几个比较常见的

  • 文字 => varchar text
  • 整数 => integer
  • 浮点数(有小数点的数字) => float8
  • 布林值(是或否) => boolean

举例

CREATE TABLE public.people (
	id_number varchar NOT NULL,
	"name" varchar NOT NULL,
    age integer NOT NULL,
	gender varchar NOT NULL,
	CONSTRAINT people_pk PRIMARY KEY (id_number)
);

至於最後的
CONSTRAINT people_pk PRIMARY KEY (id_number)
是在帮这张表建立主键,就是这张表的这个栏位他是一个唯一的识别码,这样可以在未来在找相对应的纪录时,可以找的比较快(可以想成有写邮递区号的信件就可以比较容易知道要寄到哪里)

  • 读取

select <需要哪些栏位> from <某张table> (where <需要的条件>) (order by <需要的栏位> desc/asc) (limit <需要输出的数量>) (offset <跳过的数量>);

举例

SELECT name, gender FROM people;

将people这张table中的name跟gender印出来

SELECT * FROM eople;

*代表全部的意思,就会是将people中的所有栏位都印出来

将people取出叫John的人

SELECT * FROM people WHERE "name" = 'John';

将people取出来的资料由小到大排序

SELECT * FROM people ORDER BY age ASC;

将people取出来的资料由大到小排序

SELECT * FROM people ORDER BY age DESC;

将people中年纪前10小的人找出来

SELECT * FROM people ORDER BY age ASC LIMIT 10;

将people中年纪11~20小的人找出来

SELECT * FROM people ORDER BY age ASC offset 10 LIMIT 10;
  • 更新
    UPDATE <某张table> SET <目标栏位>=<目标值> WHERE <需要的条件>

举例

UPDATE public.people
	SET "name"='Judy'
	WHERE id_number='K213654789';
  • 删除
    DELETE FROM <某张table> (where <需要的条件>)
DELETE FROM public.people
	WHERE id_number='113b4445-c763-4bd3-b42a-f3accf32b089';

补充说明
在postgresql中,""代表的是栏位名称,''代表的是字串内容,不要搞混喽
在sql语法中,大小写其实没有关系,但在呈现上,如果sql相关的指令用大写写下来会比较好阅读的

范例说明

假如我们现在要做一个纪录家人体温的服务

那我们会需要开一张表来存这些纪录
先暂时取名叫做record

那他会需要以下栏位

  • 流水号(id) => string
  • 姓名(name) => string
  • 日期(date) => time
  • 温度(temperature) => double(因为会有小数点)

另外,我们在里面新增两笔纪录
https://extendsclass.com/postgresql/0f8a348

CREATE TABLE public.records (
	id uuid NOT NULL,
	"name" varchar NULL,
	"date" timestamptz NULL,
	temperature float8 NULL,
	CONSTRAINT record_pk PRIMARY KEY (id)
);
INSERT INTO public.records (id,"name","date",temperature) VALUES
	 ('66a9c0e2-96ce-4622-8da4-e9b1987ba2ac'::uuid,'Peter','2021-08-31 20:05:53.539295+08',"36.3,36.3"),
	 ('2507a051-155d-432b-a92e-bb5bee2bb41b'::uuid,'Kevin','2021-08-31 20:05:18.171572+08',36.1);
     
select * from records;

这时,有个需求,需要纪录家人的身分证字号,也要纪录家人的性别,因此需要再开两个栏位

  • 身分证字号(id_number)
  • 性别(gender)

https://extendsclass.com/postgresql/418ae69

但日後如果纪录几天的内容,让资料如下
https://extendsclass.com/postgresql/b021a87

那这样如果有一天,Peter想要改名成John
那就会需要将所有id_number为A123456789的资料改成John,这样会一次异动到50%的资料,会对资料库造成相对大的负担,因此在这个时候就会透过一个小技巧来让资料储存的更有效率


<<:  介绍RESTful api(Day9)

>>:  资料库正规化说明(Day11)

Chapter4 - Canvas背景动画(II)就如那轻薄的鸿毛,我心上小船载浮载沉

今天西子湾被断网了,所以没时间打太多字,请见谅,有看不懂的留言询问哦! https://jerry-...

Day#11 测试画面

前言 承接昨天的内容,今天来开工啦 学习资源 这篇的资源参考与上一周同样教学团队的real-time...

【Day27】线性收敛除法器实作

在加减乘除四个基本运算中,其中除法最为困难及复杂,因此除法也是最耗时的运算。 对於一个被除数为 N...

day30_arm 还是 x86? 我知道该怎麽选了

ARM 与 x86 谁更对你胃口呢? 我们在之前的文章内讨论了很多 ARM 与 x86 的差异,互相...

【Day6】Opcua的介绍与连线

这段时间由於公司稍微忙一点,所以我就先把脑内的存稿一一先放出来, 软件的实作过程等有空档我再慢慢边重...