2021-01-26

SQL : INSERT INTO

SQL : INSERT INTO  將資料插到資料表內

目標:
  1. 使用CREATE TABLE  ... AS SELECT ...,複製資料表MediaType的結構及MediaTypeId=1的這筆資料,到資料表MediaType2。
  2. 使用 INSERT INTO table (field1, field2, ...) VALUES (value1, value2, ...); 插入1筆資料。
  3. 使用 INSERT INTO table VALUES (value1, value2, ...); 插入2筆資料。
  4. 使用 INSERT INTO table (field1, field2, ...)  SELECT fielda, fieldb, ... FROM table_a WHERE ...; 插入1筆資料。
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入所要建立測試資料表MediaType2及插入資料的執行指令
    CREATE TABLE MediaType2 AS
        SELECT MediaTypeId, Name 
        FROM MediaType
        WHERE MediaTypeId=1;
    
    INSERT INTO MediaType2 (MediaTypeId,Name) 
        VALUES (2,'Protected AAC audio file');
    
    INSERT INTO MediaType2 
        VALUES (3,'Protected MPEG-4 video file');
    
    INSERT INTO MediaType2 
        SELECT MediaTypeId,Name FROM MediaType 
        WHERE MediaTypeId=4 OR MediaTypeId=5;
    

  4. 執行SQL指令:(F9) Execute SQL (選取要執行的部分SQL指令,按F9,會只執行選取的部分)
    先執行 CREATE TABLE MediaType2,再執行一次INSERT INTO MediaType2 ...
  5. Status : 確認SQL指令 執行無誤


  6. 查看執行結果:

SQL : WITH RECURSIVE ... REPLACE INTO ...

SQL : WITH RECURSIVE ... REPLACE INTO ...
INSERT INTO 不會做資料插入前的檢查,發生錯誤就中斷程式。
在程式開發的過程,時常會遇到一個情境:
如果資料不存在,就插入一筆資料;如果資料已經存在,就更新這一筆資料。
INSERT INTO 衍申的語法:REPLACE INTO 剛好可以滿足這個需求,但資料表必須有主鍵PRIMARY KEY,資料會透過所提供的PRIMARY KEY鍵值,來決定要增加一筆資料?還是更新這筆資料?

目標:
  1. 延續上一篇:SQL : WITH RECURSIVE ... INSERT INTO ... https://sql.bod.idv.tw/2021/01/sql-with-recursive-insert-into.html ,這完成INSERT INTO 相關的資料後,這這裡繼續做REPLACE INTO的動作。
  2. 在 tabWith 已 INSERT INTO : (1,'a'), (2,'aa'), (3,'aaa'), (4,'aaaa'), (5,'aaaaa') 的情況下,要再繼續REPLACE INTO : (4,'b'), (5,'bb'), (6,'bbb'), (7,'bbbb'), (8,'bbbbb')
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入SQL的執行指令
    WITH  RECURSIVE cte AS (
        SELECT 4 AS c1, 'b' AS c2
        UNION ALL
        SELECT c1 + 1, c2 || 'b' 
        FROM cte
        WHERE c1 < 8
    ) 
    REPLACE INTO tabWith (score, grade) SELECT c1, c2 FROM cte;
  4. 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令 WITH RECURSIVE ... REPLACE INTO ... 執行無誤
  5. 查看執行結果
    score=4, (4,'aaaa') 已更新為 (4, 'b')
    score=5, (5,'aaaaa') 已更新為 (5, 'bb')
    已插入 (6,'bbb'), (7,'bbbb'), (8,'bbbbb')

SQL : WITH RECURSIVE ... INSERT INTO ...

SQL : WITH RECURSIVE ... INSERT INTO ...

目標:
  1. 先建立一個空資料表格tabWith,有兩個資料欄位 score INT PRIMARY KEY, grade NVARCHAR(120)
  2. 用WITH RECURSIVE的方式,插入五筆資料:(1,'a'), (2,'aa'), (3,'aaa'), (4,'aaaa'), (5,'aaaaa')
作法:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入所要建立測試資料表tabWith的執行指令
    CREATE TABLE tabWith (
        score   INTEGER        NOT NULL,
        grade   NVARCHAR(120),
        PRIMARY KEY (score)
    );
    

  4. 執行SQL指令:(F9) Execute SQL
  5. Status : 確認SQL指令 CREATE TABLE tabWith 執行無誤


  6. 用WITH RECURSIVE的方式,插入五筆資料:(1,'a'), (2,'aa'), (3,'aaa'), (4,'aaaa'), (5,'aaaaa')
    在Query分頁中輸入WITH RECURSIVE INSERT INTO的SQL指令
    WITH  RECURSIVE cte AS (
        SELECT 1 AS c1, 'a' AS c2
        UNION ALL
        SELECT c1 + 1, c2 || 'a' 
        FROM cte
        WHERE c1 < 5
    ) 
    INSERT INTO tabWith (score, grade) SELECT c1, c2 FROM cte;
    
  7. 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令WITH RECURSIVE INSERT INTO 執行無誤

SQL : INSERT INTO 語法(Syntax)格式

SQL : INSERT INTO 的語法(Syntax),有三個基本的語法:
  • 將指定的資料值插入資料表格內:
    INSERT INTO 資料表名稱 [(資料欄位名稱, ...)] VALUES (資料欄位值, ...);

  • 將SELECT執行結果插入資料表格內:
    INSERT INTO 資料表名稱 [(資料欄位名稱, ...)]  SELECT執行結果;

  • 以資料表結構定義時所設定的預設值插入資料表格內:
    INSERT INTO 資料表名稱 [(資料欄位名稱, ...)]DEFAULT VALUES;
INSERT INTO的 語法格式:
[ WITH [ RECURSIVE ] cte-table-name AS (select-stmt), ...]
{INSERT | REPLACE | INSERT OR REPLACE | insert-type ... } INTO 
   資料表名稱  [AS 別名] [( 資料欄位名稱,...)] { [VALUES (資料值or運算式,) | select-stmt | DEFAULT VALUES}
ON CONFLICT [(索引欄位, ... ) | [WHERE 條件式] ]
DO { NOTHING | UPDATE SET 欄位名稱=運算式, ... [ WHERE 條件式 ]}

  1. cte : common table expression
  2. select-stmt : select statements
  3. insert-type : INSERT, REPLACE, INSERT OR REPLACE, INSERT OR ROLLBACK, INSERT OR ABORT, INSERT OR FAIL, INSERT OR IGNORE
  4. 如果主鍵的對應值存在,就REPLACE指定的資料值;如果主鍵的對應值不存在,就插入這筆資料。有效的利用這個語法規則,可以大大的降低程式設計的複雜度。

 參考資料:

2021-01-24

SQL : ALTER TABLE

SQL : ALTER TABLE
ALTER TABLE 修改資料表的名稱、資料欄位名稱,或新增資料欄位

ALTER TABLE 的 SQL語法(Syntax)格式:
ALTER TABLE 資料表名稱
{RENAME TO 新資料表名稱 | RENAME [COLUMN] 資料欄位名稱 TO 資料欄位新名稱 | ADD [COLUMN] 資料欄位定義};

  1. ALTER TABLE 可以 修改 資料表名稱、資料欄位名稱,增加資料欄位等。
  2. SQLite 3.25.0 起,將原先必須使用設定調整的作法(PRAGMA legacy_alter_table = ON 或 sqlite3_db_config() 的 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE選項)才可以啟用ALTER TABLE的功能,改為可以直接使用的指令。
    目前最新的SQLite版本 3.34.1(2021.01.20。
以下將說明,修改Emp_Id_Name資料表結構:
資料表名稱:Emp_Id_Name → EmpIdName
資料欄位名稱:EmployeeId → EmpId
增加資料欄位:IDCardNo CHAR(10)

ALTER TABLE SQL指令的使用:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. Emp_Id_Name資料表,可以透過以下指令製造:
    CREATE TABLE Emp_Id_Name AS 
      SELECT EmployeeId, LastName, FirstName FROM Employee;
    

  4. 先修改資料表名稱,在Query分頁中輸入所要執行的指令
     ALTER TABLE Emp_Id_Name RENAME TO EmpIdName;
  5. 執行SQL指令:(F9) Execute SQL,Status : 確認SQL指令執行無誤
  6. 因目前 SQLite Studio 的版本 v3.2.1,是基於SQLite 3.24.0開發的,如前所述SQLite 3.25.0後,在ALTER TABLE上以加強功能上的實作,所以接下來用sqlite3 3.29.0(或更新的版本)來完成資料欄位的修改新增。
  7. 回SQLiteStudio查看一下,確認完成修改


  8. SQL Features That SQLite Does Not Implement (https://sqlite.org/omitted.html)
    SQLite雖然已提供幾乎所的功能特性,但並沒有實作標準SQL的每一項功能特性,以ALTER TABLE的功能,僅提供:RENAME TABLE, ADD COLUMN, 及 RENAME COLUMN的支援,DROP COLUMN, ALTER COLUMN, 及 CONSTRAINT則不在功能支援的範圍內。
參考資料:
SQL As Understood By SQLite : ALTER TABLE  https://sqlite.org/lang_altertable.html

SQL : DROP TABLE

SQL : DROP TABLE
DROP TABLE 除了會清除資料表內的資料,也會將這個資料表在資料庫中的結構定義資料一併清除,整個資料表都清光光。

DROP TABLE的語法(Syntax)格式:
DROP TABLE [IF EXISTS] 資料表名稱;

  1. 可以增加 [IF EXISTS] 檢查,確認資料表存在,再予清除。
  2. DELETE 跟 DROP 不一樣,DELETE只清除資料,不清除資料表的結構定義。

以下在測試資料庫下執行,預計刪除TestWind資料庫下的Emp_Id_Name資料表:
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. Emp_Id_Name資料表,可以透過以下指令製造:
    CREATE TABLE Emp_Id_Name AS 
      SELECT EmployeeId, LastName, FirstName FROM Employee;
    

  4. 在Query分頁中輸入所要執行的指令
    DROP TABLE Emp_Id_Name;

  5. 執行SQL指令:(F9) Execute SQL
  6. Status : 確認SQL指令執行無誤

參考資料:
SQL As Understood By SQLite : DROP TABLE  https://sqlite.org/lang_droptable.html

SQL : CREATE TABLE ... AS SELECT ...

SQL : CREATE TABLE ... AS SELECT ... 使用SELECT的結果建立資料表,並將條件過濾後的查詢結果,匯入新建立的資料表中。
  1. 測試環境的資料庫,可以參閱以下網址連結來建立:
  2. 選取要作業的資料庫對象(TestWind),開啟(SQL Editor):Tools → Open SQL Editor
  3. 在Query分頁中輸入所要執行的指令
    CREATE TABLE Album_20190920 as 
      SELECT AlbumId, Title FROM Album WHERE Title like 'A%';
    

  4. 執行SQL指令:(F9) Execute SQL
  5. Status : 確認SQL指令執行無誤


  6. 確認資料表Album_20190920已建立,
    包含兩個資料欄位:AlbumId, Title,
    只匯入A開頭的資料


  7. 注意:查看DLL分頁
    PRIMARY KEY 等限制條件(Constraints)、結構定義的內容,不會被匯入。
    資料型態:INTEGER → 被轉換成 INT,NVARCHAR(160) →被轉換成 TEXT

用SQLiteStudio跨資料庫複製或搬移資料表內容

SQLite Studio 資料表的複製、移動功能,可以讓SQLite 的資料庫間,快速地達到資料複製(copy)或搬移(move)的需求,尤其是在測試資料的過程,更能感受到這個功能的妙用。

  1. 這個學習範例所需的資料庫環境,可以參閱:
  2. 來源資料庫:Chinook,有11個資料表,每個資料表都有資料
    目的資料庫:TestWind ,沒有資料表、沒有資料
  3. 選取Chinook 的 Artist 資料表,按住滑鼠左鍵,拖曳到 TestWind 的 Tables 位置,放開左鍵。
    勾選:include data, include indexes, include triggers
    點選:Copy選項


  4. Referenced tables的提醒:
    SQLite Studio 提醒 Artist 這個資料表被 Albumn, PlaylistTrack, Track, InvoiceLine 等資料 Reference了,提示:要不要一併匯入這些資料表?
    這裡選擇:No,只Copy Artist資料表
  5. 確認複製成功。

2021-01-23

用SQLite Studio來CREATE TABLE

自行輸入CREATE TABLE的指令,在對CREATE TABLE指令,還不是很清楚孰悉的情況下,是有一些難度的,SQLite Studio這時候,可以發揮極佳的輔助功能,輕鬆地幫忙使用者CREATE TABLE。
完成資料表建立後,還可以檢視取得CREATE這個TABLE的SQL指令內容。

這裡CREATE TABLE2的目標,是要完成一個像下圖內容的資料表:
資料表名稱:Album,包含三個資料欄位:AlbumId, Title, ArtistId,... 詳細資料如下表 ...
>
  1. 選取要執行這段指令的資料庫,可以參閱:
  2. Structure → Create a table
    或 點選 工具列上的『Create a table』


  3. 輸入表格名稱(Table name):Album
    按下『Add Column(Ins)』鈕


  4. 新增資料欄位:
    以AlbumId為例,輸入 Column name,選取Data type ,
    限制(Constraints)定義的選項,有:Primary Key, Foreign Key, Unique, Check conditions, Not NULL, Collate, Default等,每一個選項都可以按『Configure』鈕,進行進一步的設定。

  5. 新增資料欄位 :
    Column name : ArtistId 的 Foreign Key 設定
  6. Commit structure change,儲存表格新增。


  7. 切換到DDL分頁,查看剛剛透過經由程式頁面操作所得到的DDL SQL指令碼

    CREATE TABLE Album (
        AlbumId  INTEGER        CONSTRAINT PK_Album PRIMARY KEY
                                NOT NULL
                                DEFAULT NULL,
        Title    NVARCHAR (160) NOT NULL
                                DEFAULT NULL,
        ArtistId INTEGER        REFERENCES Artist (ArtistId) ON DELETE NO ACTION
                                                             ON UPDATE NO ACTION
                                NOT NULL
                                DEFAULT NULL
    );
    


SQL : CREATE TABLE IF NOT EXISTS table_name

在CREATE TABLE 之前,先確認目前連線的資料庫,確定不存在所要CREATE的資料表,這在透過程式管理的資料庫管控上,可以避免程式coding的複雜度,減少例外狀況的排出。
簡單的加上 IF NOT EXISTS 即可輕鬆地達到事先檢查的目的。

CREATE TABLE IF NOT EXISTS Artist (
    ArtistId INTEGER        NOT NULL,
    Name     NVARCHAR (120),
    CONSTRAINT PK_Artist PRIMARY KEY (ArtistId)
);

在SQLite Studio執行這個CREATE TABLE IF NOT EXISTS指令:
  1. 選取要執行這段指令的資料庫,可以參閱:
  2. Tools → Open SQL Editor
  3. 在Query分頁中輸入所要執行的指令
  4. (F9) Execute SQL
  5. Status : 確認SQL指令執行無誤


SQL : CREATE TABLE語法(Syntax)格式

SQL : CREATE TABLE語法(Syntax)格式:

CREATE TABLE [IF NOT EXISTS] 資料表名稱  (
    欄位名稱 [資料型態] [NULL | NULL] [AUTO_INCREMENT] [DEFAULT 預設值] [定義整合限制] ,
    ...,
    PRIMARY KEY (欄位名稱, ... )
    UNIQUE (欄位名稱, ... )
    FOREIGN KEY (欄位名稱, ... )  REFERENCES  資料表(欄位名稱, ... )
        [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
        [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
    CHECK(限制的檢查條件)
);
  1. SQL程式碼採用自由格式,不限制一行只接受多少個字元,也不限制如何斷行。
  2.  [IF NOT EXISTS] :先確認資料表不存在,再予CREATE;可以不使用這個判斷選項。
  3. PRIMARY KEY:用來定義某一或某些欄位為主鍵,不可為空值
  4. UNIQUE:用來定義某一或某些欄位具有唯一的索引值,可以有空值
  5. FOREIGN KEY:用來定義某一或某些欄位為外部鍵
  6. REFERENCES 資料表(欄位名稱, ... ) :外鍵所要參考的資料表、資料欄位。
  7. [NULL | NOT NULL]:可以為空值(NULL)、不可為空值(NOT NULL)選其中一項,或都不選。
  8. [AUTO_INCREMENT]:當資料型態宣告為INT整數時,如果使用[AUTO_INCREMENT]選項,當新增一筆資料時,該欄位資料,會自動加一作為該欄位的資料值。
  9.  [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]:可使用或不使用ON DELETE,但選用後,必須選用{NO ACTION | CASCADE | SET DEFAULT | SET NULL}的其中一項。
  10. CHECK 用來額外的檢查條件
CREATE TABLE的SQL範例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
CREATE TABLE [Artist]
(
    [ArtistId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Name] NVARCHAR(120)
);

CREATE TABLE [Album]
(
    [AlbumId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Title] NVARCHAR(160)  NOT NULL,
    [ArtistId] INTEGER  NOT NULL,
    FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId]) 
        ON DELETE NO ACTION ON UPDATE NO ACTION
);

參考資料:
  1. SQL As Understood By SQLite : CREATE TABLE
    https://sqlite.org/lang_createtable.html 
  2. CREATE TABLE (Transact-SQL) 
    https://docs.microsoft.com/zh-tw/sql/t-sql/statements/create-table-transact-sql?view=sql-server-2017

用SQLiteStudio建立SQL學習環境

2021-01-22

SQL指令及主要分類(DDL, DML, DCL, TCL)

SQL指令及主要分類(DDL, DML, DCL, TCL):
  •     DDL (Data Definition Language)
    • 用來定義資料庫結構的指令,例如:綱要schemas, 資料表tables ...。
    • CREATE, DROP, ALTER, RENAME, TRUNCATE
  •     DML (Data Manipulation Language)
    • 用來處理資料庫中的資料的指令,一般資料的新增、修改、刪除、查詢等運算,都是屬於DML指令類。
    • SELECT, INSERT, UPDATE, DELETE
  •     DCL (Data Control Language)
    • 用來控制管理資料庫的使用權限及相關安全設定的管控指令。
    • GRANT, REVOKE
  •     TCL is Transaction Control Language
    • 管理資料庫中交易的指令。
    • START TRANSACTION (BEGIN, BEGIN WORK), COMMIT, ROLLBACK

SQLite3的資料類型

  • SQLite的官網提到,目前大部份的SQL資料庫引擎(除了SQLite之外)都使用靜態、嚴格的資料類型。 使用靜態類型時,資料值的數據類型由儲存這項資料的資料欄位型態決定。
    SQLite的資料類型,使用更通用的動態類型系統(dynamic type system)。 在SQLite中,資料值的資料類型與資料值本身相關聯,而不是與存放資料的資料欄位型態相關聯。 SQLite的動態類型系統向下相容其他資料庫引擎中更常見的靜態類型系統,因為在靜態類型資料庫上工作的SQL語句應該在SQLite中以相同的方式工作。 但是,SQLite中的動態類型允許它執行傳統的嚴格類型資料庫中無法實現的操作。

  • 每一個存放在SQLite資料庫中的資料值,都具有下列的資料型態中的一個資料類型:
    1. NULL : 空值。
    2. INTEGER : 整數。是帶有正負值的整數,可能會使用1, 2, 3, 4, 6, 8個位元組(Bytes)來存放資料,實際使用的Bytes數,以存放的值來決定。
    3. REAL : 浮點數值。以 8 Bytes來存放IEEE浮點數。
    4. TEXT : 文字字串值。以資料庫的文字編碼方式:UTF-8, UTF-16BE, UTF-16LE來儲存資料。
    5. BLOB : 二進位大型物件(Binary Large OBject)。
    6. 沒有Boolean值的資料儲存型別,SQLite3用0來儲存False(假),用1來儲存True(真)。
    7. 沒有日期(Date)、時間(Time)的資料儲存型別,SQLite內建的日期和時間函數,將日期和時間存儲為TEXT,REAL或INTEGER值。
      如果是TEXT,存為ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
      如果是REAL,是記錄一個Julian的日期數,是西元前4714年11月24日格林威治中午以來的天數。
      如果是INTEGER,是紀錄1970-01-01 00:00:00 UTC以來的秒數(Unix Time)。
  • 近似型別(Type Affinity)
    SQLite3資料庫中的每一個資料欄位,都會被指定為下列型別之一的近似型別:TEXT, NUMERIC, INTEGER, REAL, BLOB。
    欄位近似型別的決定規則(Determination Of Column Affinity),規則依序如下:
    1. 宣告的資料類型包含字串“INT”,視為INTEGER 的近似型別。
    2. 宣告的資料類型包含字串“CHAR”、“CLOB”或“TEXT”,視為TEXT的近似型別。 VARCHAR / NVARCHAR 類型包含字串“CHAR”,視為TEXT的近似型別。
    3. 宣告的類型包含字串“BLOB”、或未指定類型,視為BLOB的近似型別。
    4. 宣告的類型包含字串“REAL”、“FLOA”或“DOUB”,視為REAL的近似型別。
    5. 上述似規則以外,視為NUMERIC的近似型別。
  • 近似型別歸類舉例:
    CREATE TABLE宣告或CAST5轉換式 歸類 規則
    INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 INTEGER i
    CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT,CLOB TEXT ii
    BLOB, no datatype specified BLOB iii
    REAL, DOUBLE, DOUBLE PRECISION, FLOAT REAL iv
    NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME NUMERIC v
  • SQLite Studio資料欄位可以選擇的選項:
    BIGINT, BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, DOUBLE, INTEGER, INT, NONE, NUMERIC, REAL, STRING, TEXT, VARCHAR

參考資料:Datatypes In SQLite Version 3  https://www.sqlite.org/datatype3.html

取得SQLite版本的Chinook範例資料庫

下載取得Chinook範例資料庫:
https://github.com/lerocha/chinook-database/blob/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite

簡化資料庫名稱,把Chinook_Sqlite.sqlite 修改為 Chinook.sqlite
開啟SQLite Studio,以SQLite Studio開啟資料庫Chinook.sqlite :
把資料庫檔案拖曳到SQLite Studio的區塊內,放開滑鼠,會開啟Database小視窗,按下OK鈕,就可以成功開啟這個資料庫了。


可以透過SQLite Studio查看Chinook.sqlite的資料表、資料欄位、Primary Key、索引(Index)、資料內容、Constraint(限制條件) ...
將資料庫檔案拖曳到Database區塊內後,Database→Connect to the database


Chinook資料庫內,共包含11個資料表:Album, Artist, Customer, Employee, Genre, Invoice, InvoiceLine, MediaType, Playlist, PlaylistTrack, Track,每個資料表內所包含的資料欄位,說明如下:(以Chinook_sqlite.sql的CREATE TABLE來查看資料表的資料欄位內容)

  • Album :
    CREATE TABLE [Album]
    (
    [AlbumId] INTEGER                 NOT NULL,
    [Title]        NVARCHAR(160)   NOT NULL,
    [ArtistId]   INTEGER                 NOT NULL,
    CONSTRAINT [PK_Album] PRIMARY KEY ([AlbumId]),
    FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])
                                 ON DELETE NO ACTION ON UPDATE NO ACTION
    );

  • Artist :
    CREATE TABLE [Artist]
    (
    [ArtistId]     INTEGER                NOT NULL,
    [Name]       NVARCHAR(120),
    CONSTRAINT [PK_Artist] PRIMARY KEY ([ArtistId])
    );

  • Customer :
    CREATE TABLE [Customer]
    (
    [CustomerId]         INTEGER               NOT NULL,
    [FirstName]           NVARCHAR(40)    NOT NULL,
    [LastName]           NVARCHAR(20)     NOT NULL,
    [Company]            NVARCHAR(80),
    [Address]               NVARCHAR(70),
    [City]                     NVARCHAR(40),
    [State]                    NVARCHAR(40),
    [Country]               NVARCHAR(40),
    [PostalCode]          NVARCHAR(10),
    [Phone]                  NVARCHAR(24),
    [Fax]                      NVARCHAR(24),
    [Email]                  NVARCHAR(60)     NOT NULL,
    [SupportRepId]     INTEGER,
    CONSTRAINT [PK_Customer] PRIMARY KEY ([CustomerId]),
    FOREIGN KEY ([SupportRepId]) REFERENCES [Employee] ([EmployeeId]) ON DELETE NO ACTION ON UPDATE NO ACTION
    );

  • Employee :
    CREATE TABLE [Employee]
    (
    [EmployeeId]        INTEGER               NOT NULL,
    [LastName]          NVARCHAR(20)    NOT NULL,
    [FirstName]          NVARCHAR(20)    NOT NULL,
    [Title]                   NVARCHAR(30),
    [ReportsTo]          INTEGER,
    [BirthDate]          DATETIME,
    [HireDate]           DATETIME,
    [Address]            NVARCHAR(70),
    [City]                  NVARCHAR(40),
    [State]                 NVARCHAR(40),
    [Country]            NVARCHAR(40),
    [PostalCode]       NVARCHAR(10),
    [Phone]               NVARCHAR(24),
    [Fax]                   NVARCHAR(24),
    [Email]               NVARCHAR(60),
    CONSTRAINT [PK_Employee] PRIMARY KEY ([EmployeeId]),
    FOREIGN KEY ([ReportsTo]) REFERENCES [Employee] ([EmployeeId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION
    );

  • Genre :
    CREATE TABLE [Genre]
    (
    [GenreId]       INTEGER                 NOT NULL,
    [Name]          NVARCHAR(120),
    CONSTRAINT [PK_Genre] PRIMARY KEY ([GenreId])
    );

  • Invoice :
    CREATE TABLE [Invoice]
    (
    [InvoiceId]                   INTEGER                     NOT NULL,
    [CustomerId]               INTEGER                     NOT NULL,
    [InvoiceDate]              DATETIME                  NOT NULL,
    [BillingAddress]          NVARCHAR(70),
    [BillingCity]                NVARCHAR(40),
    [BillingState]               NVARCHAR(40),
    [BillingCountry]          NVARCHAR(40),
    [BillingPostalCode]     NVARCHAR(10),
    [Total]                          NUMERIC(10,2)         NOT NULL,
    CONSTRAINT [PK_Invoice] PRIMARY KEY ([InvoiceId]),
    FOREIGN KEY ([CustomerId]) REFERENCES [Customer] ([CustomerId])
                                  ON DELETE NO ACTION ON UPDATE NO ACTION
    );

  • InvoiceLine :
    CREATE TABLE [InvoiceLine]
    (
    [InvoiceLineId]           INTEGER              NOT NULL,
    [InvoiceId]                  INTEGER              NOT NULL,
    [TrackId]                     INTEGER              NOT NULL,
    [UnitPrice]                  NUMERIC(10,2)    NOT NULL,
    [Quantity]                   INTEGER               NOT NULL,
    CONSTRAINT [PK_InvoiceLine] PRIMARY KEY ([InvoiceLineId]),
    FOREIGN KEY ([InvoiceId]) REFERENCES [Invoice] ([InvoiceId])
                                 ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId])
                                 ON DELETE NO ACTION ON UPDATE NO ACTION
    );

  • MediaType :
    CREATE TABLE [MediaType]
    (
    [MediaTypeId]      INTEGER                 NOT NULL,
    [Name]                 NVARCHAR(120),
    CONSTRAINT [PK_MediaType] PRIMARY KEY ([MediaTypeId])
    );

  • Playlist :
    CREATE TABLE [Playlist]
    (
    [PlaylistId]            INTEGER                  NOT NULL,
    [Name]                 NVARCHAR(120),
    CONSTRAINT [PK_Playlist] PRIMARY KEY ([PlaylistId])
    );
  • PlaylistTrack :
    CREATE TABLE [PlaylistTrack]
    (
    [PlaylistId]            INTEGER                 NOT NULL,
    [TrackId]               INTEGER                 NOT NULL,
    CONSTRAINT [PK_PlaylistTrack] PRIMARY KEY ([PlaylistId], [TrackId]),
    FOREIGN KEY ([PlaylistId]) REFERENCES [Playlist] ([PlaylistId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION
    );
  • Track
    CREATE TABLE [Track]
    (
    [TrackId]               INTEGER                   NOT NULL,
    [Name]                  NVARCHAR(200)     NOT NULL,
    [AlbumId]              INTEGER,
    [MediaTypeId]       INTEGER                 NOT NULL,
    [GenreId]               INTEGER,
    [Composer]           NVARCHAR(220),
    [Milliseconds]       INTEGER                  NOT NULL,
    [Bytes]                  INTEGER,
    [UnitPrice]            NUMERIC(10,2)        NOT NULL,
    CONSTRAINT [PK_Track] PRIMARY KEY ([TrackId]),
    FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([GenreId]) REFERENCES [Genre] ([GenreId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY ([MediaTypeId]) REFERENCES [MediaType] ([MediaTypeId])
                                ON DELETE NO ACTION ON UPDATE NO ACTION
    );

2021-01-21

範例資料庫(Sample Database)

使用現成的範例資料庫,可以有效幫助SQL語法的學習,微軟在GitHub上釋出多個範例資料庫(Sample Database):
  • Official Microsoft GitHub Repository containing code samples for SQL Server
    https://github.com/microsoft/sql-server-samples
    https://github.com/microsoft/sql-server-samples/tree/master/samples/databases  
    • wide-world-importers
    • contoso-data-warehouse
    • AdventureWorks
    • Northwind 
    • Pubs
  • 範例資料庫的資料庫關聯圖(database diagram)(實體關聯圖 ER Diagram)
    • AdventureWorks OLTP Database Diagram
    • https://improveandrepeat.com/wp-content/uploads/2018/12/AdvWorksOLTPSchemaVisio.png
    • An ER Diagram for the Northwind Sample Database
      https://documentation.red-gate.com/dms6/files/49646072/49646073/3/1559655630714/ERDiagramNorthwind.png
    • An ER Diagram for the PUBS Sample Database
      https://documentation.red-gate.com/dms6/files/49646075/49646076/2/1559655574834/ERDiagramPUBS.png

除了上述微軟提供的範例資料庫,還有一個常用來替代Northwind的資料庫:Chinook
Chinook : Sample database for SQL Server, Oracle, MySQL, PostgreSQL, SQLite, DB2
下載取得Chinook的資料:
https://github.com/lerocha/chinook-database/tree/master/ChinookDatabase/DataSources


Chinook 範例資料庫的Database diagram:
http://schemaspy.org/sample/relationships.html 
http://schemaspy.org/sample/diagrams/summary/relationships.real.compact.png 
http://schemaspy.org/sample/diagrams/summary/relationships.real.large.png 

SQLite管理工具SQLite Studio


資料更新:
2019-12-30起,SQLiteStudio的原始碼及程式下載,已經移至GitHub
https://github.com/pawelsalawa/sqlitestudio/releases
如需要舊版的資料:
(3.x.x) : https://www.dropbox.com/sh/ao4nz2qjfsz2yuy/AABwiiss3do7n0wNecuk-uyna?dl=0
(2.x.x) : https://www.dropbox.com/sh/iyilxtepgswpdlm/AADmYlJ4QRYWn_eo9u4fPn0Aa?dl=0


原內容:
之前介紹的SQLite-tools是文字介面的管理程式,還有圖形介面的DB Browser for SQLite,但我最常用的是SQLite Studio,現在就來介紹一下SQLite Studio:

SQLite Studio官方網站:https://sqlitestudio.pl/index.rvt
SQLite Studio下載網誌:https://sqlitestudio.pl/index.rvt?act=download

提供Windows / Linux / MacOSX 安裝版即可攜版
有提供SHA-256,下載後先比對一下再使用,用起來會更放心。


以Windows portable SQLiteStudio-3_2_1.zip為例:(解壓縮後,可以直接使用)


SQLite Studio 主要的功能簡介:
  • 主畫面:
  • Database→Connect to database
  • Database→Disconnect from database
  • Database→Add a database
  • Database→Edit the database
  • Database→Remove the database
  • Database→Export the database
    可以匯出的格式:HTML / JSON / PDF / SQL / XML
    可以指定文字編碼(text encoding)
  • Database→Convert database type
    以開啟SQLite3為例,可以指定轉換為:SQLite2 / SQLCipher / System.Data.SQLite / WxSQLite3
  • Database→Vacuum
  • Database→Integrity check
  • Database→Refresh selected database schema
  • Database→Refresh all database schema
  • Structure→Create a table
  • Structure→Edit the table
  • Structure→Delete the table
  • Structure→Create an index
  • Structure→Edit the index
  • Structure→Create a trigger
  • Structure→Edit the trigger
  • Structure→Delete the trigger
  • Structure→Create a view
  • Structure→Edit the view
  • Structure→Delete the view
  • View→Databases
  • View→Status
  • View→Database toolbar
  • View→Structure toolbar
  • View→Tools
  • View→Window list
  • View→View toolbar
  • View→Tile windows
  • View→Tile windows horizontally
  • View→Tile windows vertically
  • View→Cascade window
  • View→Close selected windows
  • View→Close all windows but selected
  • View→Close all windows
  • View→Restore recently closed window
  • View→Rename selected windows
  • View→Window list
  • Tools→Open SQL editor
  • Tools→Open DDL history
  • Tools→Open SQL functions editor
  • Tools→Open collations editor
  • Tools→Import 
  • Tools→Export
  • Tools→Open configuration dialog

  • Help→User Manual
  • Help→SQLite documentation
  • Help→Open home page
  • Help→Open forum page
  • Help→Check for updates
  • Help→Report a bug
  • Help→Propose a new feature
  • Help→Bugs and feature requests
  • Help→Licence
  • Help→About

SQLite管理工具DB Browser for SQLite

SQLite-tools雖然是官方網站提供的管理工具,但文字界面的操作方式,操作上總有親和力不足的狀況,還好除了SQLite-tools,並不是別無選擇,還可以有DB Browser for SQLite, SQLite Studio...,這裡先介紹DB Browser for SQLite。

DB Browser for SQLite官方網站:https://sqlitebrowser.org/
DB Browser for SQLite的下載網址:https://sqlitebrowser.org/dl/
提供各種作業系統(Windows, Mac, Linux ...) 安裝、免安裝、可攜程式的下載,或線上更新安裝的指令做法等。


以.zip (no installer) for 64-bit Windows 為例:(解壓縮後,可以直接使用)


DB Browser 主要的功能簡介:
  • 主畫面→Database Structure
  • 主畫面→Browse Data
  • 主畫面→Edit Pragmas
    選項:Auto Vacuum / Automatic Index / Case Sensitive Like / Checkpoint Full FSYNC / Foreign Keys / Full FSYNC / Ignore Check Contraints / Journal Mode / Journal Size Limit / Locking Mode / Max Page Count / Page Size / Recursive Triggers / Secure Delete / Sychronous / Temp Store / User Version / WAL Auto Checkpoint
  • 主畫面→Execute SQL
  • 檔案→新建資料庫
  • 檔案→New In-Memory Database
  • 檔案→打開資料庫
  • 檔案→Open Database Read Only ...
  • 檔案→Attach Database ...
  • 檔案→關閉資料庫
  • 檔案→Write Changes
  • 檔案→Revert Changes
  • 檔案→匯入→Database from SQL file ...
  • 檔案→匯入→Table from CSV file ...
  • 檔案→匯出→Database to SQL file ...
  • 檔案→匯出→Table(s) as CSV file ...
  • 檔案→匯出→Table(s) to JSON ...
  • 檔案→Open Project...
  • 檔案→Save Project...
  • 檔案→最近開啟過的五個資料庫檔案
  • 檔案→退出
  • 編輯→Create Table...
  • 編輯→Modify Table...
  • 編輯→Delete Table...
  • 編輯→Create Index...
  • 編輯→偏好選項...
  • 編輯→偏好選項...→General
  • 編輯→偏好選項...→資料庫
    SQL to execute after opening database,這個功能可以紀錄資料庫的開啟歷程
  • 編輯→偏好選項...→Data Browser
  • 編輯→偏好選項...→SQL
  • 編輯→偏好選項...→擴充套件
  • 編輯→偏好選項...→Remote
  • 查看→SQL Log
  • 查看→Plot
  • 查看→DB Schema
  • 查看→Edit Database Cell
  • 查看→Remote
  • 查看→資料庫工具列
  • 查看→Extra DB Toolbar
  • 查看→Project Toolbar
  • Tools→Compact Database...
  • Tools→Load Extension...
  • Tools→Integrity...
  • Tools→Quick Integrity Check
  • Tools→Foreign-Key Check
  • Tools→Optimize
  • Help→What's This?
  • Help→Website
  • Help→Wiki
  • Help→Bug Report
  • Help→Feature Request...
  • Help→Nonate on Patreon...
  • Help→About