數(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;

子查詢

當(dāng)一個查詢是另一個查詢的條件時,稱之為子查詢撮躁。

例子:

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

樹狀圖

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末把曼,一起剝皮案震驚了整個濱河市杨帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤军,老刑警劉巖注盈,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叙赚,居然都是意外死亡当凡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門纠俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沿量,“玉大人,你說我怎么就攤上這事冤荆∑釉颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵钓简,是天一觀的道長乌妒。 經(jīng)常有香客問我,道長外邓,這世上最難降的妖魔是什么撤蚊? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮损话,結(jié)果婚禮上侦啸,老公的妹妹穿的比我還像新娘。我一直安慰自己丧枪,他們只是感情好光涂,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拧烦,像睡著了一般忘闻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恋博,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天齐佳,我揣著相機與錄音私恬,去河邊找鬼。 笑死炼吴,一個胖子當(dāng)著我的面吹牛本鸣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缺厉,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼永高,長吁一口氣:“原來是場噩夢啊……” “哼隧土!你這毒婦竟也來了提针?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤曹傀,失蹤者是張志新(化名)和其女友劉穎辐脖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皆愉,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜价,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幕庐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片久锥。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖异剥,靈堂內(nèi)的尸體忽然破棺而出瑟由,到底是詐尸還是另有隱情,我是刑警寧澤冤寿,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布歹苦,位于F島的核電站,受9級特大地震影響督怜,放射性物質(zhì)發(fā)生泄漏殴瘦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一号杠、第九天 我趴在偏房一處隱蔽的房頂上張望蚪腋。 院中可真熱鬧,春花似錦姨蟋、人聲如沸辣吃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽神得。三九已至,卻和暖如春偷仿,著一層夾襖步出監(jiān)牢的瞬間哩簿,已是汗流浹背宵蕉。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留节榜,地道東北人羡玛。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像宗苍,于是被迫代替她去往敵國和親稼稿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容