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 默認值約束
);