有思維導(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巾陕、表的修改
增加字段(一列)
ALTER TABLE 表名 ADD COLUMN 列名 數(shù)據(jù)類型;
刪除字段(一列)
ALTER TABLE 表名 DROP COLUMN 列名;
更改字段(列)的數(shù)據(jù)類型
ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 數(shù)據(jù)類型;
給列添加|刪除default
ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 7.77
表的重命名
ALTER TABLE 表名 RENAME TO 新表名;
更改字段名
ALTER TABLE 表名 RENAME 列名 TO 新列名;
更改約束
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、表的約束
NOT NULL 約束(非空約束)
默認情況下纪他,列可以保存NULL值鄙煤。如果不希望一列具有NULL值,那么需要在此列指定NULL約束定義茶袒。 NOT NULL約束總是寫成一列約束梯刚。
NULL并不相同,因為沒有數(shù)據(jù)薪寓,而是它代表著未知的數(shù)據(jù)亡资。UNIQUE 約束 (唯一約束)
唯一約束防止兩個記錄在一個特定的列具有相同的值∠虿妫可以為一個锥腻,也可以為多個PRIMARY KEY 約束(主鍵約束)
數(shù)據(jù)庫表中的PRIMARY KEY約束唯一標識每條記錄∧富眩可以有多個UNIQUE的列瘦黑,但在一個表中只有一個主鍵。在設(shè)計數(shù)據(jù)庫表的主鍵是重要的奇唤。主鍵是唯一的ID幸斥。FOREIGN KEY 約束(外鍵約束)
外鍵約束指定一列(或一組列)中的值的值必須符合另一個表中出現(xiàn)的一些行。我們說這是維持兩個相關(guān)的表之間的引用完整性咬扇。它們被稱為外鍵甲葬,因為約束是外部的,也就是說表的外部冗栗。有時也被稱為外鍵引用的關(guān)鍵演顾。其他約束
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,....)
- 注意
- 自增唯一的字段,盡量不要給賦值
- 默認值如果不需要賦值的話胎源,不需要給賦值
- 如果賦值棉钧,需要注意字段類型和格式
例子:
-- 按順序插入
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ù)的查詢
語法:
全部查詢
SELECT * FROM 表名
單列查詢
SELECT 列名 FROM 表名
多列查詢
SELECT 列名1, 列名2 FROM 表名
帶條件查詢
SELECT * FROM 表名 WHERE 列1=值1 AND 列2>值2 OR 列3 NOT IN (值1, 值2) AND 列4 LIKE 'abc%' ;
分組排序匯總查詢
以列1分組,并匯總万栅、排序
SELECT 列1, SUM(列2) FROM 表名 WHERE 列3 = 值 GROUP BY 列1 HAVING SUM(列2) > 10 ORDER BY SUM(列2) DESC;
限制條目查詢
獲取第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;
連表查詢
Union 聯(lián)合查詢
UNION 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集。INNER JOIN(內(nèi)連接)
(INNER) JOIN(內(nèi)連接)贡羔,也成為自然連接廉白,根據(jù)兩個或多個表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)乖寒。外連接
與內(nèi)連接相比猴蹂,即使沒有匹配行,也會返回一個表的全集楣嘁。
1)LEFT OUTER JOIN磅轻,簡稱LEFT JOIN珍逸,左外連接(左連接)
2)RIGHT JOIN(right outer join)右外連接(右連接)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)圖版本漱病,可以點擊查看。