目录
前言
基本操作
数据库操作
创建表
表操作
往表中插入数据
修改表数据
删除表数据
表查询
单表指定条件查询
单表指定条件复杂查询
多表查询
子查询
数据类型
数值类型
日期与时间类型
编辑
字符串类型
运算符
算术运算符
编辑
比较运算符
逻辑运算符
函数
数值函数
字符串函数
编辑
日期时间函数
自定义函数
数据库索引
数据库视图
主键、外键
主键
外键
约束
PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 开发者把它念作 post-gress-Q-L。PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库"。
-- 创建数据库
CREATE DATABASE db_lbh;
-- 在创建数据库时指定参数信息 WITH OWNER:所有者 ENCODING:编码格式
CREATE DATABASE db_lbh2 WITH OWNER = postgres ENCODING = 'utf-8';
-- 修改数据库名称
ALTER DATABASE db_lbh2 RENAME TO db_lbh3;
-- 修改连接限制数
ALTER DATABASE db_lbh CONNECTION LIMIT 20;
-- 删除数据库
DROP DATABASE db_lbh3;
-- 创建表
CREATE TABLE student(
id INT,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2)
);
-- 修改表名
ALTER TABLE student RENAME TO student1;
-- 修改字段名
ALTER TABLE student1 RENAME id TO myid;
-- 修改字段类型
ALTER TABLE student1 ALTER COLUMN name TYPE VARCHAR(40);
-- 删除字段
ALTER TABLE student1 DROP COLUMN birthday;
-- 添加字段
ALTER TABLE student1 ADD COLUMN birthday varchar(20);
-- 删除表
DROP TABLE student1;
-- 删除前进行判断
DROP TABLE IF EXISTS student1;
-- 插入数据
INSERT INTO student VALUES (1,'阿道夫','2022-10-10',NULL);
-- 指定字段插入数据
INSERT INTO student (id,name) VALUES('2','王老五');
--SELECT批量插入
-- 将表数据插入到新表中
INSERT INTO student1 SELECT * FROM student;
-- 指定字段批量插入
INSERT INTO student1 (id,name) SELECT id, name FROM student;
-- 更新数据,将id等于2的用户名改成'张三' ,如果不指定更新条件,会全局更新
UPDATE student SET name = '张三' WHERE id = 2;
指定条件删除
--删除id等于2的表数据
DELETE FROM student WHERE id = 2;
--删除id在1到3的表数据
DELETE FROM student WHERE id BETWEEN 1 and 3;
清空表数据
--清空数据表
DELETE from student;
TRUNCATE TABLE student;
-- 查询所有字段内容
SELECT * FROM student;
-- 批量字段查询
SELECT id, name FROM student;
-- 多表查询
SELECT student.name, student1.name FROM student;
-- 给表取别名后查询,简化代码
SELECT s.id, s.name FROM student s;
-- in关键字查询 查询id为1,3,5的成员
SELECT id, name FROM student WHERE id IN (1,3,5);
-- between and 关键字查询,在什么之间
SELECT id, name, birthday FROM student
WHERE birthday BETWEEN '2020-10-10' AND '2024-10-10';
--模糊查询,查询所有姓张的用户
SELECT id, name FROM student WHERE name LIKE '张%';
-- 查询所有字段内容
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 ;
--创建一个班级表,id为主键
CREATE TABLE class(
id int PRIMARY KEY,
name VARCHAR(10)
);
--插入班级与对应id
INSERT INTO class VALUES(1,'一班'),(2,'二班');
--创建学生表,id为主键,classid为外键,关联表class的id
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2),
classid int,
CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id)
);
INSERT INTO student VALUES
(1,'阿道夫','2022-10-10',NULL,1),
(2,'沙和尚','2022-10-10',NULL,2),
(3,'孙悟空','2022-10-10',NULL,2);
-- 隐式内连接,关联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 右连接,不能匹配的数据也返回
SELECT student.id, class.id,student.name, class.name
FROM student INNER JOIN class ON student.classid = class.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 不可去重复 执行速度快
--整数类型
SMALLINT //小整数:-32768 ~ 32767
INT(INTEGER) //普通整数:-2147483648 ~ 2147483647
--任意精度浮点数类型
REAL //6位十进制数字精度
NUMERIC(m,n) //任意精度(m总位数,n小数位)
举例
--创建学生表,设置id数值类型
CREATE TABLE student(
id1 SMALLINT,
id2 INT,
id3 REAL,
id4 numeric(5,2)
);
举例:
--创建表
CREATE TABLE student(
t TIME,
d DATE,
tm TIMESTAMP
);
--插入数据
INSERT INTO student VALUES('10:10:10','2020-10-10','2020-10-10 10:10:10');
-- 创建表
CREATE TABLE student(
ch CHAR(10),
vch VARCHAR(30),
t TEXT
);
-- 插入数据
INSERT INTO student VALUES ('哈哈哈','哈哈哈','哈哈哈')
SELECT concat('(',ch,')'),
concat('(',vch,')'),
concat('(',t,')')
FROM student;
可以看见CHAR类型字符长度不够会空白补充
-- 判断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
NOT (逻辑非)
AND (逻辑与)
OR (逻辑或)
SELECT 函数(字段名) from 表名;
SELECT 函数(字段名) from 表名;
EXTRACT使用
基本语法
CREATE FUNCTION //声明创建函数
ADD(INTEGER,INTEGER) //定义函数名称
RETURNS INTEGER //定义函数返回值
AS'SELECT $1 + $2;' //定义函数体
LANGUAGE SQL //用以实现函数的语言名字
RETURNS NULL ON NULL INPUT; //定义参数为NULL时处理情况
举例:
CREATE FUNCTION
add2(INTEGER,INTEGER)
RETURNS INTEGER
AS'SELECT $1 + $2 + $1;'
LANGUAGE SQL
RETURNS NULL ON NULL INPUT;
--使用函数
SELECT add2(1,2);
-- 结果: 4
删除函数
DROP FUNCTION concat_student(INT,VARCHAR,DATE);
使用索引的优缺点
优点:
通过创建唯一的索引,可以保证数据库表中每一行数据的唯一性。
可以大大提高查询速度
加速表与表之间的连接
减少查询中分组和排序的时间
缺点:
创建和维护索引耗费时间,数据量越多耗费的时间越多
索引需要占用物理空间
对表的数据进行增加、删除、修改的时候,索引也需要动态维护,降低了数据的维护速度。
-- 创建索引 此处默认使用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;
比如我们前面创建的学生表student里,id是唯一的,就可以使用PRIMARY KEY语句设置为主键
--方式1,列级约束,使用PRIMARY KEY语句,不能指定主键名称
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2)
);
--方式2,表级约束,可以指定主键名称
CREATE TABLE student(
id INT,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2),
CONSTRAINT pk_student_id PRIMARY KEY(id)
);
--创建一个班级表,id为主键
CREATE TABLE class(
id int PRIMARY KEY,
name VARCHAR(10)
);
--插入班级与对应id
INSERT INTO class VALUES(1,'一班'),(2,'二班');
--创建学生表,id为主键,classid为外键,关联表class的id
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(30),
birthday DATE,
score NUMERIC(5,2),
classid int,
CONSTRAINT pk_student_id FOREIGN KEY(classid) REFERENCES class(id)
);
主键与约束的区别,主键的值是非空加唯一,且一个表只能有一个主键,可以有多个约束
CREATE TABLE student(
id INT UNIQUE, // UNIQUE 唯一约束
name VARCHAR(30) NOT NULL, // NOT NULL 非空约束
birthday DATE,
score NUMERIC(5,2) DEFAULT 0.0 // DEFAULT 默认值约束
);