1.数据类型
1.数字类型
类型 长度 说明 范围 与其他db比较
Smallint 2字节 小范围整数类型 32768到+32767
integer 4字节 整数类型 2147483648到+2147483647
bigint 8字节 大范围整数类型 -9233203685477808到+9223203685477807
decimal 可变 用户指定 精度小数点前131072位;小数点后16383位
numeric 可变 用户指定 精度小数点前131072位;小数点后16383位
real 4字节 变长,不精确 6位十进制精度
double precision 8字节 变长,不精确 15位十进制精度
smallserial 2字节 smallint I自增序列 1到32767
serial 4字节 Integer自增序列 1到2147483647
bigserial 8字节 bigint自增序列 1到922372036854775807
money 8字节 金钱类型
- 字符类型
|---------------------------------|--------|-------------------------|
| 类型 | 长度 | 说明 |
| varchar(n),character varying(n) | 变长 | 字符最大数有限制 |
| char(n),character(n) | 定长 | 固定长度字符串字符数没达到最大值则使用空白填充 |
| text | 变长 | 无长度限制 |
- 日期时间
类型 长度 说明 范围 与其他db比较
- 基本操作
2.1数据库操作
//创建数据库
CREATE DATABASE 库名
//在创建数据库时指定参数信息 WITH OWNER:所有者 ENCODING:编码格式
CREATE DATABASE 库名 WITH OWNER = postgres ENCODING = 'utf-8'
//修改数据库名称
ALTER DATABASE 旧库名 RENAME TO 新库名
//修改连接限制数
ALTER DATABASE 库名 CONNECTION LIMIT 20
//删除数据库
DROP DATABASE 库名
2.2表操作
//创建表
CREATE TABLE 表名(
字段1 类型1,
字段2 类型2
);
例:
一,class_info表
create table class_info
(
id serial not null
constraint class_info_pk
primary key,
name varchar,
write_date timestamp
);
serial not null constraint student_pk primary key,
"serial" 列被设置为 "not null",并且有一个名为 "student_pk" 的主键约束。
主键的作用是确保表中的每个数据行都可以被唯一地标识,并且主键值不能重复或为空。在创建主键约束后,系统会自动检查插入的数据是否违反了主键的唯一性要求,如果有重复的主键值或缺少主键值,就会抛出错误,阻止插入操作。
comment on table student is '学生表'; comment on column student.name is '名称';
给名为 student 的表添加注释,注释内容为 '学生表' ,用于描述表的作用或用途。
-- id serial not null 表示id自增 -- id integer not null 表示id不自增
二,studen 表
create table student
(
id serial not null
constraint student_pk
primary key,
name varchar,
class_id integer references "class_info"("id"), //references 外键
height numeric,
weight numeric,
write_date timestamp
);
//外键
外来键是一个(或数个)指向另外一个表格主键的栏位。
假设我们有两个表格:一个 CUSTOMER 表格,里面记录了所有顾客的资料;另一个 ORDERS 表格,里面记录了所有顾客订购的资料。在这里的一个限制,就是所有的订购资料中的顾客,都一定是要跟在 CUSTOMER 表格中存在。在这里,我们就会在 ORDERS 表格中设定一个外来键,而这个外来键是指向 CUSTOMER 表格中的主键。这样一来,我们就可以确定所有在 ORDERS 表格中的顾客都存在 CUSTOMER 表格中。换句话说,ORDERS表格之中,不能有任何顾客是不存在于 CUSTOMER 表格中的资料。
CUSTOMER 表格
|------------|----|
| 栏位名 | 性质 |
| SID | 主键 |
| Last_Name | |
| First_Name | |
ORDERS 表格
|--------------|-----|
| 栏位名 | 性质 |
| Order_ID | 主键 |
| Order_Date | |
| Customer_SID | 外来键 |
| Amount | |
2.3表操作
//修改表名
ALTER TABLE 旧表名 RENAME TO 新表名
//修改字段名
ALTER TABLE 表名 RENAME 旧字段 TO 新字段
//修改字段类型
ALTER TABLE 表名 ALTER COLUMN 字段 TYPE 类型(VARCHAR(40))
//删除字段
ALTER TABLE 表名 DROP COLUMN 字段
//添加字段
ALTER TABLE 表名 ADD COLUMN 字段 类型
//删除表
DROP TABLE 表名
//删除前进行判断
DROP TABLE IF EXISTS 表名
一般drop table if exists是数据库里面的,后面接表名如:drop table if exists xxx_book意思就是:如果数据库中存在xxx_book表,就把它从数据库中drop掉。
2.4往表中插入数据
//插入数据
INSERT INTO 表名 VALUES(1,'阿道夫','2022-10-10',NULL)
//指定字段插入数据
INSERT INTO 表名 (id,name) VALUES ('2','王老五');
批量导入
//将表数据插入到新表中
INSERT INTO 新表名 SELECT * FROM 表名;
//指定字段批量插入
INSERT INTO student1 (id,name) SELECT id, name FROM student;
往新表中插入其他表的指定字段数据
INSERT INTO employee (e_id, name) SELECT id, name FROM company WHERE name IS NOT NULL;
//往employee(e_id) 和 (name) 字段 插入 company表的 id name字段的值 如果name不为空的话
2.5 修改表数据
//更新数据,将id等于2的用户名改成'张三' ,如果不指定更新条件,会全局更新
UPDATE 表名 SET name = '张三' WHERE id = 2
2.6删除表数据
//删除id等于2的表数据
DELETE FROM 表名 WHERE id = 2
//删除id在1到3的表数据
DELETE FROM student WHERE id BETWEEN 1 and 3;
//清空数据表
DELETE from student;
TRUNCATE TABLE student;
2.7表查询
//查询所有字段内容
SELECT * FROM 表名
//批量字段查询
SELECT id, name FROM student;
// 多表查询
SELECT student.name, student1.name FROM student;
// 给表取别名后查询,简化代码
SELECT s.id, s.name FROM student s;
2.7.1单表指定 条件查询
//in关键字查询 查询id为1,3,5的成员
SELECT id,name FROM 表名 WHERE id IN (1,3,5)
//between and 关键字查询,在什么之间
SELECT id,name,birthday FROM 表名 WHERE birthday BETWEEN '2020-10-10' AND '2024-10-10'
//模糊查询,查询所有姓张的用户
SElECT id, name FROM 表名 WHERE name LIKE '张%'
2.7.2单表指定 条件复杂查询
//查询所有字段内容
SELECT * FROM student;
//只显示前3条数据
SELECT * FROM student LIMIT 3;
//查询三条数据,从第二条开始
SELECT * FROM student LIMIT 3 OFFSET 2;
//查询姓名非空内容
SELECT id,name FROM student where name is NOT null;
//1 or 3 :1与3 ;ORDER BY id ASC 按id升序 ORDER BY id DESC 按id降序 默认升序
SELECT id,name FROM student where id=1 OR id=3 ORDER BY id ;
2.7.3 多表查询
//创建一个班级表,id为主键 id int PRIMARY KEY,
//创建学生表,id为主键,classid为外键,关联表class的id
CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id)
//隐式内连接,关联classid显示student成员所在班级
SELECT student.id, class.id,student.name, class.name FROM student, class WHERE student.classid = class.id;
//显示内连接, INNER JOIN不返回空值 ; LEFT JOIN 左连接,RIGHT JOIN 右连接,不能匹配的数据也返回
//INNER JOIN,所以结果中只返回匹配的数据,不会有空值出现。
SELECT student.id, class.id,student.name, class.name
FROM student INNER JOIN class ON student.classid = class.id ;
例子:
SELECT c.id, c.name,c.address,e.huji,e.work_time,e.phone
FROM employee AS e
INNER JOIN company AS c ON e.e_id = c.id;
子查询
子查询或称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。
一个 SELECT 语句的查询结果能够作为另一个语句的输入值
//EXISTS关键字子查询
SELECT * FROM student WHERE EXISTS
(SELECT class.id FROM class WHERE class.name = '二班' AND student.classid = class.id);
//IN 关键字子查询
SELECT * FROM student WHERE student.classid IN
(SELECT class.id FROM class WHERE class.name = '二班' );
查询结果合并操作
UNION 可去重复 执行速度慢
UNION ALL 不可去重复 执行速度快
- 运算符
3.1算术运算符 + - * %
3.2比较运算符 = 返回t f
3.3 逻辑运算符 NOT(逻辑非) AND(逻辑与) OR(逻辑或)
//判断2是否在1~3之间 T
SELECT 2 BETWEEN 1 AND 3;
//判断2是否在234集合中 T
SELECT 2 in (2,3,4);
//like运算符模糊匹配 %代表多个字符 _代表一个字符
SELECT 'abc' LIKE 'a%', --T
'abc' LIKE 'a', --F
'abc' LIKE 'b', --T
'abc' NOT LIKE 'b'; --F
SELECT LEAST(1,2,3), --返回最小值:1
GREATEST(1,2,3); --返回最大值:3
- 函数
4.1数值函数
SELECT 函数(字段名) from 表名; !!!!!
4.2字符串函数
SELECT 函数(字段名) from 表名;!!!!
4.3日期时间函数
CURRENT_DATA = 2023-08-03
CURRENT_TIME = 18:18:01.412198+08
NOW = 2023-08-03 18:18:01.412198+08
EXTRACT 使用 (相当于转换时间格式)
- 自定义函数
CREATE FUNCTION //声明创建函数
ADD(INTEGER,INTEGER) //定义函数名称
RETURNS INTEGER //定义函数返回值
AS'SELECT $1 + $2;' //定义函数体
LANGUAGE SQL //用以实现函数的语言名字
RETURNS NULL ON NULL INPUT; //定义参数为NULL时处理情况
例子:
- 数据库索引
使用索引的优缺点
优点:
通过创建唯一的索引,可以保证数据库表中每一行数据的唯一性。
可以大大提高查询速度
加速表与表之间的连接
减少查询中分组和排序的时间
缺点:
创建和维护索引耗费时间,数据量越多耗费的时间越多
索引需要占用物理空间
对表的数据进行增加、删除、修改的时候,索引也需要动态维护,降低了数据的维护速度。
//-- 创建索引 此处默认使用B-tree
CREATE INDEX student_name_index ON student(name);
//-- 删除索引
DROP INDEX student_name_index;
- 数据库视图
使用视图具有 简单化、安全性、逻辑数据独立性
--创建视图top3,展示id,name,birthday 条件是id<=3 并且按id降序
CREATE VIEW top3 AS SELECT id,name,birthday FROM student where id <= 3 ORDER BY id desc;
--查看视图
SELECT * FROM top3;
--删除视图
DROP VIEW top3;
- 主键` 外键
主键 使用PRIMARY KEY 语句 设置为主键
外键 CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id) 关联其他表的主键
- 约束
主键与约束的区别,主键的值是非空 加唯一 ,且一个表只能有一个主键,可以有多个约束
-
- // UNIQUE 唯一约束
- // NOT NULL 非空约束
- // DEFAULT 默认值约束
例子:
CREATE TABLE student(
id INT UNIQUE, // UNIQUE 唯一约束
name VARCHAR(30) NOT NULL, // NOT NULL 非空约束
birthday DATE,
score NUMERIC(5,2) DEFAULT 0.0 // DEFAULT 默认值约束
);