работа с базой данных postgresql
-
- 1. Основные операции с таблицами
- 2. Операция с атрибутом таблицы
- 3. Работа с табличными данными
-
- 3.1 Запрос данных
- 3.2 Запрос условий данных [где]
- 3.3 Запрос выражения данных
- 3.4 Функциональный запрос
- 3.5 Группировка
- 3.6 Сопоставление [Добавить столбцы в соответствии с условиями, агрегатные операции]
- 3.7 сортировка (упорядочение по)
- 3.8 Левая и правая соединяемая таблица [многотабличный запрос]
- 3.9 Союз [союз]
- 3.10 Добавление, удаление и изменение данных
- 4. Отношения между таблицами
1. Основные операции с таблицами
1.1 Создайте таблицу
create table tb4(
id BIGSERIAL not null primary key,-- 不允许为空,&主键&自增
name varchar(16) not null, --允许为空
email varchar(32) null, -- 可以为空(默认)
age int default 3 -- 插入数据,不给值,默认值为3
);
1.2 Просмотр таблицы
- посмотреть все столы
\d
- просмотреть информацию о таблице
-- \d 表名 \d flow
1.3 Очистить данные таблицы
TRUNCATE TABLE flow;
1.4 Удалить таблицу
DROP TABLE flow;
1.5 Выход из базы данных
\q
2. Операция с атрибутом таблицы
2.1 Добавить столбцы
ALTER TABLE flow ADD age int;
2.2 Удалить столбец
ALTER TABLE flow DROP COLUMN age;
2.3 Изменение свойств столбца
ALTER TABLE flow ALTER COLUMN date TYPE varchar;
Alter TABLE point alter column point TYPE geometry USING point ::geometry;
select st_astext(geo) from test;
2.4 Добавление ненулевых ограничений столбца
alter table flow alter column age set not null;
2.5 Добавить уникальное ограничение столбца
ALTER TABLE flow ADD CONSTRAINT FlowUniqueConstraint UNIQUE(age);
-- 删除约束
ALTER TABLE flow DROP CONSTRAINT FlowUniqueConstraint ;
2.6 Удалить ограничение первичного ключа
\d flow; # 查看主键的名称
ALTER TABLE flow DROP CONSTRAINT flow_pkey;
2.7 Создание ограничения первичного ключа
ALTER TABLE flow ADD CONSTRAINT FlowPrimaryKey PRIMARY KEY (ID);
-- 删除主键约束
ALTER TABLE flow DROP CONSTRAINT FlowPrimaryKey ;
3. Работа с табличными данными
3.1 Запрос данных
- Запросить все данные в таблице
select * from flow;
- Запрос первых 100 записей таблицы
SELECT * FROM flow ORDER BY id ASC LIMIT 100;
- 100 единиц данных после таблицы запроса
SELECT * FROM flow ORDER BY id DESC LIMIT 100;
- Запрос некоторых столбцов данных в таблице
SELECT id,date FROM flow; -- 修改列名称 SELECT id as n1,date as n2 FROM flow;
3.2 Запрос условий данных [где]
-
>
-- 查找年龄大于30 select * from info where age>30; -- 查找id大于1 select * from info where id>1;
-
=
-- 查找id等于1 select * from info where id=1;
-
>=
-- 查找id大于等于1 select * from info where id>=1;
-
!=
-- 查找id不等于1 select * from info where id!=1;
-
between and
-- 查找2<=id<=4 select * from info where id between 2 and 4;
-
and
-- 查找name="wxy" 并且 age=19 select * from info where name="wxy" and age=19;
-
or
-- 查找name="wxy" 或者 age=49 select * from info where name="wxy" or age=49; -- 查找name="wxy" 或者 email="[email protected]" 里面 age=49 select * from info where (name="wxy" or email="[email protected]") and age=49;
-
in
-- 查找id 等于1或4或6 select * from info where id in (1,4,6); -- 查找id 在depart表中存在的id select * from info where id in (select id from depart);
-
not in
-- 查找id不等于1或4或6 select * from info where id not in (1,4,6);
-
exists
-- 查找是否有select * from depart where id=5,如果有,就查询select * from info select * from info where exists(select * from depart where id=5);
-
not exists
-- 查找是否有select * from depart where id=5,如果没有,就查询select * from info select * from info where not exists(select * from depart where id=5);
-
子查询
-- 查找id>2 里面的age>10的信息 select * from (select * from info where id>2) as T where age>10;
-
is
-- 查询非空数据 SELECT * FROM flow WHERE "to" is not null;
-
limit
-- 取前五条 select * from info limit 5;
-
limit offset
-- 从第二个位置开始取,取三个,offset从0开始 select * from info limit 3 offset 2;
3.3 Запрос выражения данных
-
where
SELECT * FROM flow WHERE "from" = 1000;
-
like
для нечеткого запроса-
%
[Соответствие означает от 0 до более]select * from info where name like '%wxy';
-
_
【Подбери один】select * from info where name like "_wxy";
-
3.4 Функциональный запрос
count
-- 查询数据条数 SELECT COUNT(*) AS "flow" FROM flow;
sum
SELECT sum("from") AS "flow" FROM flow;
max
SELECT max("from") FROM flow;
min
SELECT min("from") FROM flow;
DISTINCT
【Фильтровать повторяющиеся значения】SELECT DISTINCT id FROM depart;
3.5 Группировка
-
group by
select age,max(id),min(id),count(id),sum(id),avg(id) from info group by age; select age,count(1) from info group by age; select depart_id,count(id) from info group by depart_id;
-
having
【Сначала выполните группировку, а затем оцените условия】select depart_id,count(id) from info group by depart_id having count(id)>2;
select age,max(id) from info group by age; -- 只获取根据年龄分组的获取最大的id select * from info where id in (select max(id) from info group by age);
-- 根据age分组,再查找count(id)>2 select age,count(id) from info group by age having count(id)>2; -- 聚合条件,having放后面 select age,count(id) from info where id>4 group by age having count(id)>2;
select age, count(id) from info where id>2 group by age having count(id)>1 order by age desc limit 1; - 要查询的表info - 条件 id>2 - 根据age分组 - 对分组后的数据再根据聚合条件过滤 count(id)>1 - 根据age从大到小排序 - 获取第1条
3.6 Сопоставление [Добавить столбцы в соответствии с условиями, агрегатные операции]
-
Получите нужные столбцы
- Получить нужный столбец данных
-- 只获取id,name两列 select id,name from info; -- 将name列起别名为n select id,name as n from info; -- 增加一列123,所有值都为123 select id,name as n,123 from info;
-- 查找id,name,添加num列值为666, -- 添加mid列值为depart表中id的最大值, -- 添加nid列值为depart表中id的最小值 select id, name, 666 as num, (select max(id) from depart) as mid, (select min(id) from depart) as nid, age from info;
-- 查找id,name,添加一列x1,info中的depart_id=depart中的id为条件,找depart表中的title作为x1的值 select id , name, (select title from depart where depart.id=info.depart_id) as x1 from info;
select id , name, (select title from depart where depart.id=info.depart_id) as x1, (select title from depart where depart.id=info.id) as x2 from info;
-
case when then end
-- 添加一列为v1,当depart_id=1时,将v1的值赋值为 "第1部门" select id, name, case depart_id when 1 then '第1部门' end v1 from info;
-
case when then else end
-- 添加一列为v2,当depart_id=1时,将v2的值赋值为 "第1部门" ,否则赋值为 "其他" select id, name, case depart_id when 1 then '第1部门' else '其他' end v2 from info;
-
case when then ... when then ... when then ... else... end
-- case when then ... when then ... when then ... else... end select id, name, case depart_id when 1 then '第一部门' end v1, case depart_id when 2 then '第1部门' else '其他' end v2, case depart_id when 1 then '第一部门' when 2 then '第2部门' else '其他' end v3, case when age<18 then '少年' end v4, case when age<18 then '少年' else '油腻男' end v5, case when age<18 then '少年' when age<30 then '青年' else '油腻男' end v6 from info;
3.7 сортировка (упорядочение по)
desc【降序】
select * from info order by age desc;
asc【升序】
select * from info order by age asc;
3.8 Левая и правая соединяемая таблица [многотабличный запрос]
-
Основная таблица
主表 left outer join 从表 on 主表.x=从表.id
-- 左表连接,左边是主表 -- 右表连接,右边是主表 select * from info left outer join depart on info.depart_id=depart.id; select info.id,info.name,info.email,depart.title from info left outer join depart on info.depart_id=depart.id;
-
Стол
从表 right outer join 主表 on 主表.x = 从表.id select info.id,info.name,info.email,depart.title from info right outer join depart on info.depart_id=depart.id;
3.9 Союз [союз]
-
Количество столбцов должно быть одинаковым [объединение]
select id,title from depart union select id,name from info;
-
【объединение】автоматическая дедупликация
-- 注意:列的数据类型需要一致 select id,title from depart union select id,name from info;
-
Получить все [объединить все без дедупликации]
select id from depart union all select id from info;
3.10 Добавление, удаление и изменение данных
- изменить данные
UPDATE covid19_policy SET id=1 WHERE id=0;
- удалить данные
DELETE FROM covid19_policy WHERE ID = 2;
- добавление данных
INSERT INTO flow (id, date, "from","to",flow_people) VALUES (0, '2020-01-01', 1,2,1); -- 多行添加 INSERT INTO flow (id, date, "from","to",flow_people) VALUES (500000002, '2020-01-01', 1,2,1),(500000001, '2020-01-01', 1,2,1);
4. Отношения между таблицами
4.1 Один ко многим [установить внешний ключ]
- Две таблицы необходимы для хранения информации, и две таблицы существуют
一对多
или多对一
связаны между собой.- ограничение fk_info1_depart1 внешний ключ (depart_id) ссылается наdepart1(id)
create table depart1( id int not null primary key, title varchar(16) not null ); create table info1( id int not null primary key, name varchar(16) not null, email varchar(32) not null, age int, depart_id int not null, constraint fk_info1_depart1 foreign key (depart_id) references depart1(id) ) ; -- 如果表结构创建好了,额外添加外键 alter table info1 add CONSTRAINT fk_info1_depart1 foreign key (depart_id) references depart1(id); -- 删除外键 alter table info1 drop CONSTRAINT fk_info1_depart1;
4.2 Многие ко многим [Установить несколько внешних ключей]
- Для хранения информации необходимы три таблицы, две отдельные таблицы + реляционные таблицы, создающие связь между двумя отдельными таблицами.
多对多关系
create table boy( id int not null primary key, name varchar(16) not null ); create table girl( id int not null primary key, name varchar(16) not null ); create table boy_girl( id int not null primary key, boy_id int not null, girl_id int not null, constraint fk_boy foreign key (boy_id) references boy(id), constraint fk_girl foreign key (girl_id) references girl(id) ); -- 创建表之后添加外键 alter table boy_girl add constraint fk_boy foreign key (boy_id) references boy(id); alter table boy_girl add constraint fk_girl foreign key (girl_id) references girl(id); constraint fk_info1_depart1 foreign key (depart_id) references depart1(id) -- 删除外键 alter table boy_girl drop CONSTRAINT fk_boy; alter table boy_girl drop CONSTRAINT fk_girl;