本次教程基于醫(yī)院門診掛號場景,將 reg_time 字段調(diào)整為僅“年月日”格式(DATE 類型),并保留完整語法定義和解釋。
一、前置準備:新建醫(yī)院門診掛號表
1. 操作環(huán)境說明
執(zhí)行用戶:普通用戶
user_hospital數(shù)據(jù)庫:
db_cloud_hospitalgsql 提示符:
db_cloud_hospital=>
2. 連接并切換到目標環(huán)境
# 操作系統(tǒng)終端執(zhí)行
su - omm
gsql -d db_cloud_hospital -U user_hospital -p 26000
# 成功后提示符:db_cloud_hospital=>
3. 新建門診掛號表(reg_time 僅年月日)
表名:t_outpatient_reg(門診掛號表),reg_time 改為 DATE 類型(僅存儲年月日):
-- db_cloud_hospital=> 下執(zhí)行(先刪除舊表,避免沖突)
DROP TABLE IF EXISTS t_outpatient_reg;
CREATE TABLE t_outpatient_reg (
reg_id INT PRIMARY KEY, -- 掛號ID(主鍵,唯一標識)
patient_name VARCHAR(50) NOT NULL, -- 患者姓名(非空)
department VARCHAR(50) NOT NULL, -- 就診科室(非空)
doctor_name VARCHAR(50), -- 接診醫(yī)生
reg_fee NUMERIC(5,2) NOT NULL, -- 掛號費(非空)
reg_time DATE DEFAULT CURRENT_DATE -- 掛號日期(僅年月日,默認當天)
);
-- 成功提示:DROP TABLE、CREATE TABLE
二、添加數(shù)據(jù)(INSERT)
完整語法定義
INSERT INTO 表名 [ ( column_name [, ...] ) ]
{ VALUES {( { expression | DEFAULT } [, ...] ) }[, ...]
| query };
語法解釋
column_name:目標表中的字段名。目標字段可以按順序排列。如果沒有列出任何字段,則默認全部字段,且順序為表聲明時的順序。VALUES子句:該子句和query提供的值在表中從左到右關(guān)聯(lián)到對應(yīng)列。其中expression是給對應(yīng)屬性列的一個有效表達式或值,DEFAULT表示對應(yīng)屬性列的缺省值。query子句:一個查詢語句(SELECT語句),將查詢結(jié)果作為錄入的數(shù)據(jù)。-
注意:
使用
INSERT語句添加數(shù)據(jù)時,字段名是可以省略的。如果不指定字段名,值的順序必須和數(shù)據(jù)表定義的字段順序相同。
如果指定字段名,值的順序要和指定的字段名順序保持一致。
1. 添加單條數(shù)據(jù)的3種方式
方式1:指定所有字段名
-- db_cloud_hospital=> 下執(zhí)行(reg_time 格式:'YYYY-MM-DD')
INSERT INTO t_outpatient_reg (reg_id, patient_name, department, doctor_name, reg_fee, reg_time)
VALUES (1001, '張三', '內(nèi)科', '王醫(yī)生', 25.00, '2026-03-24');
-- 成功提示:INSERT 0 1
方式2:省略所有字段名
?? 注意:值的順序必須和建表時的字段順序完全一致
-- db_cloud_hospital=> 下執(zhí)行
INSERT INTO t_outpatient_reg
VALUES (1002, '李四', '外科', '李醫(yī)生', 30.00, '2026-03-24');
-- 成功提示:INSERT 0 1
方式3:指定部分字段名(利用默認值)
未指定的 reg_time 會自動填充當天日期
-- db_cloud_hospital=> 下執(zhí)行
INSERT INTO t_outpatient_reg (reg_id, patient_name, department, reg_fee)
VALUES (1003, '王五', '兒科', 20.00);
-- 成功提示:INSERT 0 1
2. 添加多條數(shù)據(jù)
完整語法定義
INSERT [INTO] 數(shù)據(jù)表名稱 [(字段名[, ...])] VALUES
(第1條記錄的值1, 第1條記錄的值2, ...),
(第2條記錄的值1, 第2條記錄的值2, ...),
...
(第n條記錄的值1, 第n條記錄的值2, ...);
醫(yī)院場景示例
-- db_cloud_hospital=> 下執(zhí)行
INSERT INTO t_outpatient_reg
VALUES
(1004, '趙六', '內(nèi)科', '王醫(yī)生', 25.00, '2026-03-25'),
(1005, '錢七', '外科', '張醫(yī)生', 30.00, '2026-03-25'),
(1006, '孫八', '兒科', '劉醫(yī)生', 20.00, '2026-03-25');
-- 成功提示:INSERT 0 3
三、排序查詢(ORDER BY)
完整語法定義
SELECT * | {字段名[, ...]} FROM 數(shù)據(jù)表名稱
ORDER BY 字段名1 [ASC | DESC][, 字段名2 [ASC | DESC]]...;
語法解釋
- 如果不指定排序方式,默認按照
ASC(升序)排序。
醫(yī)院場景示例
1. 單字段升序(ASC,默認)
按掛號費從低到高排序
-- db_cloud_hospital=> 下執(zhí)行
SELECT * FROM t_outpatient_reg ORDER BY reg_fee ASC;
-- 等價于:SELECT * FROM t_outpatient_reg ORDER BY reg_fee;
2. 單字段降序(DESC)
按掛號日期從晚到早排序
-- db_cloud_hospital=> 下執(zhí)行
SELECT * FROM t_outpatient_reg ORDER BY reg_time DESC;
3. 多字段組合排序
先按科室升序,科室相同時按掛號費降序
-- db_cloud_hospital=> 下執(zhí)行
SELECT * FROM t_outpatient_reg ORDER BY department ASC, reg_fee DESC;
四、限量查詢(LIMIT)
完整語法定義
SELECT [查詢選項] * | {字段名[, ...]} FROM 數(shù)據(jù)表名稱 [WHERE 條件表達式]
LIMIT [OFFSET, ] 記錄數(shù);
語法解釋
OFFSET為可選項,如果不指定OFFSET的值,默認值為 0,表示從第 1 條數(shù)據(jù)開始獲??;OFFSET值為 1 則從第 2 條數(shù)據(jù)開始獲取,以此類推。“記錄數(shù)”表示查詢結(jié)果中的最大條數(shù)限制。
醫(yī)院場景示例
1. 基礎(chǔ) LIMIT(取前 N 條)
取掛號日期最早的前3條記錄
-- db_cloud_hospital=> 下執(zhí)行
SELECT * FROM t_outpatient_reg ORDER BY reg_time ASC LIMIT 3;
2. LIMIT + OFFSET(跳過 M 條取 N 條)
跳過前2條,取第3-5條(共3條)
-- db_cloud_hospital=> 下執(zhí)行
SELECT * FROM t_outpatient_reg ORDER BY reg_id LIMIT 2, 3;
-- 等價于:SELECT * FROM t_outpatient_reg ORDER BY reg_id LIMIT 3 OFFSET 2;
五、修改/刪除操作的排序和限量
完整語法定義
# 對修改操作進行排序和限量
UPDATE 數(shù)據(jù)表名稱 SET 字段名1=新值1[, 字段名2=新值2, ...] [WHERE 條件表達式]
ORDER BY 字段名1 [ASC | DESC][, 字段名2 [ASC | DESC]] LIMIT 記錄數(shù);
# 對刪除操作進行排序和限量
DELETE FROM 數(shù)據(jù)表名稱 [WHERE 條件表達式]
ORDER BY 字段名1 [ASC | DESC][, 字段名2 [ASC | DESC]] LIMIT 記錄數(shù);
醫(yī)院場景示例
1. 修改操作的排序和限量
給掛號費最低的2條記錄,每人上調(diào)5元掛號費
-- db_cloud_hospital=> 下執(zhí)行
UPDATE t_outpatient_reg
SET reg_fee = reg_fee + 5
ORDER BY reg_fee ASC
LIMIT 2;
-- 成功提示:UPDATE 2
-- 驗證更新結(jié)果
SELECT * FROM t_outpatient_reg ORDER BY reg_fee ASC;
2. 刪除操作的排序和限量
刪除掛號日期最早的1條記錄
-- db_cloud_hospital=> 下執(zhí)行
DELETE FROM t_outpatient_reg
ORDER BY reg_time ASC
LIMIT 1;
-- 成功提示:DELETE 1
-- 驗證刪除結(jié)果
SELECT * FROM t_outpatient_reg ORDER BY reg_time ASC;
六、操作總結(jié)(醫(yī)院場景速查)
| 操作類型 | 醫(yī)院業(yè)務(wù)場景示例 | 核心語法關(guān)鍵詞 |
|---|---|---|
| 添加單條掛號 | 掛1個內(nèi)科的號 | INSERT INTO ... VALUES |
| 批量添加掛號 | 一次性掛3個不同科室的號 | INSERT INTO ... VALUES (...), (...) |
| 排序查詢 | 按掛號費從低到高查看所有號源 | ORDER BY ... ASC/DESC |
| 分頁查詢 | 查看第2頁的掛號記錄(每頁3條) | LIMIT ... OFFSET ... |
| 排序限量修改 | 給最便宜的2個號源調(diào)價 | UPDATE ... ORDER BY ... LIMIT |
| 排序限量刪除 | 刪除最早的1個過期掛號記錄 | DELETE ... ORDER BY ... LIMIT |
查用操作總結(jié)(醫(yī)院場景速查)
| 查詢類型 | 核心操作(快捷命令) | 詳細查詢(系統(tǒng)表) | 醫(yī)院場景示例 |
|---|---|---|---|
| 查詢表空間 | \db [表空間名] |
SELECT * FROM pg_tablespace |
查看 ts_cloud_hospital 路徑 |
| 查詢數(shù)據(jù)庫 | \l [數(shù)據(jù)庫名] |
SELECT * FROM pg_database |
查看 db_cloud_hospital 字符集 |
| 查看所有表 | \dt [表前綴] |
SELECT * FROM pg_tables |
查看 public 模式下所有醫(yī)院業(yè)務(wù)表 |
| 查看表結(jié)構(gòu) | \d 表名 |
SELECT * FROM pg_attribute |
查看 t_outpatient_reg 字段 / 約束 |
| 查看表詳細結(jié)構(gòu) | \d+ 表名 |
SELECT * FROM pg_tables, pg_indexes |
查看 t_outpatient_reg 索引 / 權(quán)限 |
注意事項
- 快捷命令(
\db、\l、\dt、\d、\d+)無需加分號,直接在 gsql 提示符下執(zhí)行; - 系統(tǒng)表查詢(如
pg_tablespace、pg_database)需加分號,執(zhí)行后會返回具體字段信息; - 普通用戶(
user_hospital)可查看所有表、表空間、數(shù)據(jù)庫的基礎(chǔ)信息,但無法查看系統(tǒng)級敏感權(quán)限; - 若查詢不到目標表 / 表空間 / 數(shù)據(jù)庫,需確認:① 已連接到正確的數(shù)據(jù)庫;② 擁有對應(yīng)查詢權(quán)限;③ 目標對象已創(chuàng)建。
(注:)