顯示具有 Hannibal@sql-bod-idv-tw 標籤的文章。 顯示所有文章
顯示具有 Hannibal@sql-bod-idv-tw 標籤的文章。 顯示所有文章

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

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