目錄
一、什么是SQL?
1、SQL的概念
2、SQL的特點
3、SQL發展簡史
二、數據庫的“SQL”
1、數據類型(常用)
數值類型
貨幣類型
布爾類型
字符類型
日期/時間類型
2、數據庫SQL基本語法
創建用戶(CREATE USER)
創建和管理數據庫
創建表(CREATE TABLE)
向表中插入數據
更新表中數據
查看數據
刪除表中數據
三、參考資料
-------------------------------------------------------------------------------------------------------------------------
一、什么是SQL?1、SQL的概念
結構化查詢語言(SQL)是用于訪問和處理關系型數據庫的標準計算機語言。
SQL提供了各種任務的語句,包括:
SQL語言由用于處理數據庫和數據庫對象的命令和函數組成:
2、SQL的特點3、SQL發展簡史
SQL發展簡史如下:
//注:
ANSI是美國國家標準學會( )的英文簡稱,成立于1918年。
ISO:國際標準化組織( for )。
IEC:國際電工委員會( )。
//
二、數據庫的“SQL”
數據庫支持的SQL標準,默認支持SQL2、SQL3和SQL4的主要特性。當然了, 一般說到數據庫的SQL語句,就離不開兩個方面: 一是數據類型,二是sql語句基本語法。下文就此簡單闡述一下:
1、數據類型(常用)
數據庫支持的數據類型涵蓋非常廣, 幾乎包含所有形式的數據類型,如:數值類型、貨幣類型、布爾類型、字符類型、二進制類型、日期/時間類型、幾何類型、網絡地址類型、位串類型、文本搜索類型、UUID類型、JSON/JSONB類型、HLL數據類型、范圍類型、對象標識符類型、偽類型、列存表支持的數據類型、XML類型、賬本數據庫使用的數據類型等。 但是實際業務場景中大部分類型用到的比較少,具體遇到時可參考官方文檔說明。
下文參考并整理了日常應用開發中常用的主要數據類型,主要包含:數值類型、貨幣類型、布爾類型、字符類型、日期/時間類型等。
數值類型
表1:整數數據類型
說明:TINYINT、、INTEGER、BIGINT和INT16類型存儲各種范圍的數字,也就是整數。試圖存儲超出范圍以外的數值將會導致錯誤。
常用的類型是INTEGER,因為它提供了在范圍、存儲空間、性能之間的最佳平衡。一般只有取值范圍確定不超過的情況下,才會使用類型。而只有在INTEGER的范圍不夠的時候才使用BIGINT,因為前者相對快得多。
表2:任意精度型
說明:與整數類型相比,任意精度類型需要更大的存儲空間,其存儲效率、運算效率以及壓縮比效果都要差一些。在進行數值類型定義時,優先選擇整數類型。當且僅當數值超出整數可表示最大范圍時,再選用任意精度類型。
使用Numeric/Decimal進行列定義時,建議指定該列的精度p以及標度s。
表3:序列整型
說明:
、SERIAL、和類型不是真正的類型,只是為在表中設置唯一標識做的概念上的便利。因此,創建一個整數字段,并且把它的缺省數值安排為從一個序列發生器讀取。應用了一個NOT NULL約束以確保NULL不會被插入。在大多數情況下用戶可能還希望附加一個UNIQUE或PRIMARY KEY約束避免意外地插入重復的數值,但這個不是自動的。最后,將序列發生器從屬于那個字段,這樣當該字段或表被刪除的時候也一并刪除它。目前只支持在創建表時候指定SERIAL列,不可以在已有的表中,增加SERIAL列。另外臨時表也不支持創建SERIAL列。因為SERIAL不是真正的類型,也不可以將表中存在的列類型轉化為SERIAL。
表4:浮點類型
貨幣類型
貨幣類型存儲帶有固定小數精度的貨幣金額
布爾類型
說明:“真”值的有效文本值是:TRUE、't'、'true'、'y'、'yes'、'1' 、'TRUE'、true、整數范圍內1~2^63-1、整數范圍內-1~-2^63。
“假”值的有效文本值是:FALSE、'f'、'false'、'n'、'no'、'0'、0、'FALSE'、false。
使用TRUE和FALSE是比較規范的用法(也是SQL兼容的用法)。
字符類型
日期/時間類型
2、數據庫SQL基本語法
SQL 語法主要分為三個類型DDL、DML、DCL,對應13個動詞:
DDL(data )數據定義語言,用戶定義和管理sql數據庫中所有對象的語言。 主要命令:create、alter、drop等
DML(data )數據操作語言。 主要命令:select、update、insert、delete等
DCL(date control )數據庫控制功能。主要命令:grant、deny、revoke、commit、、等
常見語法示例,主要包括: 創建用戶、創建和管理數據庫、創建表、插入數據、更新數據、查看數據、刪除數據等
創建用戶(CREATE USER)
--創建用戶jim,登錄密碼為。
=# CREATE USER jim '';
說明:必須至少8個字符,且至少包含3種字符(要符合常規密碼安全度設置要求)。
--下面語句與上面的等價。
=# CREATE USER kim BY '';
--如果創建有“創建數據庫”權限的用戶,則需要加關鍵字。
=# CREATE USER dim '';
--將用戶jim的登錄密碼由修改為Abcd@123。
=# ALTER USER jim BY 'Abcd@123' REPLACE '';
說明:新密碼不能使用之前用過的密碼。
--為用戶jim追加權限。
=# ALTER USER jim ;
--將的值設置為on, 設置成功后,在下一會話中生效。
=# ALTER USER jim SET TO on;
--重置jim的參數。
=# ALTER USER jim RESET ;
--鎖定jim帳戶。
=# ALTER USER jim ACCOUNT LOCK;
--刪除用戶。
=# DROP USER kim CASCADE;
=# DROP USER jim CASCADE;
=# DROP USER dim CASCADE;
說明:CASCADE,刪除用戶關聯的所有對象。
創建和管理數據庫
--使用如下命令創建一個新的數據庫db_tpcc。
=# CREATE db_tpcc;
--查看數據庫
使用\l元命令查看數據庫系統的數據庫列表。
=# \l
使用如下命令通過系統表查詢數據庫列表。
=# SELECT datname FROM ;
注:數據庫名稱遵循SQL標識符的一般規則。當前角色自動成為此新數據庫的所有者。
如果一個數據庫系統用于承載相互獨立的用戶和項目,建議把它們放在不同的數據庫里。
如果項目或者用戶是相互關聯的,并且可以相互使用對方的資源,則應該把它們放在同一個數據庫里,但可以規劃在不同的模式中。模式只是一個純粹的邏輯結構,某個模式的訪問權限由權限系統模塊控制。
創建數據庫時,若數據庫名稱長度超過63字節,server端會對數據庫名稱進行截斷,保留前63個字節,因此建議數據庫名稱長度不要超過63個字節。
--修改數據庫
用戶可以使用如下命令修改數據庫屬性(比如:owner、名稱和默認的配置屬性)。
使用以下命令為數據庫設置默認的模式搜索路徑。
=# ALTER db_tpcc SET TO ,public;
--使用如下命令為數據庫重新命名。
=# ALTER db_tpcc RENAME TO ;
--刪除數據庫
用戶可以使用DROP 命令刪除數據庫。這個命令刪除了數據庫中的系統目錄,并且刪除了磁盤上帶有數據的數據庫目錄。用戶必須是數據庫的owner或者系統管理員才能刪除數據庫。當有人連接數據庫時,刪除操作會失敗。刪除數據庫時請先連接到其他的數據庫。
使用如下命令刪除數據庫:
=# DROP db_tpcc;
創建表(CREATE TABLE)
--表是建立在數據庫中的,在不同的數據庫中可以存放相同的表。甚至可以通過使用模式在同一個數據庫中創建相同名稱的表。創建表前請先規劃存儲模型。
=# CREATE TABLE
integer,
char(5),
char(6),
char(8)
);
當結果顯示為如下信息,則表示創建成功。
CREATE TABLE
其中 、、和是表的字段名,integer、char(5)、char(6)和char(8)分別是這四字段名稱的類型。
向表中插入數據
--向表中插入數據前,意味著表已創建成功。
向表中插入一行:
數據值是按照這些字段在表中出現的順序列出的,并且用逗號分隔。通常數據值是文本(常量),但也允許使用標量表達式。
=# INSERT INTO (, , ) VALUES (3769, 'hello', 'Grace');
如果用戶已經知道表中字段的順序,也可無需列出表中的字段。例如以下命令與上面的命令效果相同。
=# INSERT INTO VALUES (3769, 'hello', 'Grace');
如果用戶不知道所有字段的數值,可以忽略其中的一些。沒有數值的字段將被填充為字段的缺省值。例如:
=# INSERT INTO (, ) VALUES (3769, 'Grace');
=# INSERT INTO VALUES (3769, 'hello');
用戶也可以對獨立的字段或者整個行明確缺省值:
=# INSERT INTO (, , ) VALUES (3769, 'hello', DEFAULT);
=# INSERT INTO DEFAULT VALUES;
如果需要在表中插入多行,請使用以下命令:
=# INSERT INTO (, , ) VALUES
(6885, 'maps', 'Joes'),
(4321, 'tpcds', 'Lily'),
(9527, 'world', 'James');
如果需要向表中插入多條數據,除此命令外,也可以多次執行插入一行數據命令實現。但是建議使用此命令可以提升效率。
如果從指定表插入數據到當前表,例如在數據庫中創建了一個表的備份表,現在需要將表中的數據插入到表中,則可以執行如下命令。
=# CREATE TABLE
integer,
char(5),
char(6),
char(8)
);
=# INSERT INTO SELECT * FROM ;
從指定表插入數據到當前表時,若指定表與當前表對應的字段數據類型之間不存在隱式轉換,則這兩種數據類型必須相同。
刪除備份表
=# DROP TABLE CASCADE;
在刪除表的時候,若當前需刪除的表與其他表有依賴關系,需先刪除關聯的表,然后再刪除當前表。
更新表中數據
修改已經存儲在數據庫中數據的行為叫做更新。用戶可以更新單獨一行,所有行或者指定的部分行。還可以獨立更新每個字段,而其他字段則不受影響。
使用UPDATE命令更新現有行,需要提供以下三種信息:
SQL通常不會為數據行提供唯一標識,因此無法直接聲明需要更新哪一行。但是可以通過聲明一個被更新的行必須滿足的條件。只有在表里存在主鍵的時候,才可以通過主鍵指定一個獨立的行。
建立表和插入數據的步驟請參考創建表和向表中插入數據。
需要將表中為9527的地域重新定義為9876:
=# UPDATE SET = 9876 WHERE = 9527;
這里的表名稱也可以使用模式名修飾,否則會從默認的模式路徑找到這個表。SET后面緊跟字段和新的字段值。新的字段值不僅可以是常量,也可以是變量表達式。
比如,把所有的值增加100:
=# UPDATE SET = + 100;
在這里省略了WHERE子句,表示表中的所有行都要被更新。如果出現了WHERE子句,那么只有匹配其條件的行才會被更新。
在SET子句中的等號是一個賦值,而在WHERE子句中的等號是比較。WHERE條件不一定是相等測試,許多其他的操作符也可以使用。
用戶可以在一個UPDATE命令中更新更多的字段,方法是在SET子句中列出更多賦值,比如:
=# UPDATE SET = 'Admin', = 'Local' WHERE = 4421;
批量更新或刪除數據后,會在數據文件中產生大量的刪除標記,查詢過程中標記刪除的數據也是需要掃描的。故多次批量更新/刪除后,標記刪除的數據量過大會嚴重影響查詢的性能。建議在批量更新/刪除業務會反復執行的場景下,定期執行VACUUM FULL以保持查詢性能。
查看數據
使用系統表查詢數據庫所有表的信息。
=# SELECT * FROM ;
使用gsql的\d+命令查詢表的屬性。
=# \d+ ;
執行如下命令查詢表的數據量。
=# SELECT count(*) FROM ;
執行如下命令查詢表的所有數據。
=# SELECT * FROM ;
說明:插數據時,沒有數值的字段將被填充為字段的缺省值。
執行如下命令只查詢字段的數據。
=# SELECT FROM ;
執行如下命令過濾字段的重復數據。
=# SELECT ( ) FROM ;
執行如下命令查詢字段為3869的所有數據。
=# SELECT * FROM WHERE = 3869;
執行如下命令按照字段進行排序。
=# SELECT * FROM ORDER BY ;
刪除表中數據
在使用表的過程中,可能會需要刪除已過期的數據,刪除數據必須從表中整行的刪除。
SQL不能直接訪問獨立的行,只能通過聲明被刪除行匹配的條件進行。如果表中有一個主鍵,用戶可以指定準確的行。用戶可以刪除匹配條件的一組行或者一次刪除表中的所有行。
使用DELETE命令刪除行,如果刪除表中所有為3869的記錄:
=# DELETE FROM WHERE = 3869;
如果執行如下命令之一,會刪除表中所有的行。
=# DELETE FROM ;
或
=# TABLE ;
全表刪除的場景下,建議使用,不建議使用delete。
刪除創建的表:
=# DROP TABLE ;
三、參考資料:
1.官方文檔3.0.0 開發指南:
2.SQL實踐操作經驗
*請認真填寫需求信息,我們會在24小時內與您取得聯系。