數(shù)據(jù)庫SQL基礎(chǔ)-Postgresql版

有思維導(dǎo)圖版本,可以點擊查看

一、創(chuàng)建&刪除

1、數(shù)據(jù)庫

  • 創(chuàng)建
    CREATE DATABASE 數(shù)據(jù)庫名;

  • 刪除
    DROP DATABASE 數(shù)據(jù)庫名;

2、表

  • 創(chuàng)建
create table 表名 
(
    列名稱1 數(shù)據(jù)類型,
    列名稱2 數(shù)據(jù)類型,
);

例子:

CREATE TABLE account 
(
    id serial PRIMARY KEY ,
    name VARCHAR NOT NULL ,
    gender CHAR NOT NULL DEFAULT '0', -- 0 表示未知性別  1 表示女性 2 表示男性
    mobile CHAR(11),
    is_return BOOLEAN NOT NULL DEFAULT False, 
    date_created TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP
);
  • 刪除
    DROP TABLE 表名;

3、常用數(shù)據(jù)類型:

1. 數(shù)值類型

名字 描述 范圍
smallint 小范圍整數(shù) -32768 到 +32767
integer 常用的整數(shù) -2147483648 到 +2147483647
bigint 大范圍的整數(shù) -9223372036854775808 到 9223372036854775807
decimal/numeric 用戶定義精度,可以精確地表示小數(shù) 無限制
real 精度可變,不能精確地表示小數(shù) 精度是6個十進制位
double precision 精度可變,不能精確地表示小數(shù) 精度是15個十進制位
serial 小范圍的自增整數(shù) 大范圍的自增整數(shù)
bigserial 大范圍的自增整數(shù) 1 到 9223372036854775807

1.整數(shù)類型

類型smallint、integer和bigint存儲各種范圍的全部是數(shù)字的數(shù),也就是沒有小數(shù)部分的數(shù)字。試圖存儲超出范圍以外的數(shù)值將導(dǎo)致一個錯誤。常用的類型是integer,因為它提供了在范圍、存儲空間和性能之間的最佳平衡。一般只有在磁盤空間緊張的時候才使用smallint。而只有在integer的范圍不夠的時候才使用bigint,因為前者(integer)絕對快得多。

2.任意精度數(shù)值
類型numeric可以存儲最多1000位精度的數(shù)字并且準確地進行計算。因此非常適合用于貨幣金額和其它要求計算準確的數(shù)量。不過,numeric類型上的算術(shù)運算比整數(shù)類型或者浮點數(shù)類型要慢很多。

3.浮點數(shù)類型
數(shù)據(jù)類型real和double是不準確的、犧牲精度的數(shù)字類型。不準確意味著一些數(shù)值不能準確地轉(zhuǎn)換成內(nèi)部格式并且是以近似的形式存儲的,因此存儲后再把數(shù)據(jù)打印出來可能顯示一些缺失。

4.自增整數(shù)
serial和bigserial類型不是真正的類型,只是為在表中設(shè)置唯一標識做的概念上的便利。

2. 字符類型

名字 描述
varchar(n) 變長,有長度限制
char(n) 定長,不足補空白
text 變長,無長度限制

SQL 定義了兩種基本的字符類型,varchar(n)和char(n),這里的n是一個正整數(shù)。兩種類型都可以存儲最多n個字符長的字串,試圖存儲更長的字串到這些類型的字段里會產(chǎn)生一個錯誤,除非超出長度的字符都是空白,這種情況下該字串將被截斷為最大長度。如果沒有長度聲明,char等于char(1),而varchar則可以接受任何長度的字串。

3. 日期/時間類型

名字 描述
timestamp[無時區(qū)] 包括日期和時間
timestamp[含時區(qū)] 日期和時間,帶時區(qū)
interval 時間間隔
date 只用于日期
time[無時區(qū)] 只用于一日內(nèi)時間

4. 布爾類型

boolean數(shù)據(jù)類型。boolean只能有兩個狀態(tài)之一:真(True)或 假(False)。

例子:

CREATE TABLE date_type 
(
    -- 數(shù)字類型
    id serial PRIMARY key,
    col_int INTEGER DEFAULT 0,
    col_float DECIMAL DEFAULT 0.0,
    -- 字符類型
    col_char CHAR(10),
    col_varchar VARCHAR(10),
    col_text text, 
    -- 日期類型
    col_date DATE DEFAULT CURRENT_DATE ,
    col_time TIME DEFAULT CURRENT_TIME ,
    col_timestamp TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP ,
    col_timestamp_with_timezone TIMESTAMP(0) WITH TIME zone DEFAULT CURRENT_TIMESTAMP ,
    -- bool類型
    col_bool BOOLEAN DEFAULT FALSE 
);

4、表的修改

  1. 增加字段(一列)
    ALTER TABLE 表名 ADD COLUMN 列名 數(shù)據(jù)類型;

  2. 刪除字段(一列)
    ALTER TABLE 表名 DROP COLUMN 列名;

  3. 更改字段(列)的數(shù)據(jù)類型
    ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 數(shù)據(jù)類型;

  4. 給列添加|刪除default
    ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 7.77

  5. 表的重命名
    ALTER TABLE 表名 RENAME TO 新表名;

  6. 更改字段名
    ALTER TABLE 表名 RENAME 列名 TO 新列名;

  7. 更改約束
    ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (列名(可以多個));
    ALTER TABLE 表名 ALTER COLUMN 列名 SET NOT NULL

例子:

-- 增加
ALTER TABLE account add COLUMN test CHAR(11) ;

ALTER TABLE account add COLUMN test1 INTEGER ;

-- 刪除
ALTER TABLE account DROP COLUMN test;

-- 重命名
ALTER TABLE account rename COLUMN test1 TO department ;

-- 修改字段類型
ALTER TABLE account ALTER COLUMN department type VARCHAR;

-- 給字段增加非空約束
ALTER TABLE account_score add CONSTRAINT account_score_account_id UNIQUE (account_id);

5、表的約束

  1. NOT NULL 約束(非空約束)
    默認情況下,列可以保存NULL值。如果不希望一列具有NULL值,那么需要在此列指定NULL約束定義。 NOT NULL約束總是寫成一列約束。
    NULL并不相同,因為沒有數(shù)據(jù),而是它代表著未知的數(shù)據(jù)。

  2. UNIQUE 約束 (唯一約束)
    唯一約束防止兩個記錄在一個特定的列具有相同的值??梢詾橐粋€,也可以為多個

  3. PRIMARY KEY 約束(主鍵約束)
    數(shù)據(jù)庫表中的PRIMARY KEY約束唯一標識每條記錄??梢杂卸鄠€UNIQUE的列,但在一個表中只有一個主鍵。在設(shè)計數(shù)據(jù)庫表的主鍵是重要的。主鍵是唯一的ID。

  4. FOREIGN KEY 約束(外鍵約束)
    外鍵約束指定一列(或一組列)中的值的值必須符合另一個表中出現(xiàn)的一些行。我們說這是維持兩個相關(guān)的表之間的引用完整性。它們被稱為外鍵,因為約束是外部的,也就是說表的外部。有時也被稱為外鍵引用的關(guān)鍵。

  5. 其他約束
    CHECK 約束(檢查約束)
    EXCLUSION 約束(擴展約束)
    刪除約束

例子:

-- 主鍵約束,唯一約束
CREATE TABLE study_group 
(
    id serial PRIMARY KEY ,
    name CHAR(30),
    summary text,
    leader_id INTEGER UNIQUE 
);

-- 多個字段組合成唯一約束
CREATE TABLE follow 
(
    follower_id INTEGER NOT NULL , 
    following_id INTEGER NOT NULL , 
    date_created TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    CONSTRAINT uk_follow_follower_id_following_id UNIQUE (follower_id,following_id)
);

-- 創(chuàng)建外鍵約束
CREATE TABLE account_score (
    account_id INTEGER NOT NULL ,
    score serial ,
    FOREIGN KEY (account_id) REFERENCES account(id)
);

-- 增加外鍵約束
ALTER TABLE account add  FOREIGN KEY (group_id) REFERENCES study_group;

二、數(shù)據(jù)的增刪改

1、插入數(shù)據(jù)

按照列的順序插入:
INSERT INTO 表名稱 VALUES (值1, 值2,....)
我們也可以指定所要插入數(shù)據(jù)的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

  • 注意
  1. 自增唯一的字段,盡量不要給賦值
  2. 默認值如果不需要賦值的話,不需要給賦值
  3. 如果賦值,需要注意字段類型和格式

例子:

-- 按順序插入
INSERT INTO follow VALUES (1,3);

-- 指定字段插入一組數(shù)據(jù)
INSERT INTO account (name, mobile) VALUES ('haha', '12345677890');

-- 指定字段插入多組數(shù)據(jù)
INSERT INTO account (name, mobile) VALUES ('haha1', '12345677890'),
('haha2', '123234325');

2、修改數(shù)據(jù)

修改全部值(!!!慎用
UPDATE 表名稱 SET 列名稱 = 新值

修改某個條件下的值
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

例子:

UPDATE account SET name = '1345' WHERE id = 1

3、刪除數(shù)據(jù)

刪除全部的行(!!!慎用
DELETE FROM 表名稱

刪除某一個條件下的行
DELETE FROM 表名稱 WHERE 列名稱 = 值

例子:

DELETE FROM account WHERE id = 2;

三、數(shù)據(jù)的查詢

語法:

  1. 全部查詢
    SELECT * FROM 表名

  2. 單列查詢
    SELECT 列名 FROM 表名

  3. 多列查詢
    SELECT 列名1, 列名2 FROM 表名

  4. 帶條件查詢
    SELECT * FROM 表名 WHERE 列1=值1 AND 列2>值2 OR 列3 NOT IN (值1, 值2) AND 列4 LIKE 'abc%' ;

  5. 分組排序匯總查詢
    以列1分組,并匯總、排序
    SELECT 列1, SUM(列2) FROM 表名 WHERE 列3 = 值 GROUP BY 列1 HAVING SUM(列2) > 10 ORDER BY SUM(列2) DESC;

  6. 限制條目查詢
    獲取第20條開始的10條數(shù)據(jù)
    SELECT * FROM 表名 ORDER BY 列1 LIMIT 10 OFFSET 20;

1、唯一值查詢

語法
SELECT DISTINCT 列名稱 FROM 表名稱

2、數(shù)據(jù)匯總函數(shù)

語法
SELECT function(列) FROM 表

常用function

函數(shù) 描述
COUNT(column) 返回某列的行數(shù)(不包括 NULL 值)
COUNT(*) 返回被選行數(shù)
AVG(column) 返回某列的平均值
MAX(column) 返回某列的最高值
MIN(column) 返回某列的最低值
SUM(column) 返回某列的總和

3、條件語句where

  • 連接詞: and or in
  • 模糊查找: like
  • 操作符: in, between
  • 運算符號: >, <, =, <>, >=, <=

例子:

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'

4、分組

關(guān)鍵字: group by
GROUP BY 語句用于結(jié)合合計函數(shù),根據(jù)一個或多個列對結(jié)果集進行分組。

例子:

SELECT study_group.name, count(account.id) FROM account 
RIGHT JOIN study_group ON study_group.id = account.group_id
GROUP BY study_group.id;

5、排序語句

關(guān)鍵字: order by
倒敘排列: desc

ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進行排序。
ORDER BY 語句默認按照升序?qū)τ涗涍M行排序。
如果您希望按照降序?qū)τ涗涍M行排序,可以使用 DESC 關(guān)鍵字。

例子:

-- 按照id 倒敘排列
select * from account order by id desc;

6、限制條目

關(guān)鍵字: limit, offset

limit是限制條目
offset是偏移量

例子:

-- 按照id正序排列 從第11個位置開始 限制10個條目
selece * from account order by id limit 10 offset 10

7、多表查詢

傳統(tǒng)連接

連接就是將多個表中的數(shù)據(jù)連接到一起的查詢,即連接操作可以在一個Select語句中完成從多個表中查找和處理數(shù)據(jù),使用連接時可以使用名字相同的不同表的列,也可以不同,但要求連接的列不需可連接,即數(shù)據(jù)類型相同。

SELECT * FROM 表名1 T1,表名2 T2 WHERE T1.column=T2.column;

例子:

SELECT follower.name, following.name, follow.date_created 
FROM follow, account AS follower,account AS following  
WHERE follower.id =follow.follower_id AND following.id=follow.following_id;

連表查詢

  1. Union 聯(lián)合查詢
    UNION 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集。

  2. INNER JOIN(內(nèi)連接)
    (INNER) JOIN(內(nèi)連接),也成為自然連接,根據(jù)兩個或多個表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)。

  3. 外連接
    與內(nèi)連接相比,即使沒有匹配行,也會返回一個表的全集。
    1)LEFT OUTER JOIN,簡稱LEFT JOIN,左外連接(左連接)
    2)RIGHT JOIN(right outer join)右外連接(右連接)

  4. CROSS JOIN(交叉連接)
    交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。

例子:

-- UNION
SELECT id,name FROM account
UNION
SELECT id,name FROM study_group;

-- 內(nèi)鏈接
SELECT account.id, account.name, account.group_id, study_group.name FROM account INNER JOIN study_group ON account.group_id = study_group.id;

-- 左外鏈接
SELECT account.id, account.name, account.group_id, study_group.name FROM account LEFT JOIN study_group ON account.group_id = study_group.id;

-- 右外連接
SELECT account.id, account.name, account.group_id, study_group.name FROM account RIGHT JOIN study_group ON account.group_id = study_group.id;

-- 交叉連接
SELECT account.id, account.name, study_group.name FROM account CROSS JOIN study_group;

子查詢

當一個查詢是另一個查詢的條件時,稱之為子查詢。

例子:

SELECT * FROM account WHERE id IN (SELECT follow.follower_id FROM follow);

樹狀圖

有思維導(dǎo)圖版本,可以點擊查看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容